项目场景:
在redis中设置一个key值,定时任务通过redis中缓存的时间判断任务是否已经执行过。
redisTemplate.opsForValue().set("schedule:task:nextExecTime:T20231124093052107YDaheKmL","2023-12-27 03:47:02");
问题描述
通过redistemplate设置key值,但是后面通过key值,获取不到执行时间,导致任务没有执行
@Autowired private RedisTemplate redisTemplate;
redisTemplate.opsForValue().set("schedule:task:nextExecTime:T20231124093052107YDaheKmL","2023-12-27 03:47:02");
原因分析:
在操作redis时默认使用JdkSerializationRedisSerializer 来进行序列化。spring操作redis是在jedis客户端基础上进行的,而jedis客户端与redis交互的时候协议中定义是用byte类型交互,看到spring-data-redis中RedisTemplate<K, V>在操作的时候k,v是泛型对象,而不是byte[]类型的,
这样导致的一个问题就是,如果不对RedisTemplate进行设置,spring会默认采用defaultSerializer = new JdkSerializationRedisSerializer();这个方法来对key、value进行序列化操作,JdkSerializationRedisSerializer它使用的编码是ISO-8859-1
解决方案:
1、在使用时,规定redisTemplate的类型
@Autowired private RedisTemplate<String,String> redisTemplat
2、添加 redis 配置类,配置使用的序列化方式
@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisTemplate redisTemplate) { RedisSerializer stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer); redisTemplate.setStringSerializer(stringSerializer); redisTemplate.setValueSerializer(stringSerializer); redisTemplate.setHashKeySerializer(stringSerializer); redisTemplate.setHashValueSerializer(stringSerializer); return redisTemplate; } }