缓存击穿、穿透、雪崩及Redis分布式锁

分布式锁: 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原理与应用

你可能感兴趣的:(缓存击穿、穿透、雪崩及Redis分布式锁)