缓存雪崩+击穿+穿透
缓存雪崩
目前电商首页以及热点数据都会去做缓存 ,一般缓存都是定时任务去刷新,或者是查不到之后去更新的,定时任务刷新就有一个问题:缓存雪崩。
缓存雪崩是指在大QPS时,缓存刚好失效或更新,大量请求打到DB上,导致DB扛不住挂掉。
解决方案
- 错开KEY的失效时间
setRedis(Key,value,time + Math.random() * 10000);
- 热点数据永不过期,保持和数据库一致性更新
缓存穿透
指缓存和数据库中都没有的数据,但却产生了数据库的查询。比如数据库的 id 都是1开始自增上去的,如果发起为id值为 -1 的数据或 id 为特别大不存在的数据。
解决方案
- 接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等。
- 从缓存取不到的数据,在数据库中也没有取到,这时也可以将对应Key的Value对写为null、位置错误、稍后重试这样的值具体取啥问产品,或者看具体的场景,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。
- 可以根据场景结合uri和请求参数做缓存。
- nginx代理层限制同IP高频率访问
缓存击穿
缓存击穿和缓存雪崩一样,不过前者是点,后者是面。缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。
解决方案
- 热点数据永不过期,保持和数据库一致性更新。
- 加上互斥锁。缓存更新时上锁,此时进来的请求可以先sleep堵塞起。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。