分布式锁结合SpringCache( 四 )

categoryEntities = baseMapper.selectList(new QueryWrapper().eq("parent_cid", 0));return categoryEntities;}3、将redis缓存数据数据保存为json格式//可以读取Properties文件@EnableConfigurationProperties(CacheProperties.class)@EnableCaching@Configurationpublic class MyCacheConfig {@BeanRedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();//Key和Value JSON序列化方式config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer()));//使用默认才会读出properties文件中的配置 , 自定义时roperties文件中的配置不生效CacheProperties.Redis redisProperties = cacheProperties.getRedis();if (redisProperties.getTimeToLive() != null) {config = config.entryTtl(redisProperties.getTimeToLive());}if (redisProperties.getKeyPrefix() != null) {config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());}if (!redisProperties.isCacheNullValues()) {config = config.disableCachingNullValues();}if (!redisProperties.isUseKeyPrefix()) {config = config.disableKeyPrefix();}return config;}}4、SpringCache能解决的事以及不足:(1)读模式缓存击穿:查询一个不存在的数据 。 解决:缓存空数据( ache-null-values=true)
缓存雪崩:大量key刚好过期 。 解决:加随机时间和过期时间( spring.cache.redis.time-to-live=3600000)
缓存击穿:大量并发同时查询一个正好过期的数据 。 解决:加锁( @Cacheable(cacheNames = "category", key = "'level1Categorys'", sync = true) )
(2)写模式【分布式锁结合SpringCache】SpringCache并未做太多处理
总结:读多写少 , 即时性、、一致性要求不搞的数据使用SpringCache


推荐阅读