Redis缓存穿透、缓存击穿、缓存雪崩
# 缓存
# 缓存穿透(Cache Penetration)
描述:指缓存和数据库种都没有的数据,而用户不断发起请求。
举例:黑客用一个不存在的用户 id 获取用户信息,不论缓存还是数据库都没有,大量请求直接把数据库打死。
解决:
- 对空值缓存,如
set -999 UNKOWN
然后设置一个过期时间 - 设置布隆过滤器,将数据库种所有可能的数据哈希映射在布隆过滤器上,若请求数据的 key 不存在于布隆过滤器上,那数据一定不存在与数据库种,直接返回不存在
- 设置白名单、黑名单
# 缓存击穿(Hotspot invalid)
描述:某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求在缓存种获取不到数据就直接请求数据库,导致数据库宕机
解决:
- 缓存数据基本不发生更新,设置热点数据不过期
- 缓存数据更新不频繁,且缓存刷新的流程耗时较少,使用分布式锁保证仅有少量的请求能请求到数据库并重构缓存
- 缓存数据更品频繁或缓存刷新耗时较长,定时线程主动刷新化成或者延时过期
# 缓存雪崩(Cache Avalanche)
描述:指缓存中数据大批量到期,而查询数据量巨大,引起数据库压力过大甚至宕机。
这里 (opens new window)看到另一种说法,缓存因意外全部宕机,所有请求全部落到数据库,把数据库打死。不知道哪一种说法是对的。
区别:和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到而查数据库。
解决:
- 设置热点数据不过期
- 过期时间随机,防止同一时间大量过期
- 分布式部署时将不同数据分布在不同缓存数据中
编辑 (opens new window)
上次更新: 2023/08/20, 21:21:52