Redis缓存穿透、雪崩、击穿
正常处理流程
先读cache,如果数据命中则返回;如果数据未命中则读db;将db中读取出来的数据入缓存。
1 | private Map cache = new ConcrrentHashMap(); |
常见问题
缓存穿透
穿透原因
访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉
穿透解决方案
- 采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤
- 拦截器,id<=0的直接拦截。
- 从cache和db都取不到,可以将key-value写为key-null,设置较短过期时间,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。
缓存击穿
击穿原因
一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。
击穿解决方案
- 设置热点数据永远不过期
- 加互斥锁
缓存雪崩
雪崩原因
大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩
雪崩解决方案
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
- 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中
- 设置热点数据永远不过期