在项目中使用缓存的案例
关联维表 :本地缓存,自定义Map的软/弱引用
flink + kafka 实现 Exactly-once 语义 : 分布式缓存,基于redis实现
1. 使用缓存遇到的问题
1.1 缓存雪崩
当某一时刻发生大规模的缓存失效的情况,比如缓存服务宕机,会有大量的请求进来直接打到DB上面,DB 撑不住,挂掉。
解决方式:
-
(事前)使用集群缓存,保证缓存服务的高可用
如使用 Redis,可以使用 主从+哨兵 ,Redis Cluster 来避免 Redis 全盘崩溃
-
(事中)ehcache本地缓存 + Hystrix限流&降级,避免MySQL被打死
-
(事后)开启Redis持久化机制,尽快恢复缓存集群
1.2 缓存穿透
查询不存在数据
解决方式:
- 缓存空值,为这些key对应的值设置为null 丢到缓存里面去,后面再出现查询这个key的请求的时候,直接返回null 。
- BloomFilter
1.3. 缓存击穿
大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去
解决方式:
多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。
等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存。
1.4 热点数据集中失效
热点数据缓存失效以后,会存在大量的请求过来,然后打到