Python Redis锁实现:高效的代码示例
以下是一个基本的Redis锁的Python实现:
import redis
import time
class RedisLock:
def __init__(self, redis_client, lock_key, expire_time=60, acquire_timeout=10):
self.redis_client = redis_client
self.lock_key = lock_key
self.expire_time = expire_time
self.acquire_timeout = acquire_timeout
self.value = None
def acquire(self):
start_time = time.time()
while time.time() - start_time < self.acquire_timeout:
value = str(time.time() + self.expire_time + 1)
if self.redis_client.setnx(self.lock_key, value):
self.value = value
return True
else:
current_value = self.redis_client.get(self.lock_key)
if current_value is not None and float(current_value.decode('utf-8')) < time.time():
old_value = self.redis_client.getset(self.lock_key, value)
if old_value is not None and old_value == current_value:
self.value = value
return True
time.sleep(0.001)
return False
def release(self):
if self.redis_client.get(self.lock_key) == self.value:
self.redis_client.delete(self.lock_key)
# 使用方法
r = redis.Redis(host='localhost', port=6379, db=0)
lock = RedisLock(r, 'my_lock')
if lock.acquire():
try:
# 这里执行需要加锁的代码
pass
finally:
lock.release()
else:
# 加锁失败,执行其他操作
pass
此示例使用Redis的setnx命令在Redis上生成一个新的键值对,以获取锁。如果setnx成功,则意味着我们已获得了锁。
如果setnx返回False,则我们需要检查当前锁是否已过期。如果过期,我们可以使用getset命令获取并更新锁的值。如果获取到的值与我们之前检查的值相同,则我们已获得锁。
获取锁后,我们可以执行需要加锁的代码,然后释放锁。如果锁已过期或锁的值已更改,释放锁将失败。
原文地址: https://www.cveoy.top/t/topic/lSsI 著作权归作者所有。请勿转载和采集!