利用redis给我写一段实现分布式锁的代码
时间: 2023-06-02 16:02:19 浏览: 46
以下是一个简单的实现分布式锁的Redis代码:
```
import redis
import time
class RedisLock:
def __init__(self, name, redis_client, expire=10):
self.name = name
self.redis_client = redis_client
self.expire = expire
def acquire(self):
while True:
lock = self.redis_client.setnx(self.name, time.time() + self.expire)
if lock:
return True
current_value = self.redis_client.get(self.name)
if current_value and float(current_value) < time.time():
old_value = self.redis_client.getset(self.name, time.time() + self.expire)
if old_value and old_value == current_value:
return True
time.sleep(0.1)
def release(self):
self.redis_client.delete(self.name)
# 使用示例
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
lock = RedisLock('mylock', redis_client)
if lock.acquire():
try:
# 这里是需要加锁的代码
pass
finally:
lock.release()
```
这个实现使用了Redis的setnx命令来尝试获取锁,如果获取到了锁就返回True,否则就等待一段时间重试。在等待期间,使用get命令获取锁的过期时间,如果锁已经过期了,就使用getset命令设置新的过期时间并返回True。这里使用了getset命令而不是set命令,是为了保证在两个线程同时尝试获取锁时,只有一个线程能够成功获取到锁。释放锁时,使用delete命令删除锁的key。