介绍一下Redis缓存雪崩、缓存穿透、缓存击穿,如何解决这些问题?
缓存雪崩:大量 Key 在同一时间失效,导致大量请求达到数据库上对数据库造成影响。
解决方案:
- 给每个 Key 设置不同的随机的 ddl。
- 不设置过期时间,改为定期更新缓存。
缓存穿透:访问缓存和数据库都不存在的数据。常见于黑客构造不存在的 id 进行攻击。
解决方案:
- 缓存空值:如果数据在缓存和数据库中都不存在,就在缓存中存入一个空值,下次直接返回这个空值。
- 布隆过滤器:在 Redis 前面加一个布隆过滤器。对于不存在的数据会直接返回。
缓存击穿:数据在缓存中不存在,在数据库中存在。常见于某个热点 Key 突然过期,导致大量请求打到数据库上。
解决方案:
- 使用互斥锁(分布式锁)。
- 设置逻辑过期字段。
如何保证数据库和缓存的一致性?
使用 Cache Aside(旁路缓存)这种策略,它可以分为读策略和写策略。
- 读策略:查询数据时,先查询缓存,缓存有则直接返回数据。缓存没有,则到数据库中查,返回数据的同时在缓存中存入数据。
- 写策略:更新数据时,先更新数据库,再删除缓存。
这种做法能大概率避免并发安全问题,最大限度地保证数据库和缓存的一致性。
317

被折叠的 条评论
为什么被折叠?



