Sherlock:具有后端选择的分布式锁
Sherlock的Python项目详细描述
- 概述
- 功能
- 支持的后端和客户端库
- 安装与使用
- 基本用法
- 支持with语句
- 阻塞和非阻塞api
- 同时使用两个后端
- 测试
- 文档
概述
Sherlock是一个提供易于使用的分布式进程间锁定,能够为事先的锁定选择后端同步。当使用由多个服务或分布式服务,通常需要某种锁定机制使一次访问某些资源成为可能。分布式锁或互斥锁可以帮助您实现这一点。Sherlock提供这种方法,通过提供了一个易于使用的api方便进程间的锁定,类似于标准库的threading.lock语义。除此之外,Sherlock在管理锁的选择时候还提供了使用后端的灵活性。Sherlock同时还更加简单地扩展对于某些不支持的后端。
功能
- 似于标准库的threading.lock。
- 支持WITH语句,以干净地获取和释放锁。
- 后端多样:支持Redis、Memcached和Etcd作为选项 后端。
- 可扩展性:可以很容易地扩展到并与通过扩展基锁类进行选择。读取extending。
支持的后端和客户端库
每个支持的后端都支持以下客户端库:
- redis:redis-py
- memcached:pylibmc
- etcd:python-etcd
截至目前,仅支持上述库。尽管 Sherlock接受自定义客户端对象,以便您可以轻松地提供要用于后端存储的设置,但即使api是同样的,Sherlock检查提供的客户端对象是否是受支持客户端的实例,并接受通过此检查的客户端对象。
安装与使用
安装很简单。
pip install sherlock
注意
Sherlock将安装所有支持后端。
基本用法
sherlock在api和语义层使用起来很简单,它符合标准库的threading.Lockapi。
import sherlock
from sherlock import Lock# Configure Sherlock's locks to use Redis as the backend,
# never expire locks and retry acquiring an acquired lock after an
# interval of 0.1 second.
sherlock.configure(backend=sherlock.backends.REDIS,expire=None,retry_interval=0.1)# Note: configuring sherlock to use a backend does not limit you
# another backend at the same time. You can import backend specific locks
# like RedisLock, MCLock and EtcdLock and use them just the same way you
# use a generic lock (see below). In fact, the generic Lock provided by
# sherlock is just a proxy that uses these specific locks under the hood.# 获取一个my_lock
lock = Lock('my_lock')# 获取锁
lock.acquire()# 检查锁状态
lock.locked() == True# 释放所
lock.release()
支持with语句
# using with statement
with Lock('my_lock'):# do something constructive with your locked resource herepass
阻塞和非阻塞api
# 获取非阻塞锁
lock1 = Lock('my_lock')
lock2 = Lock('my_lock')# 成功获取 lock1
lock1.acquire()# 尝试以非阻塞方式获取锁
lock2.acquire(False) == True # returns False# 尝试以阻塞方式获取锁
lock2.acquire() # 阻塞直到获得超时锁定
同时使用两个后端
将Sherlock配置为使用后端并不会限制您同时使用另一个后端。您可以导入后端特定的锁(如RedisLock,MCLock和EtcdLock),并以与使用普通锁相同的方式使用它们(请参见下文)。实际上,Sherlock提供的通用锁只是在后台使用这些特定锁的代理。
import sherlock
from sherlock import Lock# Configure Sherlock's locks to use Redis as the backend
sherlock.configure(backend=sherlock.backends.REDIS)# Acquire a lock called my_lock, this lock uses Redis
lock = Lock('my_lock')# Now acquire locks in Memcached
from sherlock import MCLock
mclock = MCLock('my_mc_lock')
mclock.acquire()
测试
要运行所有测试(包括集成),必须确保所有数据库都在运行。确保所 有服务都在运行:
# memcached
memcached# redis-server
redis-server# etcd (etcd is probably not available as package, here is the simplest way
# to run it).
wget https://github.com/coreos/etcd/releases/download/<version>/etcd-<version>-<platform>.tar.gz
tar -zxvf etcd-<version>-<platform>.gz
./etcd-<version>-<platform>/etcd
像这样运行测试:
python setup.py test
文档
具体文档可以参考:
参考文档地址
国内地址:https://gitee.com/mirrors/sherlock
国外地址:https://github.com/vaidik/sherlock
Sherlock:具有后端选择的分布式锁相关推荐
- 灵活运用分布式锁解决数据重复插入问题
作者:快应用服务器研发团队-Lin Yupan 一.业务背景 许多面向用户的互联网业务都会在系统后端维护一份用户数据,快应用中心业务也同样做了这件事.快应用中心允许用户对快应用进行收藏,并在服务端记录 ...
- Cinder-Volume如何实现AA高可用——分布式锁以及在Openstack上的应用
作者简介 付广平,云极星创研发工程师,从事Nova.Cinder研发工作,Openstack代码贡献者.北京邮电大学硕士毕业,曾先后在华为北研所2012实验室.英特尔中国研究院,以及阿里巴巴技术保障部 ...
- java如何保证redis设置过期时间的原子性_redis专题系列22 -- 如何优雅的基于redis实现分布式锁
几个概念 线程锁:主要用来给方法.代码块加锁.当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段.线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比 ...
- redis中有key但是删不掉_分布式锁用 Redis 还是 Zookeeper
为什么用分布式锁? 在讨论这个问题之前,我们先来看一个业务场景:系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户 ...
- 【Java分布式锁都有哪几种实现方式】
在分布式系统中,为了保证共享资源的互斥性,需要使用分布式锁.在Java中,实现分布式锁的方式有以下几种: 基于数据库实现分布式锁(唯一索引.悲观锁) 可以使用数据库中的唯一索引或者悲观锁来实现分布式锁 ...
- Zookeeper后端开发工具Curator的使用 | Curator对节点的增删改查 | ACL权限控制 | 分布式锁 | 分布式计数器 | 附带最新版本下载
前言 Curator是Apache开源的一个Java工具类,通过它操作Zookeeper会变得极度舒适! 前置条件:已掌握的基本操作,比如在后台可以增减节点.ACL权限设置等. 1.Zookeeper ...
- 基于后端开发Redisson实现分布式锁源码分析解读
一.分布式锁的概念和使用场景 分布式锁是控制分布式系统之间同步访问共享资源的一种方式. 在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问 ...
- 浅析“分布式锁”的实现方式丨C++后端开发丨底层原理
线程锁.进程锁以及分布式锁相关视频讲解:详解线程锁.进程锁以及分布式锁 如何高效学习使用redis相关视频讲解:10年大厂程序员是如何高效学习使用redis Linux服务器开发高级架构学习视频:C/ ...
- 记一次由Redis分布式锁造成的重大事故,避免以后踩坑!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 juejin.im/post/5f159cd8f2 ...
最新文章
- LTE基带芯片出货量首次超过50%
- java 链表反转_剑指BAT:如何最优雅着反转单链表?
- Linux|UNIX下LAMP环境的搭建及常见问题[连载3]
- 《Windows Phone 8 Development Internals》读书笔记-1-1-连载
- 博客编辑工具ckeditor
- 关注:Eclipse,转贴eclipse CDT的开发文章
- 马尔科夫模型 Markov Model
- 旅馆业等领域旅客入住身份核验解决方案
- 蔡学镛:文档模板,天使或恶魔?
- 双纵坐标绘图-Plotyy
- 2022-07-17 第四小组 孙翰章 职业规划
- 高可靠性技术之RRPP和VRRP
- 读《拆掉思维的墙》小记
- mybatis-plus在Mapper类中使用@select标签进行多表联合动态条件查询
- GitHub快速学习-一
- 华为PPPoE简单实验
- 用于指定服务器软件产品的名称,[单选] 下列说明乙肝患者病情已恢复的是()...
- 最值得收藏——免费ppt模板网站
- 电话号码 (哈希表+模拟)
- matlab输入输出gui,代码编写的 gui 实现基本的输入输出
热门文章
- JS简写技巧(来自于微信公众号-前端之巅)
- 联想服务器应用场景,联想服务器承载沈阳地铁三大核心应用
- 微信视频号信用分是什么?一起来解读一下吧
- 计算机动画专业要学什么课程,学动画专业的应该用什么什么配置的笔记本电脑?...
- sql批量更新update嵌套select更新
- ucla 计算机网络,2020年UCLA计算机工程排名珍贵干货专业讲解
- python海龟绘图画玫瑰花_python学习(二)之turtle库绘图
- 数据结构实验课:实验六、图的遍历操作及应用
- 一文带你了解外贸海关数据
- Android播放流媒体视频