线上发现有缓存删除失败的情况,线下模拟执行了下,发现redisTemplate.delete(key)返回false,网上查了下,说可能是set和delete用的不一致导致,比如set的时候用的,RedisTemplate<String, String>,而delete的时候用的RedisTemplate,确认两边使用一致后,在delete前get了一下数据,发现是能获取到的,说明delete那边的RedisTemplate没问题。
最终找到的原因是,两边使用序列化不一致导致的,set的时候,使用的StringRedisSerializer,而delete使用了redis默认的序列化方式RedisSerializer,将两边序列化方式设置一致即可。
Springboot中设置如下
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.session.data.redis.config.ConfigureRedisAction;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws Exception {
RedisTemplate<String, String> redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(redisKeySerializer());
redisTemplate.setValueSerializer(redisKeySerializer());
redisTemplate.setHashKeySerializer(redisKeySerializer());
redisTemplate.setDefaultSerializer(redisKeySerializer()); //其他的都是之前设置的,设置这个即可,将默认的序列化方式改成StringRedisSerializer
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public RedisSerializer<?> redisKeySerializer() {
return new StringRedisSerializer();
}
@Bean
public static ConfigureRedisAction configureRedisAction() {
return ConfigureRedisAction.NO_OP;
}
}