已知redis实现分布式锁可以使用setnx
实现, 但是问题在于设定一个过期时间。假如设定过期时间为10s
,有可能在超过10s
后work还没有退出,就会造成锁被释放掉。
所以swoole有没有类似于javaredission
这种实现分布式锁的第三方包。 如果没有,怎么解决上述的问题呢?
已知redis实现分布式锁可以使用setnx
实现, 但是问题在于设定一个过期时间。假如设定过期时间为10s
,有可能在超过10s
后work还没有退出,就会造成锁被释放掉。
所以swoole有没有类似于javaredission
这种实现分布式锁的第三方包。 如果没有,怎么解决上述的问题呢?
swoole
有没有类似 java redission
不好说,但是一般来说你把时间设的长一些,就不会有这个问题,程序正常完成就释放这个锁,一般来说如果这个长时间内你的程序都没有做完导致锁已经被释放了,说明你这个程序本身就有问题了。
1 回答4k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.2k 阅读
1 回答569 阅读✓ 已解决
785 阅读
Redis 是有自己的官方分布式锁实现方案的,就叫 RedLock。提出者也是 Redis 的原作者 Antirez。普遍认为如果在集群环境中没有时钟跳跃(也叫时钟漂移)的话,就可以说是安全的。
具体实现原理可以自行搜索 RedLock 相关。
而你的问题本质是“如何给锁续约”的问题。
Redisson 不过是 Java 实现的一个 Redis 客户端罢了,捎带着封装了一下 RedLock 供开发者方便地使用。它锁续约是基于 Netty 的定时器实现的。
Swoole 下有没有实现我不清楚,不过以 PHP 本身的 RedLock 实现还是不少的:https://github.com/search?l=P...
Redis 官方也有一个推荐的 PHP 库(也是上面 GitHub 搜索结果里 Star 最多的那个项目):https://redis.io/topics/distlock
或许你可以找个高 Star 的项目移植到 Swoole 下。