针对“浅谈Spring Data Redis读不到设进去的值”的问题,我整理了以下攻略,希望可以帮到您。
问题描述
在使用Spring Data Redis操作Redis时,发现虽然可以成功地将值设进去,但是在读取的时候却无法读取到。
原因分析
- Redis中的key过期
Redis有可能设置了自动过期,导致读取不到之前存储在Redis中的值。可以通过ttl
命令查看key的过期时间,或者使用persist
命令去除过期时间。 - 序列化问题
Spring Data Redis使用序列化的方式将Java对象序列化为Redis键值对。如果使用的序列化方式与读取时的方式不一致,就可能无法正确读取Redis中的值。可以使用Jackson2JsonRedisSerializer
、GenericToStringSerializer
等序列化器来处理序列化的问题。 - Redis配置问题
如果Redis的配置不正确,可能也会导致无法正确读取Redis中的值。可以检查Redis的配置文件,例如是否开启了AOF日志。
解决方案
- 检查key是否过期,如果过期,则使用
persist
命令去除过期时间。
String key = "test:key";
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
// 设置key值,并指定过期时间为10秒
valueOperations.set(key, "value", 10, TimeUnit.SECONDS);
// 查看key的过期时间
Long ttl = redisTemplate.getExpire(key);
System.out.println("ttl: " + ttl);
// 去除key的过期时间
redisTemplate.persist(key);
- 修改Redis的序列化方式,使用
Jackson2JsonRedisSerializer
、GenericToStringSerializer
等序列化器。
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory,
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer,
GenericToStringSerializer<Object> genericToStringSerializer) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// key的序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// value的序列化方式
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(genericToStringSerializer);
return redisTemplate;
}
/**
* Jackson序列化器
*/
@Bean
public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
serializer.setObjectMapper(mapper);
return serializer;
}
/**
* GenericToString序列化器
*/
@Bean
public GenericToStringSerializer<Object> genericToStringSerializer() {
return new GenericToStringSerializer<>(Object.class);
}
}
- 检查Redis的配置文件,例如是否开启了AOF日志。
示例
示例1
在Redis中存储一个字符串,并指定过期时间为10秒。然后再获取该值,判断是否过期,如果过期,则去除过期时间。
String key = "test:key";
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
// 设置key值,并指定过期时间为10秒
valueOperations.set(key, "value", 10, TimeUnit.SECONDS);
// 查看key的过期时间
Long ttl = redisTemplate.getExpire(key);
System.out.println("ttl: " + ttl);
// 延迟15秒,等待key过期
Thread.sleep(15000L);
// 查看key的过期时间
Long newTtl = redisTemplate.getExpire(key);
System.out.println("new ttl: " + newTtl); // 过期了,返回-2
// 去除key的过期时间
redisTemplate.persist(key);
// 再次查看key的过期时间
Long noTtl = redisTemplate.getExpire(key);
System.out.println("no ttl: " + noTtl); // 不过期了,返回-1
示例2
在Redis中存储一个Java对象,并使用Jackson2JsonRedisSerializer
序列化。然后再读取该值。
String key = "test:key";
User user = new User("张三", 20);
// 对象序列化
ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
valueOperations.set(key, user);
// 对象反序列化
User newUser = (User) valueOperations.get(key);
System.out.println(newUser.getName() + ": " + newUser.getAge()); // 输出“张三: 20”
以上就是完整的“浅谈Spring Data Redis读不到设进去的值”的攻略了,希望可以对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Spring Data Redis读不到设进去的值 - Python技术站