Redis实践篇(缓存穿透、雪崩、击穿)

113 阅读2分钟

题目:高并发下缓存一致性的解决方案

  1. 延迟双删
  2. 先操作数据库,再操作reids,操作redis失败则进行多次重试,重试多次失败则告警人工处理;
  3. binlog日志订阅,异步删除

缓存穿透

  1. 提前加载数据库的数据到redis的布隆过滤器,可以基于此过滤掉不再数据库的的请求;或者也可以缓存空值、业务层面的默认值;
  2. token机制、白名单、api鉴权等机制过滤掉非法请求;

缓存击穿

  1. 热点数据预热本地缓存,数据量太大的话,放redis则设置永不过期;
  2. 非热点数据的加载,加锁,确保只有一个请求去加载;

缓存雪崩

  1. 过期时间增加一个随机时间,避免同一时刻,大批量过期;
  2. 微服务降级,对于某些非核心业务,在大量请求下,缓存查询不存在,则返回预定义信息。

布隆过滤器

布隆过滤器由一个初值都为 0 的 bit 数组和 N 个哈希函数组成,可以用来快速判断某个数据是否存在。当我们想标记某个数据存在时(例如,数据已被写入数据库),布隆过滤器会通过三个操作完成标记:

  1. 首先,使用 N 个哈希函数,分别计算这个数据的哈希值,得到 N 个哈希值;
  2. 然后,我们把这 N 个哈希值对 bit 数组的长度取模,得到每个哈希值在数组中的对应位置。
  3. 最后,我们把对应位置的 bit 位设置为 1,这就完成了在布隆过滤器中标记数据的操作。

如果数据不存在(例如,数据库里没有写入数据),我们也就没有用布隆过滤器标记过数据,那么,bit 数组对应 bit 位的值仍然为 0。

如果数据存在(存在一定的误判率),那也没关系,也只是很少的一部分请求。