190318-Redis缓存穿透、雪崩、击穿

Redis缓存穿透、雪崩、击穿

正常处理流程

cache

先读cache,如果数据命中则返回;如果数据未命中则读db;将db中读取出来的数据入缓存。

1
2
3
4
5
6
7
8
9
private Map cache = new ConcrrentHashMap();
Object getFromCache(String key){
Object value = cache.get(key);
if(value==null){
value = getByKey(key);
cache.put(key,value);
}
return value;
}

常见问题

缓存穿透

穿透原因

访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉

穿透解决方案

  1. 采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤
  2. 拦截器,id<=0的直接拦截。
  3. 从cache和db都取不到,可以将key-value写为key-null,设置较短过期时间,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。

缓存击穿

击穿原因

一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。

击穿解决方案

  1. 设置热点数据永远不过期
  2. 加互斥锁

缓存雪崩

雪崩原因

大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩

雪崩解决方案

  1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
  2. 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中
  3. 设置热点数据永远不过期

本文参考链接

#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×