一般的锁只在单台Redis中。
如何对多台机器,共享一把锁。
实现方式:
1、基于数据库。
2、基于缓存Redis
3、基于zookeeper。
使用Redis实现:
1、使用setnx进行设置
setnx users 10——设置锁
del users——删除锁
注意:(1)设置锁最长过期时间(setnx users 10 , expire users 10)防止一直占用锁。
(2)设置key过期时间
(3)如果上锁之后,出现异常,无法设置过期时间——上锁时同时设置过期时间(set users 10 nx ex 12)实现原子操作。
如何防止锁误删
如果在操作过程中,锁被其他请求拿走,导致自己手动释放时,把别人的锁释放。
解决方法:
1、对锁设置UUID——set lock uuid nx ex 10。用uuid对锁的归属做判断。
2、当释放锁时,判断uuid是否一致,从而不释放别人的锁。
如何保证原子性?
lua脚本——支持原子操作
定义lua脚本,从而实现。
判断UUID与判断,从而形成原子性操作。