redisTemplate的配置
1、自定义redisTemplate的配置信息,主要是序列化相关的配置
@Bean
public RedisTemplate<String, Object> redisTemplateGroup(LettuceConnectionFactory factory) {
// 配置redisTemplate
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(factory);
RedisSerializer keySerializer = new StringRedisSerializer();
//RedisSerializer valueSerializer = new GenericFastJsonRedisSerializer();//如果项目集成由fastjson,也可以集成这个序列化
RedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer();//默认是jdk的序列化方式
redisTemplate.setKeySerializer(keySerializer);
redisTemplate.setValueSerializer(valueSerializer);
redisTemplate.setHashKeySerializer(keySerializer);
redisTemplate.setHashValueSerializer(valueSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
2、RedisCacheManager 缓存配置管理器
@Bean
public RedisCacheManager cacheManager(LettuceConnectionFactory factory) {
// 配置序列化
//自定义序列化配置
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
.defaultCacheConfig()
//默认永久,指定一周,尽量不要让redis缓存永久
.entryTtl(Duration.ofDays(7))
.prefixCacheNameWith("myCache::")
//如果是空值,不缓存,高并发防止缓存击穿可以去掉此项配置
.disableCachingNullValues()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
//默认使用jdk序列化
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer()));
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(redisCacheConfiguration)
.build();
return cacheManager;
}
详细注解用法,请参考:Cache缓存注解
备注:spring-cache存在的不足及补足方法
1)、读模式:
-
缓存穿透.查询一个空数据
解决:缓存空数据,默认RedisCacheConfiguration缓存空数据
-
缓存击穿:大量并发进来同时查询一一个正好过期的数据
解决:加锁;默认是无加锁的;sync=true【@Cacheable(value = “ccc”,sync = true)】
-
缓存雪崩:大量的key同时过期
解决:不设置过期时间
2)、写模式:(缓存与数据库一致)
读写加锁。
引入Canal,感知到mysql的更新去更新数据库
读多写多,直接去数据库查询就行