|
@@ -113,3 +113,42 @@ class RedisObject:
|
|
|
|
|
|
def set_persist(self, key):
|
|
|
return self.CONN.persist(key)
|
|
|
+
|
|
|
+ def try_lock(self, lock_key, request_id, expire, time_unit_second):
|
|
|
+ """
|
|
|
+ 获取分布式锁 原子性
|
|
|
+ :param lock_key: 锁的key
|
|
|
+ :param request_id: 请求id
|
|
|
+ :param expire: 锁过期时间
|
|
|
+ :param time_unit_second: 时间单位(秒)
|
|
|
+ :return: True or False
|
|
|
+ """
|
|
|
+ try:
|
|
|
+ # 使用set命令尝试获取锁,并设置nx=True
|
|
|
+ result = self.CONN.set(lock_key, request_id, ex=time_unit_second * expire, nx=True)
|
|
|
+ return result is not None
|
|
|
+ except Exception as e:
|
|
|
+ print("redis lock error.", e)
|
|
|
+ return False
|
|
|
+
|
|
|
+ def release_lock(self, lock_key, request_id):
|
|
|
+ """
|
|
|
+ 释放锁
|
|
|
+ :param lock_key: 锁的key
|
|
|
+ :param request_id: 请求id
|
|
|
+ :return: True or False
|
|
|
+ """
|
|
|
+ try:
|
|
|
+ # 使用Lua脚本来释放锁,避免在执行脚本时发生异常导致锁无法释放
|
|
|
+ lua_script = """
|
|
|
+ if redis.call('get', KEYS[1]) == ARGV[1] then
|
|
|
+ return redis.call('del', KEYS[1])
|
|
|
+ else
|
|
|
+ return 0
|
|
|
+ end
|
|
|
+ """
|
|
|
+ result = self.CONN.eval(lua_script, 1, lock_key, request_id)
|
|
|
+ return result == 1
|
|
|
+ except Exception as e:
|
|
|
+ print("redis unlock error.", e)
|
|
|
+ return False
|