人生第一篇技术文章, redis 实现分布式阻塞非争抢锁

2020-03-14 19:44:05 +08:00
 kkk212

php 好几年了,突然觉得写文章记录很重要。一个能加深理解,一个能技术分享。看 redis 的 brpop 命令时候,突发奇想,这可以实现非争抢阻塞锁。于是有了这篇文章,看看这个锁帅不帅,欢迎拍砖。 在简书上: https://www.jianshu.com/p/6dbc44defd94

3587 次点击
所在节点    程序员
27 条回复
momocraft
2020-03-14 19:55:51 +08:00
思路不错
如果有防意外的方案可能更好 (我猜如果进程 1 得到锁后释放前崩溃, 其他线程都要永远阻塞)
Lax
2020-03-14 20:00:50 +08:00
持🔒的进程挂掉,🔒就丢了
kkk212
2020-03-14 20:03:36 +08:00
@momocraft 嗯嗯,是的。redis 队列 pop 空了以后队列 key 就不存在了,完整的方案还需要再想想。
fighterlyt
2020-03-14 20:11:28 +08:00
这不是类似于传统的 linux 的 pid 防止并发? IT 行业已经根深叶茂了,没必要自己从 0 开始,站在巨人的肩上,才能走的更远
kkk212
2020-03-14 20:13:02 +08:00
@Lax 是这样 还需要完善
fighterlyt
2020-03-14 20:17:28 +08:00
分布式系统,所有操作,除了正常的成功、失败,还必须考虑因为网络分片等原因造成的通信中断等等问题
kkk212
2020-03-14 20:20:39 +08:00
@fighterlyt 不局限在 id 并发业务,感觉这是并行转串行的另一种方案。有点同步消息队列的意思,epoll 思想的一种应用。
kkk212
2020-03-14 20:23:02 +08:00
@fighterlyt 有个思路就先写出来了,用于项目还需要完善。
23571113
2020-03-14 20:25:35 +08:00
kkk212
2020-03-14 20:44:02 +08:00
@23571113 书不错
fighterlyt
2020-03-14 20:59:48 +08:00
@kkk212 并发都是资源竞争
kkk212
2020-03-14 21:03:59 +08:00
@fighterlyt 是竞争,用排队思路解决了争抢
fighterlyt
2020-03-14 21:35:32 +08:00
@kkk212 资源竞争最传统的解决思路就是排队,临界区,建议锁。你这是重复造了个轮子
kkk212
2020-03-14 21:43:54 +08:00
@fighterlyt 造轮子没啥不好,这样才能更好理解原理。不过这还没到造轮子水平,这个思路是借用 redis 的 epoll 机制和队列,实现分布式的同步排队锁。
fighterlyt
2020-03-14 21:46:49 +08:00
@kkk212 还有个重要的问题,brpop 并发量大,容易导致读取错误,个人经验,忘了出处了
kkk212
2020-03-14 22:07:33 +08:00
@fighterlyt 嗯嗯 这个没想到 我再看看
pabno
2020-03-15 00:20:26 +08:00
这样会导致连接一直被占用,redis 默认最大连接数为 10000,当被阻塞的连接过多的时候会影响性能吧
lasuar
2020-03-15 08:04:48 +08:00
你这个不是锁了,而是把 redis 当做调度中间件了,只有从 list 中拿到数据的 process 才能往下执行,没有就阻塞,就类似于令牌桶算法或者 go 的 GPM 调度模型。
kkk212
2020-03-15 09:21:34 +08:00
@pabno brpop 可以设置最大阻塞时间,不过太高的并发这个思路是不适合的。可以前边再加上限流。
kkk212
2020-03-15 09:22:19 +08:00
@pabno 可以设置最大阻塞时间,不过太高的并发这个思路是不适合的。可以前边再加上限流。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/652830

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX