1.Redisconfig configuration classes are as follows:

@Configuration
public class RedisConfig {
    /**
     * @param factory
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // 配置序列化
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        RedisCacheConfiguration redisCacheConfiguration = config
                // 键序列化方式 redis字符串序列化
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer))
                // 值序列化方式 简单json序列化
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer))
                //不缓存Null值
                .disableCachingNullValues()
                //缓存失效 3天
                .entryTtl(Duration.ofDays(3));
        return RedisCacheManager.builder(factory).cacheDefaults(redisCacheConfiguration).build();
    }

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // value值的序列化采用fastJsonRedisSerializer
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // key的序列化采用StringRedisSerializer
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        return template;
    }

    /**
     * 重写缓存key的生成方式: 类名.方法名字&[参数列表]
     * @return
     */
    @Bean
    public KeyGenerator keyGenerator(){
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName()).append(".");//执行类名
                sb.append(method.getName()).append("&");//方法名
                sb.append(Arrays.toString(params));//参数
                return sb.toString();
            }
        };
    }
}

2. Redis cache is used for @ cacheable annotation:

@Transactional(rollbackFor = Exception.class)
    @Cacheable(cacheNames = "blog",keyGenerator = "keyGenerator")
    @Override
    public BlogVo getBlogById(int blogId) {
        Blog blog = blogDao.selectBlogById(blogId);
        if(blog == null || blog.getBlogStatus()==0){
            return null;
        }
        BlogVo blogVo = new BlogVo();
        BeanUtils.copyProperties(blog,blogVo);
        User user = userDao.selectUserById(blog.getBlogUserid());
        Type type = typeDao.selectTypeById(blog.getBlogTypeid());
        blogVo.setBlogUser(user);
        blogVo.setBlogType(type);
        return blogVo;
    }

3. Generating duplicate key value pairs: Two key value pairs with the same value are cached in redis database. The difference between duplicate key contents is that they contain enhancerbyspringcglib, which has been tested for many times. Other methods are the same:

(1) right key: blog::com.zju.sdust.weblog.service.impl.BlogServiceImpl.getBlogById&[1]

(2) Duplicate key: blog::com.zju.sdust.weblog.service.impl.BlogServiceImpl$$EnhancerBySpringCGLIB$$e965464f.getBlogById&[1]

I want to know why and how to solve it? help me!!!

0

There are 0 best solutions below