爬坑系列----Redis查詢key報空指針異常,而redis中確實存在該key


現象:

  1、在A方法中根據key查詢一個list,可以獲取到相應的值

  2、在B方法中同樣調用此方法,傳入相同的key,查詢不到值,為null,報空指針異常

 

起初我也一臉懵逼,到現在雖然解決了,還是不知道根本原因

分析:

  1、key肯定是相同的,redis也有該key,  A能查出,B查不出。那就肯定是哪里不一樣。

  2、后來分析有可能是在查redis的時候,redis內部存在不同。

  3、這個時候就覺得是序列化的問題

  4、查看redis連接配置

 

@Autowired
private RedisConfigProperties redis;
@Bean
public RedisSerializer fastJson2JsonRedisSerializer() { ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
return new FastJson2JsonRedisSerializer<Object>(Object.class);
}
@Bean
public RedisConnectionFactory redisConnectionFactory() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//最大空閑接連
jedisPoolConfig.setMaxIdle(redis.getMaxIdle());
//最小空閑連接
jedisPoolConfig.setMinIdle(redis.getMinIdle());
//連接池最大阻塞等待時間
jedisPoolConfig.setMaxWaitMillis(redis.getMaxWait());
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
//主機地址
jedisConnectionFactory.setHostName(redis.getHost())
//端口
jedisConnectionFactory.setPort(redis.getPort());
//密碼
jedisConnectionFactory.setPassword(redis.getPassword());
//索引
jedisConnectionFactory.setDatabase(redis.getDatabase());
//超時時間
jedisConnectionFactory.setTimeout(redis.getTimeOut());
jedisConnectionFactory.setUsePool(true);
jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
return jedisConnectionFactory;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory, RedisSerializer fastJson2JsonRedisSerializer) {
StringRedisTemplate redisTemplate = new StringRedisTemplate(factory); redisTemplate.setConnectionFactory(redisConnectionFactory());
//redis 開啟事務
redisTemplate.setEnableTransactionSupport(true);
//hash 使用jdk 的序列化
redisTemplate.setHashValueSerializer(fastJson2JsonRedisSerializer);
//StringRedisSerializer key 序列化
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
//keySerializer 對key的默認序列化器。默認值是StringSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
// valueSerializer
redisTemplate.setValueSerializer(fastJson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}

  5、標黃部分,使用過各種序列化工具,都失敗。

  6、突然突發奇想,會不會是redis事務的問題,然后  redisTemplate.setEnableTransactionSupport(true); 將事務關閉,莫名其妙就可以了。

  7、有哪位知道根本原因,請留言告知,萬分感謝

  8、最后的配置如下

  

@Bean
public RedisSerializer fastJsonRedisSerializer(){
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
return new FastJsonRedisSerializer<Object>(Object.class);
}
@Bean
public RedisConnectionFactory redisConnectionFactory() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//最大空閑接連
jedisPoolConfig.setMaxIdle(redis.getMaxIdle());
//最小空閑連接
jedisPoolConfig.setMinIdle(redis.getMinIdle());
//連接池最大阻塞等待時間
jedisPoolConfig.setMaxWaitMillis(redis.getMaxWait());
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
//主機地址
jedisConnectionFactory.setHostName(redis.getHost());
//端口
jedisConnectionFactory.setPort(redis.getPort());
//密碼
jedisConnectionFactory.setPassword(redis.getPassword());
//索引
jedisConnectionFactory.setDatabase(redis.getDatabase());
//超時時間
jedisConnectionFactory.setTimeout(redis.getTimeOut());
jedisConnectionFactory.setUsePool(true);
jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
return jedisConnectionFactory;
}
 @Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory,RedisSerializer fastJsonRedisSerializer) {
StringRedisTemplate redisTemplate = new StringRedisTemplate(factory);
redisTemplate.setConnectionFactory(redisConnectionFactory());
//redis 開啟事務
// redisTemplate.setEnableTransactionSupport(true);

//hash 使用jdk 的序列化
// Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
// ObjectMapper om = new ObjectMapper();
// om.setVisibility( PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
// jackson2JsonRedisSerializer.setObjectMapper(om);
redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);/*new JdkSerializationRedisSerializer()*/
//StringRedisSerializer key 序列化//一般可以不做設置
//redisTemplate.setHashKeySerializer(new StringRedisSerializer());
//keySerializer 對key的默認序列化器。默認值是StringSerializer
//redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(fastJsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM