python版本 redis分布式锁
前言
golang版本redis锁
https://www.cnblogs.com/zengxm/articles/12797981.html
直接上代码
#! coding=utf-8 import redis,time SET_IF_NOT_EXIST = True # 不存在则执行 SET_WITH_EXPIRE_TIME = "EX" # 过期时间(秒) PX 毫秒 SET_LOCK_SUCCESS = "True" # lock 操作成功 SET_LOCK_FAIL = "None" # lock 设置失败或者已存在 DEL_LOCK_SUCCESS = 1 # lock 删除成功 DEL_LOCK_NON_EXISTENT = 0 # 删除lock key时,并不存在 LOCK_TIME_EX_EXPIRE = 5 # 5秒 LOCK_TIME_PX_EXPIRE = 1000 # 1000毫秒 = 1s REDIS_ADDRESS_HOST = "localhost" REDIS_ADDRESS_PORT = 6379 MAX_CONNECT_NUMBER = 10 """ @:param redis_address: redis 地址 @:param key: 分布式操作 格式为 用户id_操作行为(up,add,del)_操作方法 @:param requestId: 唯一id,删除时需要将查询结果对比是否为该值,避免其他实例删除 @:param ex: 过期时间 """ class redis_lock_utils(object): def __init__(self,host=REDIS_ADDRESS_HOST,port=REDIS_ADDRESS_PORT,Max_connect=MAX_CONNECT_NUMBER): self.pool = redis.ConnectionPool(host=host,port=port,max_connections=Max_connect) # 从pool连接池中获得一个链接 def get_conn(self): return redis.Redis(connection_pool=self.pool,decode_responses=True) # 添加lock锁 过期时间单位为秒 def add_lock_ex(self,key,requestId,ex=LOCK_TIME_EX_EXPIRE): if ex <= 0: ex = LOCK_TIME_EX_EXPIRE return self.get_conn().set(name=key,value=requestId,ex=ex,nx=SET_IF_NOT_EXIST) == SET_LOCK_SUCCESS # 添加lock锁 过期时间单位为毫秒 def add_lock_px(self,key,requestId,px=LOCK_TIME_PX_EXPIRE): if px <= 0: px = LOCK_TIME_PX_EXPIRE return self.get_conn().set(name=key,value=requestId,px=px,nx=SET_IF_NOT_EXIST) == SET_LOCK_SUCCESS # 获取 lock 的唯一值 def get_lock(self,key): return self.get_conn().get(name=key) # 删除lock 对比 requestId def del_lock(self,key,requestId): values = self.get_lock(key) if values == None: return True # 删除成功为 1 删除时发现不存在为 0 if requestId == str(values,encoding="utf-8"): ok = self.get_conn().delete(key) if ok == DEL_LOCK_SUCCESS and ok == DEL_LOCK_NON_EXISTENT: return True else: return False else: return False pool = redis_lock_utils(REDIS_ADDRESS_HOST,REDIS_ADDRESS_PORT,MAX_CONNECT_NUMBER)
建立一个redis连接池,含有增查删功能,做成单例模式
测试代码
#! coding=utf-8 import uuid import redis_lock.utils.pool as r if __name__ == '__main__': # user_id 用户id action 行为(up,add,del) method 执行方法(路由函数) k = "{user_id}_{action}_{method}".format(user_id=666,action="up",method="UpUserInfo") v = uuid.uuid4().__str__() ex = 10 print(r.pool.add_lock_ex(k, v, ex)) print(r.pool.get_lock(k)) print(r.pool.del_lock(k, v))

浙公网安备 33010602011771号