【python3】 使用redis实现分布式锁

保证多机部署情况下, 只有一台机器上的程序在运行

import redis
import time
import threading
import uuid

class DistributedLock:
    def __init__(self, lock_key, lock_timeout=10, renew_interval=5):
        self.lock_key = lock_key
        self.lock_timeout = lock_timeout
        self.renew_interval = renew_interval
        self.redis_client = redis.Redis()  # <---- redis 地址
        self.lock_id = None

    def acquire_lock(self):
        self.lock_id = uuid.uuid4().hex
        while not self.redis_client.set(self.lock_key, self.lock_id, nx=True, ex=self.lock_timeout):
            time.sleep(0.1)
        self.start_renew_thread()

    def start_renew_thread(self):
        threading.Thread(target=self.renew_lock, daemon=True).start()

    def renew_lock(self):
        while True:
            time.sleep(self.renew_interval)
            if self.redis_client.get(self.lock_key) == self.lock_id.encode():
                self.redis_client.expire(self.lock_key, self.lock_timeout)

    def release_lock(self):
        if self.redis_client.get(self.lock_key) == self.lock_id.encode():
            self.redis_client.delete(self.lock_key)

# 测试示例
lock = DistributedLock('my_lock')
lock.acquire_lock()
time.sleep(20)  # 模拟业务执行时间
lock.release_lock()

在分布式系统中,锁是一个非常重要的概念,用于确保多个进程或线程不会同时访问或修改共享资源。Redis作为一个高性能的键值存储系统,可以用来实现分布式锁。下面是如何使用PythonRedis实现分布式锁的步骤: 1. **安装RedisPython库**: 首先,确保你已经安装了RedisPythonRedis客户端库(如`redis-py`)。 ```bash pip install redis ``` 2. **连接到Redis服务器**: 使用`redis-py`库连接到Redis服务器。 ```python import redis import time import uuid # 连接到Redis服务器 redis_client = redis.Redis(host=&#39;localhost&#39;, port=6379, db=0) ``` 3. **实现分布式锁**: 使用Redis的`SET`命令和`NX`选项来尝试获取锁。`SET`命令的`NX`选项表示只有当键不存在时才设置键。 ```python def acquire_lock(lock_name, acquire_timeout=10, lock_timeout=30): identifier = str(uuid.uuid4()) end = time.time() + acquire_timeout lock = f"lock:{lock_name}" while time.time() < end: if redis_client.set(lock, identifier, nx=True, ex=lock_timeout): return identifier time.sleep(0.01) return False def release_lock(lock_name, identifier): lock = f"lock:{lock_name}" pipe = redis_client.pipeline(True) try: while True: try: pipe.watch(lock) if pipe.get(lock).decode() == identifier: pipe.multi() pipe.delete(lock) pipe.execute() return True pipe.unwatch() break except redis.exceptions.WatchError: pass finally: pipe.reset() return False ``` 4. **使用分布式锁**: 使用上述函数来获取和释放锁。 ```python lock_name = "my_distributed_lock" acquire_timeout = 10 lock_timeout = 30 identifier = acquire_lock(lock_name, acquire_timeout, lock_timeout) if identifier: try: # 执行需要加锁的操作 print("Lock acquired, performing task") time.sleep(5) finally: if release_lock(lock_name, identifier): print("Lock released") else: print("Failed to release lock") else: print("Failed to acquire lock") ``` ### 解释 - **acquire_lock**:尝试获取锁,如果获取成功则返回唯一的标识符,否则返回`False`。 - **release_lock**:释放锁,确保只有持有锁的进程才能释放锁。 ### 优点 - **简单易用**:使用Redis的`SET`命令和`NX`选项可以轻松实现分布式锁。 - **高性能**:Redis是一个高性能的键值存储系统,适合高并发场景。 ### 缺点 - **单点故障**:如果Redis服务器宕机,锁机制会失效。 - **死锁**:如果持有锁的进程崩溃,锁可能会一直存在,导致死锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值