在分布式系统中,怎么 memcache 实现分布式锁,可以实现吗?
回答·8
最热
最新
- 它的 metux 设计模式 不过现在基本不用 memcache 了 分布式锁有很多实现,可以用 redis 客户端 redisson 已经帮我们实现了。 可以用 zk 顺序节点,或者 mysql 唯一索引或者 for update 或者 etcd,等等吧 分布式锁要考虑锁的释放,超时,防止死锁,可重入等问题。
- 很多方式。add 成功表示获锁。用 redis redisson 多好。zk 也可以
- 1 人留言,11.1 万人浏览,真特么服了
- 十一万人浏览😵💫又不敢说话😁 哈哈哈哈,这问的也太专业了不会啊哈哈
- 1. 获取锁: • 当一个进程需要访问共享资源时,它会尝试在Memcache中设置一个特定的键,该键代表锁。 • 使用Memcache的add命令来实现,该命令只有在键不存在时才会设置键值对。如果键已经存在,说明另一个进程已经持有锁,add命令会失败。 • 如果add命令成功,进程就获得了锁,并可以安全地执行其操作。 2. 设置超时: • 为了避免锁永久存在于系统中(例如,持有锁的进程因故障而无法释放锁),在设置键的时候应该设置一个过期时间。 • 这意味着即使没有进程显式释放锁,Memcache也会在超时后自动清除键,从而释放锁。 3. 释放锁: • 当进程完成对共享资源的操作后,它会删除Memcache中的键,从而释放锁。 • 应该仅由持有锁的进程执行删除操作,避免其他进程意外释放了不属于它们的锁。 4. 容错和重试机制: • 如果进程在尝试获取锁时失败(因为锁已被其他进程持有),它可以周期性地重试,直到获得锁或达到某个超时时间。 • 进程还应该能够处理持有锁的进程在执行过程中失败的情况,可能通过设置合理的锁超时时间来解决。
- 具体的实现方式有很多种,其中一种方式是利用 memcached 的 add 命令。此命令是原子性操作,只有在 key 不存在的情况下,才能 add 成功,也就意味着线程得到了锁。
- 主流Redis 不同语言均有实现