Redis实现分布式锁的缺点

缺点

  1. 缓存和数据库双写一致性问题
  2. 缓存雪崩问题
  3. 缓存击穿问题
  4. 缓存的并发竞争Key的问题

缓存和数据库 双写一致性

解决方案:

首先采取合适的更新策略,先更新数据库 ,再删除缓存 。

其次可能因为存在删除缓存失败的问题,提供一个补偿措施:例如 使用 消息队列


缓存 雪崩

即缓存同一时间大面积失效 ,这时候又来了一拨请求 ,结果都落到了数据库上 ,导致数据库连接异常

解决方案:
  1. 给缓存加上 随机的失效时间,防止集体失效
  2. 使用 互斥锁,但是该方法吞吐量明显下降
  3. 双缓存,缓存A过期时间为20分钟,缓存B不设置过期时间 。自己做缓存预热

缓存穿透

即黑客故意去请求缓存中不存在的数据,导致请求全都落在了数据库上,是的数据库发生连接异常

解决方案:
  1. 利用 互斥锁,缓存失效的时候,先去获取锁,得到锁了再去请求数据库。没得到锁,则休眠一段时间,重试
  2. 采用 异步更新 策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前先加载缓存)操作。
  3. 提供一个可以迅速判断请求是否有效的 拦截机制。比如:布隆过滤器,内部维护一系列合法的有效的 key。迅速判断出携带的Key是否合法有效。如果不合法,则直接返回。u1

缓存的并发竞争Key问题

解决方案:
  1. 如果对这个key的执行 不要求按照顺序 ,那么准备一个分布式锁,大家去抢锁,抢到锁就做Set操作即可 ,比较简单。
  2. 如果对这个key的执行 要求按照顺序

假设有一个key1,系统A要将key1 设置为valueA,系统B要将key1 设置为valueB,系统C要将key1 设置为valueC。期望key1的value值按照 valueA–valueB–valueC 的顺序进行变化。这时候我们在数据写入数据库的时候,应该保存一个时间戳。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Redis 分布式锁缺点包括: 1. 单点故障:如果 Redis 作为的服务器发生故障,所有依赖于该的进程将无法获取,可能会导致系统不可用。 2. 竞争:由于 Redis 的单线程特性,当多个进程同时请求获取时,只有一个进程能够成功获取,其他进程需要等待。如果在并发环境下,竞争会导致性能问题,并可能引起死。 3. 过期问题:如果获取的进程发生故障或者执行时间过长,没有及时释放,可能会导致其他进程无法获取而一直等待。为了避免这种情况,需要设置合理的超时时间。但是如果设置的超时时间过长,可能会导致进程之间的协调变得困难。 4. 业务代码复杂性增加:使用分布式锁需要在业务代码中加入额外的逻辑来处理获取、释放和续租等操作。这增加了代码的复杂性和维护成本。 5. 误释放问题:如果获取的进程在释放之前发生了故障或者异常退出,可能会导致无法正确释放,造成其他进程无法获取。 6. 粒度控制问题:在分布式环境中,如何确定的粒度是一个挑战。如果的粒度过大,可能会导致并发性能下降;如果的粒度过小,可能会导致频繁获取和释放,增加系统开销。 需要注意的是,这些缺点并不是 Redis 自身的问题,而是在使用 Redis 实现分布式锁时需要考虑和解决的一些挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值