分布式锁相关

Mysql

1.单机环境下 

1.悲观锁

select * from table where id = *  for update

查询语句末尾添加for update 会对数据添加行锁(数据量小的时候容易出现表锁的情况,所以最好是有 where id = * 条件)然后搭配事务注解  实现单库单表情况下的锁

2.乐观锁

添加version字段,每次更新成功后version+1

在更新数据前,判断当前数据库数据的version跟方法中的version值是否一致,一致则更新,不一致则失败  非读写分离下可用

2.分布式环境下

增加lock表,并将锁名作为唯一索引,当进程开始时,向lock表中插入数据,成功则代表获得锁,执行方法,执行完毕后释放锁(删除数据),失败则代表无法获得锁,只能进行重试

缺陷:容易产生死锁,无法可重复入锁,且依赖数据库性能,并发问题严重无法解决

Redis(内存处理相较于MySQL磁盘处理速度更快)

1.单机环境

setnx命令(不存在则插入,存在则返回false)

当进程开始时,向Redis中插入数据(需要设置时间,防止出现死锁现象),成功则获得锁,执行方法,执行完毕后释放锁(删除数据),失败则代表无法获得锁,只能进行重试

性能提升——分段锁机制

根据id进行分段的一种操作,如数据库种id为1-10的数据,使用Redis中可用为id-1的锁,10-20使用Redis中id-2的锁,进行一种分段操作

缺陷:过期时间会出现2种问题 

1.过期任务未执行完,锁已经释放,如何续期

2.过期后任务执行完毕,删除了正在执行的其他请求的锁

2.分布式集群环境

问题:集群条件下,主从Redis无法做到数据实时同步,可能会导致Redis锁出现问题

解决:红锁机制(redisson提供,但是需要5台Redis服务器为保底)

红锁机制讲究提供5台及其以上的奇数Redis服务器,使用redisson的检测机制,超过一般的Redis台数上得到成功结果,则判定为可以获得锁,否则失败

缺陷:

1.Redis宕机一台立刻重启后可能会造成冲突,导致另外一台斧王可以获得锁,所以无法立刻重启

2.Java的STW机制(JVM运行过程中,所有的应用线程都会被暂停,JVM会执行一些特定的任务,如垃圾回收、线程栈的调整等),会另外一台服务可以获得锁

Zookeeper

事件监听:监听zk下所有的节点的变化

机制:顺序节点与临时节点

特性:zk的节点具有互斥性,唯一性,当一个节点被创建,就不能在创建

临时节点:当程序与zk进行连接的时候,所创造的节点,就是临时节点,断开后节点则消失

顺序节点:zk进行连接时,所有的节点都是按照连接先后,进行一个排序,则称为顺序节点

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Redis自带分布式锁是基于Redis的普通命令实现的。为了更好地理解Redis自带分布式锁,我们需要先了解与分布式锁相关的普通Redis命令。只有充分了解这些命令,才能更好地理解高级的Redis分布式锁的实现,因为高级的分布式锁的实现完全基于普通Redis命令。 在Redis中,分布式锁的实现原理其实很简单,它基于RedLock思想。具体实现过程是遍历所有的Redis客户端,然后依次对它们进行加锁操作。最后统计成功的次数来判断是否加锁成功。 需要注意的是,Redis自带的分布式锁也有性能瓶颈问题。在高并发情况下,如果同时有多个客户端请求加锁,可能会导致性能下降。为了解决这个问题,可以采用Redis分段锁的方式,将锁分为多个段,每个段有自己的锁。这样可以提高并发性能。 除了Redis自带的分布式锁分布式锁的实现还有其他方式,比如基于文件锁、数据库锁、以及基于ZooKeeper的分布式锁等。具体选择哪种方式取决于具体的应用场景和需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Redis分布式锁(图解 - 秒懂 - 史上最全)](https://blog.csdn.net/crazymakercircle/article/details/116425814)[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_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值