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

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

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

3426 次点击
所在节点    程序员
27 条回复
fighterlyt
2020-03-15 09:29:06 +08:00
@kkk212 如果是刚入行或者 1-2 年经验,造这个轮子很正常,但是你都几年 PHP 了,才来造这样的轮子,有点晚了
kkk212
2020-03-15 09:29:27 +08:00
@lasuar 操作系统的锁或者信号量,也需要进程的阻塞和唤醒。思路是利用 redis 的 epoll 机制,做分布式的阻塞和唤醒,也有点像进程间的通信和调度。
kkk212
2020-03-15 09:34:13 +08:00
令牌桶属于限流模型吧,感觉是限流和减少了并发,但是还存在并发。限流后的并发,还是需要一种解决方案。
kkk212
2020-03-15 09:41:21 +08:00
@fighterlyt 不对呀,现在 php 并没有这样的轮子。令牌桶机制属于限流,限流后还会存在并发。系统调度是单机的,不是分布式的。然后消息队列是异步消费的,不是同步。
kkk212
2020-03-15 09:43:03 +08:00
@lasuar 令牌桶属于限流模型吧,感觉是限流和减少了并发,但是还存在并发。限流后的并发,还是需要一种解决方案
lasuar
2020-03-15 10:05:31 +08:00
你往深了看。
令牌桶的原理是通过控制桶内令牌数量控制并发,相当于是一种调节 /调度机制,这种调度机制实现了限流的功能。转过来看看 brpop 这种方式,上游仍然可以通过 lpush 的频率控制下游执行的速率,这里是不是异曲同工呢,其实是实现了一样的功能,所以我说后者也是一种调度机制,用了 redis 就是做全局(分布式)的调度,同样可以不用 redis 而使用编程语言内部的队列框架实现这个机制(单机)。golang 的 GPM 模型比这个复杂一些,它的上游是操作系统(调度器),下游是 goroutine,goroutine 需要调度器分配 P(processor)和 M(内核线程)才能执行,否则就等待。
kkk212
2020-03-15 10:16:37 +08:00
@lasuar 嗯嗯,相当于“调度”的一种应用,或者说分布式的进程间通信。不过令牌桶的算法是灵活限流,要是限制成比如多少 ms 放行一个进程,处理并发也不太适用。

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

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

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

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

© 2021 V2EX