分布式锁解决方案

本文探讨了三种分布式锁的实现方式:Redis利用setNX和过期时间结合lua脚本确保锁的正确释放;Redission作为Java实现的分布式锁库;以及MySQL的行锁机制。同时,提到了Zookeeper的分布式锁实现,通过观察者模式和节点顺序性来保证锁的公平性。建议使用独立的数据表以避免影响业务,并对比了各种方案的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis分布式锁

1. 使用setNX 命令 + 过期时间 + lua脚本
为什么要使用lua脚本?如果A程序执行过长,该key已经过期,当A执行完可能释放B的锁。图解如下:

在这里插入图片描述
lua脚本
在这里插入图片描述

if redis.call("get",KEYS[1]) == ARGV[1] then
	return redis.call("del",KEYS[1])
else
   	return 0	
end   	

2.redisson

java代码 -> 源码链接。

Mysql作为分布式锁

原理: 利用mysql innodb的行锁。

select * from sync where id = 1 for update

建议:
使用另一个单独的数据库数据表作为锁,避免影响业务表。

Zookeeper作为分布式锁

  1. Apache curator
  2. 自定义实现分布式锁
    原理:
    1. 利用 exists getData getChildren 三个方法添加观察器。节点数据发生变化,会回调实现了Watch接口的process(),观察器只能监控一次,再次监控需重新设置。
    2. Zk节点的瞬时有序性,多线程并发创建瞬时节点时会得到有序的序列。
    3. 序号最小的线程获得锁。
    4. 其他线程监听自己序号的前一个序号。
    5. 前一个线程执行完成,删除自己序号的节点。
    6. 下一个序号的线程得到通知,继续执行。

      zk节点类型:持久节点,持久有序,瞬时,瞬时有序,容器节点。

zk锁:java实现-> 源码链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值