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]
我想知道为什么以及如何解决它?帮我!!!