0

1.Redisconfig配置类如下:

@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缓存用于@cacheable注解:

@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、生成重复的键值对: redis数据库中缓存了两个值相同的键值对。重复的key内容的区别在于它们包含了enhancerbyspringcglib,已经测试了很多次。其他方法相同:

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

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

我想知道为什么以及如何解决它?帮我!!!

4

0 回答 0