现在的设计是一台 Redis 作为缓存,多个服务器进行负载均衡,某些操作需要加锁。
看了几篇分布式锁的文章后尝试自己实现一个,遇到了两个问题,想问问有经验的各位。
看到的文章中基本都是使用线程 id 来作为锁拥有人的判断。不熟悉 Java,是 Java 的不同请求不会在同一个线程中吗? 但在 asyncio 中,整个事件循环都是在同一个进程的同一个线程中。如果用线程 ID 的话可能会有同一个服务器的两个不同请求认为自己都是锁的拥有者而出现问题,不知道有什么其他的比较好的判断依据吗,比如一个请求在申请锁的时候先生成一个 UUID,用这个 UUID 来代替线程 ID。还想过一个办法是在每个线程中再加一个锁,要请求一个资源的时候要先获取到线程中这个资源对应的锁才能去请求 Redis 中的锁,解锁的时候则要解锁两个锁,理论上也能避免线程 id 相同造成的问题。不太确定哪种做法更好一些。
如果是阻塞获取锁,有两种做法,一是订阅 Redis 的事件,等待对应的 key 被删除或者过期。另一种是在应用里 sleep+循环,不断的尝试获取 key 直到超时,想问一下这两种做法哪一种比较好一些?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.