redis分布式锁的理解

适用场景

多线程的情况下,对一个值进行修改,或者说重复的进行什么操作,保证幂等性 ,或者说不会重复的创建某个值

分布式锁需要实现的目标

1.多线程可见
2.排它性:同一时间只能有一个线程获取锁,redis的setnx 表示set if not exits 就可以实现
3.避免死锁的出现
4.高可用

下面展示一些 内联代码片

redis锁实现的方式

第一种

在进行多线程操作的时候获取锁,在操作完成之后释放锁
比如线程A调用redisTemplate.opsForValue方法设置key+value ,时间 10s
线程B调用redisTemplate.opsForValue方法也去设置锁key+value ,时间 10s
在这种情况下 A执行业务 因为某些业务的原因导致 执行的时间超过了10s 从而使得redis 自动释放了锁 这个10s之后线程B获得了锁之后 也开始执行自己的业务逻辑.,但是刚开始执行线程A执行完成了 执行了业务上的操作删除了 锁 这个锁却不是A自己的,而是线程B获得的分布式锁 也就意味者在线程B执行业务逻辑的时候 线程C也能获取到锁 从而违反了redis分布式锁的排他性

第二种

优化:我们在设置分布式锁的时候,将当前线程的信息作为自己的锁 解锁的时候 去判断我们删除的锁是不是自己线程的锁 这样就能解决线程解锁,解除别的锁的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis分布式锁是一种通过Redis实现的分布式锁机制。它可以用于在分布式环境下实现对共享资源的互斥访问。Redis分布式锁的实现方式有很多种,比如基于SETNX命令的方式,通过在Redis中设置一个特定的键值对来表示锁的状态。具体而言,使用SETNX命令可以尝试给定的键设置一个值,只有当键不存在时才会设置成功。因此,可以将这个键理解为锁,如果某个操作成功设置了这个键值对,则表示该操作成功获取到了锁,可以执行后续的操作。而其他尝试获取锁的操作如果发现这个键已经存在,则表示锁已经被其他操作持有,需要等待或放弃获取锁。为了保证线程安全,获取锁和释放锁的过程需要保持原子性,可以使用Redis的事务或者Lua脚本来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [redis分布式锁的这些坑,我怀疑你是假的开发](https://blog.csdn.net/devcloud/article/details/113679242)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Redis 分布式锁](https://blog.csdn.net/weixin_41850404/article/details/84937693)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值