Redis缓存穿透和缓存雪崩问题

缓存穿透

即黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上,从而数据库连接异常。解决方法:
  1. 布隆过滤器(推荐)。内部维护一系列合法有效的key,迅速判断出请求所携带的Key是否合法有效,如果不合法,则直接返回。它不一定精确,跟哈希函数的好坏有关,当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。
  2. 缓存空对象。指一个请求发送过来,如果此时缓存中和数据库都不存在这个请求所要查询的相关信息,那么数据库就会返回一个空对象,并将这个空对象和请求关联起来存到缓存中,当下次还是这个请求过来的时候,这时缓存就会命中,就直接从缓存中返回这个空对象,这样可以减少访问数据库的压力,提高当前数据库的访问性能。

缓存击穿

指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。解决:
  1. 互斥锁。就是让一个线程回写缓存,其他线程等待回写缓存线程执行完,重新读缓存即可。分布式环境下可以使用分布式锁。
  2. 热点数据不过期。缓存在物理上永远不过期,用一个异步的线程更新缓存。

缓存雪崩

指缓存中数据大批量到过期时间,而查询数据量巨大,请求直接落到数据库上,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。解决:
  1. 给缓存的失效时间,加上一个随机值,避免集体失效。
  2. 使用互斥锁,但是吞吐量会明显下降。
  3. 双缓存策略。主缓存:有效期按照经验值设置,设置为主读取的缓存,主缓存失效后从数据库加载最新值。备份缓存:有效期长,获取锁失败时读取的缓存,主缓存更新时需要同步更新备份缓存。

总结

图片来自:https://baijiahao.baidu.com/s?id=1681691345944318719&wfr=spider&for=pc

参考:
https://baijiahao.baidu.com/s?id=1681691345944318719&wfr=spider&for=pc
https://blog.csdn.net/QiuHaoqian/article/details/109154315

posted @   学海无涯#  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示