| 问题 | 描述 | 解决方案 |
|---|---|---|
| 缓存穿透 | 查询一个不存在的数据,不能命中缓存,导致每次请求都要到DB去查询,可能导致数据库崩溃 | 1.查询返回的数据为空,仍把这个空结果进行缓存,但过期时间会比较短; 2.布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对DB的查询 |
| 缓存击穿 | 对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好有大量对这个key的并发请求,可能导致大量并发的请求瞬间把数据库压垮 | 1.使用互斥锁:当缓存失效时,先使用如Redis的setnx去设置一个互斥锁,当操作成功返回时再进行数据库操作并回设缓存,否则重试get缓存的方法; 2.永远不过期:物理不过期,但逻辑过期(后台异步线程去刷新) |
| 缓存雪崩 | 设置缓存时采用了相同的过期时间,缓存在某一时刻同时失效,导致大量请求访问数据库。 与缓存击穿的区别:雪崩是多key,击穿是单key缓存 |
1.分散缓存失效时间:在原有的失效时间基础上增加一个随机值; 2. 使用互斥锁,当缓存数据失效时,保证只有一个请求能够访问到数据库,并更新缓存,其他线程等待并重试 |
浙公网安备 33010602011771号