HBZRedis的缓存雪崩+穿透+击穿解决
缓存雪崩
- 现象: 大量热点key设置了相同过期时间,导致同时过期 或 Redis宕机, 使请求瞬间大量打到DB上
- 解决方案:
(1). 搭建高可用集群环境,防止某台Redis服务宕机
(2). 存数据的过期时间设置随机数,防止同一时间大量数据过期
(3). 设置key永远不过期, 定时任务去更新
(4). 选择【分布式缓存 本地缓存】结合使用,防止Redis宕机或大量key过期
缓存穿透
- 现象:查询一个不存在的数据,由于缓存不命中,直接请求DB了。如果大量查询不存在的数据,DB爆了
- 解决方案:
(1). 接口层增加【数据合理性】校验, 比如转账金额不能是负数, 年龄不能是4位数或负数
(2). 缓存如果取不到数据, 在数据库中也没有取到,就将key-value写为key-null,设置短暂过期时间,防止黑客对着一个key疯狂访问导致DB瘫痪
(3). 布隆过滤器(类似白名单):查询数据之前,先去布隆过滤器看看是否存在,bit位图上是否是1 - 布隆过滤器解决方案步骤:
a. 将所有要【缓存的数据】经过处理后存储布隆过滤器中, 即对应的bit位图上是1
b. 当外部发起请求时,首先会对请求参数进行hash处理,获取相应hash值
c. 根据hash值计算出【位数组】中的位置, 如果全部计算的hash值对应的bit存储都是1,则表示数据在合理中
d. 再从缓存读出,缓存失效则从数据库取出, 少数误判不影响,可以把误判的value设置位null, 加上短暂的过期时间(误判原因: 可能因为hash冲突,导致hash重复,但实际数据并不存在,布隆过滤器误以为存在)
e. 如果计算的hash对应的bit存储存在0, 表示数据不合理,直接返回数据不存在,不查询缓存和DB
f. 如果布隆过滤器认为值不存在,那么值一定是不存在的,无需查询缓存 也 无需查询DB
缓存击穿
- 现象: 当【某个】热点key过期了,此时大量用户访问,导致直接打到DB上了。和雪崩的区别就在于击穿是某个key过期,而雪崩是大量key同时过期
- 解决方案:
(1). 设置缓存不过期,定时任务去更新
(2). 多级缓存,nginx前置短期缓存, 然后redis设置不过期
(3). 设置互斥锁,比如该key不存在时,第一个请求会去访问DB并重新放入缓存,并且加锁。当第一个请求把数据重新放入缓存后,将锁解开,其他请求通过redis去拿数据(缺点:加入同步锁,性能就会有影响)。如果DB也没有,则直接给缓存设置成null, 并加上短暂的过期时间(比如600s),防止全部击穿到DB。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfkkibc
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13