redis的setnx实现分布式锁
时间: 2023-10-16 14:08:48 浏览: 114
Redis的SETNX命令用于在键不存在时设置键值对,如果键已经存在,则不做任何操作。利用SETNX命令可以实现简单的分布式锁。以下是一个使用SETNX实现分布式锁的示例代码:
```python
import redis
import time
def acquire_lock(lock_name, acquire_timeout=10, lock_timeout=10):
# 创建redis连接
redis_conn = redis.Redis()
# 生成唯一的锁标识
lock_key = f"lock:{lock_name}"
# 获取当前时间戳,用于计算锁超时时间
timestamp = int(time.time()) + acquire_timeout
# 循环尝试获取锁
while int(time.time()) < timestamp:
# 尝试获取锁
if redis_conn.setnx(lock_key, "locked"):
# 设置锁超时时间
redis_conn.expire(lock_key, lock_timeout)
return True
# 短暂休眠,避免频繁尝试获取锁
time.sleep(0.1)
return False
def release_lock(lock_name):
# 创建redis连接
redis_conn = redis.Redis()
# 生成唯一的锁标识
lock_key = f"lock:{lock_name}"
# 删除锁
redis_conn.delete(lock_key)
```
在上述示例代码中,`acquire_lock`函数用于获取分布式锁,`release_lock`函数用于释放分布式锁。具体实现过程如下:
1. 创建Redis连接。
2. 生成唯一的锁标识,一般以`lock:`为前缀加上具体的锁名。
3. 计算获取锁的超时时间戳,即当前时间戳加上获取锁的超时时间。
4. 循环尝试获取锁,如果成功获取到锁,则设置锁的超时时间,并返回True;如果超过超时时间仍未获取到锁,则返回False。
5. 释放锁的过程比较简单,直接删除对应的锁标识即可。
需要注意的是,分布式锁的实现还需要考虑异常情况下的处理、防止锁被误释放等问题,上述代码仅作为示例,具体应用场景中可能需要根据实际需求进行适当修改。
阅读全文