在redis文档中,我发现可以通过SETNX实现原始锁:
http://redis.io/commands/setnx
C4发送SETNX lock.foo以获取锁
崩溃的客户端C3仍然保留它,因此Redis将回复0到C4.
C4发送GET lock.foo来检查锁是否过期.如果不是,它会睡一段时间并从头开始重试.
相反,如果锁定已到期,因为lock.foo上的Unix时间早于当前的Unix时间,C4会尝试执行:
GETSET lock.foo
由于GETSET语义,C4可以检查存储在key中的旧值是否仍然是过期时间戳.如果是,则获得锁定.
如果另一个客户端(例如C5)比C4快并且通过GETSET操作获得锁定,则C4 GETSET操作将返回未过期的时间戳.C4将从第一步开始重新启动.请注意,即使C4将来设置密钥几秒钟,这也不是问题.
但是,正如一些用户所评论的那样,使用UNIX时间戳作为过期时间需要客户端和服务器的时间完全同步.有没有更好的替代方法在Redis中创建全局/分布式锁?
是否可以锁定Node JS应用程序中的任何对象.
应用程序是否有多个实例可用,某些功能不应该并发运行.如果实例A函数完成,它应解锁该对象/密钥或某个标识符和应用程序的B实例应检查其解锁是否应该运行某些功能.
任何对象或密钥都可用于识别锁定和解锁功能.
如何在具有多个实例的NodeJS应用程序中执行此操作.