以下是一个基本的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命令获取并更新锁的值。如果获取到的值与我们之前检查的值相同,则我们已获得锁。

获取锁后,我们可以执行需要加锁的代码,然后释放锁。如果锁已过期或锁的值已更改,释放锁将失败。

Python Redis锁实现:高效的代码示例

原文地址: https://www.cveoy.top/t/topic/lSsI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录