单节点redis中的安全redis锁

safe_redis_lock的Python项目详细描述


项目描述

  • 一个单机版的redis分布式锁( A single redis distributed lock)
  • 项目使用set命令来加锁
  • 使用lua脚本来释放锁以保证原子性
  • 注意事项,传入的redis连接池需要必须参数一样,同一个redis数据库
  • 当block=False的时候如果没有获得锁则返回一个AcquireFailException异常
  • acquire方法返回True时候则说明获得锁成功

使用方法一

  • 装饰器使用方法

  • 新建一个RedisLock对象.使用RedisLock的lock装饰器来装饰需要保证原子性的函数

  • 注意该函数不能是阻塞的

  • importthreadingimportredisfromsafe_redis_lockimportRedisLockpool=redis.ConnectionPool(host='127.0.0.1',port=6379,password='lyc',db=0)conn=redis.Redis(connection_pool=pool)conn.set('producer',10000)redis_lock_=RedisLock(lock_timeout=5,pool=pool,block=True)@redis_lock_.lockdefconsumer_pp(conn):num=int(conn.get('producer'))ifnum==0:returnTrueelse:print(f'we consumer one left --> {num}')conn.set('producer',num-1)defconsumer():pool=redis.ConnectionPool(host='127.0.0.1',port=6379,password='lyc',db=0)whileTrue:conn=redis.Redis(connection_pool=pool)ifconsumer_pp(conn):breakdefconsumer_thread():fromthreadingimportThreadforiinrange(20):Thread(target=consumer).start()consumer_thread()

使用方法二:

fromsafe_redis_lockimportRedisLock,AcquireFailExceptionimportredisimportthreadingimportospool=redis.ConnectionPool(host='127.0.0.1',port=6379,password='lyc',db=0)conn=redis.Redis(connection_pool=pool)conn.set('producer',10000)redis_lock_=RedisLock(lock_timeout=5,pool=pool,block=True)defconsumer_pp(conn):num=int(conn.get('producer'))ifnum==0:returnTrueelse:print(f'we consumer one left --> {num}')conn.set('producer',num-1)defconsumer():pool=redis.ConnectionPool(host='127.0.0.1',port=6379,password='lyc',db=0)whileTrue:conn=redis.Redis(connection_pool=pool)value=f'{threading.current_thread().ident}-{os.getpid()}'get_lock=Falsetry:get_lock=redis_lock_.acquire(value=value)ifget_lock:ifconsumer_pp(conn):breakexceptAcquireFailException:print('can not get the lock')finally:ifget_lock:redis_lock_.release(value)defconsumer_thread():fromthreadingimportThreadforiinrange(20):Thread(target=consumer).start()consumer_thread()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在Android Studio中使用while循环显示包含textview对象的数据   创建名为“userController”的bean时发生java错误:通过字段“userService”表示未满足的依赖关系   java PDFBox PDFImageWrite。writeImage未正确处理所有字符   java无法识别代码中的nzec错误   无法更改java TabLayout字体   在Java中使用子字符串删除部分字符串   Java中的listener addPropertyChangeListener方法   java可以同时拖动多个对象   java如何将数组中的值添加到向量中   java为什么在Camel 3.7.3中无法正确计算属性?   与后端问题不同的机器中的java客户端资源   带字符串的java分割字节数组?   java On_选项_项目_选择的方法说明   java如何在画布的父画中画一个圆?   连接超时和打开连接数的java Netty通道配置   java mysql中如何防止向数据库中插入重复数据   升级到macOS Big Sur后,java无法启动Neo4j控制台应用程序   在Java中使用XSLT将XML转换为HTMLString的ajax   java无法使用Apache POI获取Excel工作表中的数据