redis分布式锁的异步实现

aioredlock的Python项目详细描述


https://travis-ci.org/joanvila/aioredlock.svg?branch=masterhttps://codecov.io/gh/joanvila/aioredlock/branch/master/graph/badge.svghttps://badge.fury.io/py/aioredlock.svg

异步redlock算法实现。

加密和异步

redlock算法是Redis的分布式锁实现。它有多种语言实现。在本例中,这是python 3.5+的asyncio兼容实现。

用法

fromaioredlockimportAioredlock,LockError# Define a list of connections to your Redis instances:redis_instances=[('localhost',6379),{'host':'localhost','port':6379,'db':1},'redis://localhost:6379/2',]# Create a lock manager:lock_manager=Aioredlock(redis_instances)# Check wether a resourece acquired by any other redlock instance:assertnotawaitlock_manager.is_locked("resource_name")# Try to acquire the lock:try:lock=awaitlock_manager.lock("resource_name")exceptLockError:print('Lock not acquired')raise# Now the lock is acquired:assertlock.validassertawaitlock_manager.is_locked("resource_name")# Extend lifetime of the lock:awaitlock_manager.extend(lock)# Raises LockError if the lock manager can not extend the lock lifetime# on more then half of the Redis instances.# Release the lock:awaitlock_manager.unlock(lock)# Raises LockError if the lock manager can not release the lock# on more then half of redis instances.# The released lock become invalid:assertnotlock.validassertnotawaitlock_manager.is_locked("resource_name")# Or you can use the lock as async context manager:try:asyncwithawaitlock_manager.lock("resource_name")aslock:assertlock.validisTrue# Do your stuff having the lockawaitlock.extend()# alias for lock_manager.extend(lock)# Do more stuff having the lockassertlock.validisFalse# lock will be released by context managerexceptLockError:print('Lock not acquired')raise# Clear the connections with Redis:awaitlock_manager.destroy()

工作原理

aioredlock构造函数接受以下可选参数:

  • redis_connections:运行redis实例的连接列表(主机和端口字典,aioredis.create_redis_pool()的kwargs,或元组(host, port),或sting redis uri)。默认值是[{'host': 'localhost', 'port': 6379}]
  • lock_timeout:表示锁有效期的浮点(秒)。默认值是10.0seconds。
  • drift:用于时钟漂移补偿的浮点。默认值由lock_timeout * 0.01 + 0.002seconds计算。
  • {TT9}$:表示最大允许重试次数以获取锁的整数。默认值是3次。
  • retry_delay_minretry_delay_max:表示下次重试前等待时间(秒)的浮点值。默认值分别是0.10.3

为了获得锁,应该调用lock函数。如果锁操作成功,lock.valid将为true,如果未获取锁,则将引发LockError

从那一刻起,锁一直有效,直到调用unlock函数或到达lock_timeout为止。

调用extend函数将锁的生存期重置为lock_timeout间隔。

使用is_locked函数检查资源是否被其他redlock实例锁定。

为了清除与redis的所有连接,可以调用lock_managerdestroy方法。

待办事项

  • 如果可能,请根据锁的有效性以安全的方式使lock valid属性过期

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

推荐PyPI第三方库


热门话题
java如何在Spring Boot 2.2.0中添加弹性搜索?   jakarta ee如何在没有java认证的情况下停止直接访问网页(自定义标记)   java Hibernate:使用executeUpdate()的批删除未清除一级缓存   java如何在Hibernate中插入外键定义为Long的实体?   带参数的java Mockito单元测试计算器方法   java如何从Rally Rest API读取集合属性   java如何对基于消息的处理执行集成测试?   带插入排序的java排序字符串数组标记,双链表   java为什么在基于注释的Spring app@Value默认值中解析为null?   java Apache Commons Http客户端注册特定于客户端的协议   如何使用java反转字符串中n个部分的n个字符   java Tomcat在本地主机上运行良好,但在部署时出现内部服务器错误   使用信号量的变量的java结果   Java编译/运行时类路径问题   java哪个提供商负责AES/CTR/NOP添加?   伪错误解码器中的java响应未获取Zalando问题自定义属性