现象:
单一项目,通过代码层,对缓存进行存储和读取,正常。但通过可视化界面客户端或是终端链接界面 get key 查询不到。
原因及解决方案:
存储时,没有对存储的信息做序列化,一般在网上参考的时候都会复制,部分人会遗忘。加入如下代码即可
/**
* redis配置类
*
*/
@SuppressWarnings("unchecked")
@Configuration
@Slf4j
public class RedisConfiguration {
/**
* springboot2.x 使用LettuceConnectionFactory 代替 RedisConnectionFactory
* application.yml配置基本信息后,springboot2.x RedisAutoConfiguration能够自动装配
* LettuceConnectionFactory 和 RedisConnectionFactory 及其 RedisTemplate
*
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
log.info("redisTemplate:" + redisTemplate.toString());
return redisTemplate;
}
}
该现象在单一项目下,不使用可视化客户端或是终端界面操作时,无任何感知。
但在服务之间互相调用情况下,会异常明显。如:明明在A服务存了key值为authUserSign的键值,但在B服务却获取不到,排查名称和配置均无报错。
原因是在没配置序列化的情况下,redis本身不是按初始设置的键入库,而是乱码键值。序列化后问题解决。