线上发现有缓存删除失败的情况,线下模拟执行了下,发现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;
    }

}
 
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐