redis实现分布式锁的代码
时间: 2023-10-19 13:06:54 浏览: 69
以下是Redis实现分布式锁的Python代码示例:
```python
import redis
import time
class RedisLock(object):
def __init__(self, redis_conn, lock_name, timeout=10, blocking_timeout=10):
self.redis_conn = redis_conn
self.lock_name = lock_name
self.timeout = timeout
self.blocking_timeout = blocking_timeout
self.acquired = False
self.lock_value = None
def acquire(self):
start_time = time.time()
while time.time() - start_time < self.blocking_timeout:
self.lock_value = str(time.time())
if self.redis_conn.set(self.lock_name, self.lock_value, nx=True, px=self.timeout):
self.acquired = True
return True
time.sleep(0.1)
return False
def release(self):
if self.acquired:
self.redis_conn.eval('if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end', 1, self.lock_name, self.lock_value)
self.acquired = False
```
使用方法:
```python
redis_conn = redis.Redis(host='localhost', port=6379, db=0)
lock = RedisLock(redis_conn, 'my_lock', timeout=10, blocking_timeout=10)
if lock.acquire():
try:
# do something under lock
finally:
lock.release()
else:
print('Failed to acquire lock')
```
上述代码中的RedisLock类定义了分布式锁的基本操作,其中:
- `__init__`方法接受Redis连接对象、锁名称、锁的超时时间和获取锁时的阻塞超时时间作为参数。
- `acquire`方法尝试获取锁,如果获取成功则返回True,否则在阻塞超时时间内一直尝试获取锁,最终返回False。
- `release`方法释放锁,只有在获取锁成功后才能调用该方法释放锁。释放锁时,需要检查当前锁的值是否与获取锁时设置的值相同,以确保只有锁的持有者才能释放锁。
使用示例中,我们首先创建一个Redis连接对象,然后创建一个名为'my_lock'的锁对象。我们使用`acquire`方法获取锁,如果获取成功,则执行一些需要互斥访问的操作,最后调用`release`方法释放锁。如果获取锁失败,则输出一条提示信息。