当前位置: 服务支持 >  技术文档 >  缓存问题详解:击穿、穿透与雪崩,以及Redis分布式锁的应用

缓存问题详解:击穿、穿透与雪崩,以及Redis分布式锁的应用

阅读数 73
点赞 53
copyright 著作权
article_banner

分布式锁: setnx ,redisson 并发问题
幂等问题: 落表状态,Redis

缓存击穿: 指缓存中无,db中有
原因: 一个key高并发恰好失效导致大量请求到db
方案: 加锁,自旋锁,或一个线程查db,一个线程监控(直接用Redisson分布式锁)

缓存穿透:指缓存和db中均无
原因: 一般是恶意请求
方案: 加布隆过滤,或查db无时,也设置缓存,value为某些特殊表示或"null"

雪崩:指缓存同时大量失效
原因: 大量的key同时失效,db压力加大
方案: 设置失效时间是增加随机数

问题方案文献:
https://www.jianshu.com/p/31ab9b020cd9 (图例分析)

https://blog.csdn.net/fcvtb/article/details/89478554

Redis分布式锁:

  1. setnx
    直接使用setnx,业务执行完后del释放锁
    缺点: 若setnx成功, del释放锁失败(服务不可用等),则该锁永远都不会被获取到,从而导致造成死锁
  2. setnx + expire 设置失效时间
    在1的基础上优化; 先setnx获取锁,再expire对该锁设置一个失效时间,到失效时间会自动释放锁
    缺点:
    -1. setnx + expire不是是两个方法,不能保证原子性,故会出现setnx成功,expire失败的情况,还是会导致不释放锁的问题
    -2. 可能会导致线程A释放了线程B的锁问题 (通过第4点解决)
  3. set k v ex tm nx (setnx + expire同时操作)
    在2.8版本后为set指令添加拓展参数ex和nx,保证了setnx + expire的原子性 例: set k v ex 100 nx
    缺点: 若在锁的失效时间内,业务还未执行完,即锁会导致提前释放,则其他线程就可以获取到锁,从而导致超卖问题 (失效时间设置稍大,若有2.-2问题)
image.png
  1. 用业务id作为标识
    在使用setnx时value值设置为业务id作为标识,在释放锁是get key 对比value是否一致,是则释放锁,否则抛异常回滚

事务未执行完锁已到期释放问题:使用Redissoin解决续租问题,内部已解决

分布式锁文献:
https://www.jianshu.com/p/4838f8be00c9
https://blog.csdn.net/qq_30038111/article/details/90696233 (setnx + expire同时操作)

====================================

  1. Redis内存达90%以上可能出现的问题?
    -1. 使用了keys, 方案: scan代替keys(阻塞,导致短时间内Redis服务不可用,生产禁用)
    -2. 单个key value值过大,带宽消耗严重
  2. 查看Redis命中率? 连接Redis info命令查看计算


    image.png

https://www.runoob.com/redis/keys-scan.html
https://www.jianshu.com/p/611a492d9121Redis原理与应用

相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空