为什么要使用缓存

典型场景

  1. 读多写少的场景

memorycache 单台机器 QPS能达到 50000

  1. 需要复杂计算后得出数据,存储系统无能为力

如计算论坛实时在线人数

使用缓存常见的问题和解法

缓存击穿

  1. 读取不存在的key

key不存在,当高并发请求,所有请求均打到DB

解法:不存在的key,存放一个空值

  1. 缓存的生成耗时较长

典型场景:商品分页数据,后面的页数访问较少,缓存容易失效。此时高并发的请求均打到DB

解法:并没有比较好的解法,做好监控

缓存雪崩

雪崩指 缓存失效后 引起系统性能急剧下降的情况

但缓存失效后,对于业务量较大的系统,大量的高并发请求到缓存,任意一个线程同时去请求到DB(都不知道其他线程已经有在请求DB,并更新缓存),导致DB压力较大,一连串反应,影响系统稳定性

解法:

  1. 更新锁
    采用分布式锁,保障只有一个线程去请求到DB并更新缓存。

分布式锁的实现方式要研究一下 https://www.cnblogs.com/austinspark-jessylu/p/8043726.html

  1. 后台定时更新
    所有请求都不达到DB,而是通过定时任务定时更新缓存,防止失效。
  • 问题:定时任务更新不及时导致数据不一致怎么办?

对于需要即时数据一致的情况,可以在数据更新后 消息通知触发定时任务运行;

其他解法:

双key策略:要缓存的key的过期时间为t,key1没有过期时间,当缓存读取不到key的内容时就返回key1的内容,然后触发一个事件同时更新key和key1

缓存穿透和雪崩什么区别

我的理解:

穿透是表述了现象:缓存没生效,达到了DB;雪崩更强调结果,导致系统一连串稳定性问题;
穿透可能会导致雪崩

缓存热点

对单个key 的访问过大,导致单机问题;

解法:

  • 冗余存储,分散查询。比如缓存key为key1,冗余存储多份数据 key1, key2, key3,存储value相同;上层查询策略上采用随机路由查询;