redis集群分布式锁代码
时间: 2023-11-12 16:13:08 浏览: 45
Redis 支持分布式锁,可以利用 Redis 的原子性操作和 Lua 脚本来实现。以下是一个基于 Redis 集群的分布式锁的 Python 代码示例:
```python
import redis
import time
class RedisLock:
def __init__(self, redis_cluster, key, expire=10):
self.redis_cluster = redis_cluster
self.key = key
self.expire = expire
def lock(self):
while True:
timestamp = int(time.time() * 1000)
result = self.redis_cluster.set(self.key, timestamp, nx=True, px=self.expire)
if result:
return True
time.sleep(0.1)
def unlock(self):
lua_script = """
if redis.call("get", KEYS[1]) == ARGV[1] then
return redis.call("del", KEYS[1])
else
return 0
end
"""
self.redis_cluster.eval(lua_script, 1, self.key, self.redis_cluster.get(self.key))
if __name__ == '__main__':
redis_cluster = redis.RedisCluster(
startup_nodes=[
{'host': '127.0.0.1', 'port': 6379},
{'host': '127.0.0.1', 'port': 6380},
{'host': '127.0.0.1', 'port': 6381},
],
decode_responses=True
)
lock = RedisLock(redis_cluster, 'lock_key')
if lock.lock():
try:
# do something
pass
finally:
lock.unlock()
```
在上面的代码中,我们使用 Redis 的 `set` 命令来获取锁,设置 `nx` 参数为 `True` 表示只有当锁不存在时才能获取锁,避免出现多个客户端同时占用锁的情况。同时设置 `px` 参数表示锁的过期时间。如果获取锁失败,我们使用 `time.sleep` 函数等待一段时间后再次尝试获取锁。
在释放锁时,我们使用 Lua 脚本来保证原子性。在脚本中,我们首先判断当前锁是否被当前客户端占用,如果是,则删除锁并返回 1;否则返回 0。
注意,该代码示例仅适用于 Redis 集群模式,如果使用单机版 Redis,需要将 `redis.RedisCluster` 替换为 `redis.Redis`。