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))

 

posted @ 2020-04-30 02:05  花名k  阅读(172)  评论(0)    收藏  举报