缓存开始
SpringCache
-
使用spring-cache注解, 存储数据注意事项
-
当使用@Cacheable缓存了数据后, 有别的方法进行修改时,
#缓存该方法的值 @Cacheable(value = "category",key = "#root.methodName")
1, 可以使用@CacheEvict删除对应的值, 让@Cacheable的方法重新载入redis
#字符串需要加 单引号, 不然他以为是表达式 @CacheEvict(value = {"category"},key = "'getCatalogJson'")
2, 使用@Caching删除多个缓存
@Caching( evict = { @CacheEvict(value = {"category"},key = "'getCatalogJson1'") ,@CacheEvict(value = {"category"},key = "'getCatalogJson2'") } )
3, 根据分区删除数据, 删除某个分区下的所有数据
@CacheEvict(value = "category",allEntries = true)
双写模式
-
使用@CachePut, 将更新的数据在redis中再存储一份, 即删除之前的又写入当前的, 双写模式
@CachePut @CacheEvict(value = { "category"},key = "'getCatalogJson'") @Transactional @Override public ... updateCascade(CategoryEntity category) { this.updateById(category); categoryBrandRelationService.updateCategory(category.getCatId(),category.getName()); return ...; }
读模式
-
缓存穿透:
就是大量请求查询一个null数据;spring-cache解决方式:
#redis是否缓存空值, 解决缓存穿透 spring.cache.redis.cache-null-values=true
缓存击穿:
大量请求同时查询一个正好过期的数据;解决方式: 加锁, 默认spring-cache是不加锁的, 可以通过sync指定, 注意如果数据可能存在数据击穿, 再加sync
spring-cache解决方式:
@Cacheable(value = "category",key = "#root.methodName",sync = true)
缓存雪崩:
大量的key同时过期;spring-cache解决方式: 让key有随机不同的过期时间
#redis中key的存活时间, 单位是ms spring.cache.redis.time-to-live=3600000
写模式
1, 读写加锁
2, 引入cannal, 动态更新mysql
3, 读多写多, 直接去查询mysql
redis存数据总结
常规数据(读多写少, 即时性, 一致性要求不高的数据), 可以使用spring-cache存储, 写的数据加过期时间, 按点更新
特殊数据: 要即时性, 一致性要求高的数据, 使用cannal同步, 加读写锁
Redis分布式锁
-
(可以参考谷粒商城gulimall的CategoryServiceImpl的阶段1, 2, 3, 4笔记)
引入redission, 解决分布式锁, 主要是使用Redisson的LockWatchdogTime看门狗
简单引入: