redis怎样实现并发锁
Redis可使用SETNX(SET if Not eXists)命令实现并发锁。以下是一个使用Redis实现并发锁的示例代码:
```python
import redis
import time
def acquire_lock(redis_conn, lock_name, acquire_timeout=10, lock_timeout=10):
"""
获得锁
"""
end_time = time.time() + acquire_timeout
while time.time() < end_time:
if redis_conn.set(lock_name, "locked", nx=True, ex=lock_timeout):
return True
time.sleep(0.001)
return False
def release_lock(redis_conn, lock_name):
"""
释放锁
"""
redis_conn.delete(lock_name)
# 创建Redis连接
redis_conn = redis.Redis(host='localhost', port=6379, db=0)
# 获得锁
if acquire_lock(redis_conn, "my_lock"):
print("获得锁成功")
# 履行需要加锁的操作
# ...
# 释放锁
release_lock(redis_conn, "my_lock")
else:
print("获得锁失败,其他线程正在使用锁")
```
在上述代码中,`acquire_lock`函数会尝试获得锁,若成功获得到锁,则返回True;若在指定的`acquire_timeout`时间内未能获得到锁,则返回False。
`release_lock`函数用于释放锁,即删除锁对应的key。
需要注意的是,为了避免锁的过期时间设置得太长致使死锁,建议在使用完锁后手动调用`release_lock`函数释放锁,而不要依赖锁的自动过期。
TOP