缓存穿透,雪崩,热点key问题

背景&概念

使用缓存时,经常会出现以下几种情况,

击穿:访问缓存没有key得数据,直接命中DB

雪崩:缓存同时实效,大流量访问DB

热点key:某一个key得请求量大,缓存过期时拖垮DB,或者请求到单台缓存服务器,打满带宽

 

解决方法

1.击穿的处理方法

1.1 缓存空结果+短(业务可接受)过期时间

访问请求后查询DB,没有数据缓存为空。

 

2.雪崩的处理方法

2.1 加锁查库(限流为1个)

a. 缓存无结果后获取锁

b. 只有一个线程获得锁后进行查库并更新缓存,其他线程等待

c. 唤醒其他线程

d. 其他线程重新读取缓存。失败则返回默认值

 

2.2 加队列(限流为可控数量)

类似2.1,不推荐

 

2.3 随即过期时间(推荐)

 

3. 热点key

3.1 加锁(同2.1)

 

3.2 预判断(推荐)

a. 在value中设置一个比过期时间小的时间t1

b. 读取到数据,发现t1大于当前时间,异步发送请求,上锁,更新缓存

c. 没有获取锁的异步线程直接失败。

 

3.3 预热

a. 两条路更新缓存:定时job和同步更新

 

3.4 多级缓存

a. 应用服务器上建立本地缓存

b. 定时更新远程缓存,并更新本地缓存

注:应用服务器不能是热点,需要负载均衡

 

3.5 热点动态扩散(tair)

a. 随机复制一份数据到另外节点中

需要服务端算法,有一台服务器负责,要保证此台服务器负载正常。

 

参考链接

https://www.jianshu.com/p/090c8767ffea

 

posted @ 2019-01-25 16:13  变化中寻找不变  阅读(250)  评论(0)    收藏  举报