Skip to main content

Redis 分布式锁

项目描述

|红锁标志|

RedLock - Redis 和 Python 的分布式锁
------------------------------------------ -------

|构建状态|

这个库实现了
`@antirez <http://antirez.com/>`__引入的RedLock算法

又一个...
~~~~~~~~~~~~~~~

已经有几个基于redis的了Python世界中的锁实现
,例如`retools <https://github.com/bbangert/retools>`__,
`redis-lock <https://pypi.python.org/pypi/redis-lock/0.2.0 >`__。

但是,这些库只能与 *single-master* redis
服务器一起使用。当 Redis 主服务器宕机时,您的应用程序必须面临
单点故障。我们不能依赖主从复制,
因为 Redis 复制是异步的。

这是主从复制
模型的明显竞争条件:

#. 客户端 A 获取到主服务器的锁。
#. 主设备在对密钥的写入传输到
从设备之前崩溃。
#. 奴隶被提升为主人。
#. 客户端 B 获得对同一个资源 A 已经持有
锁的锁。违反安全规定!

RedLock算法快速介绍
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~

为了解决这个问题,Redlock 算法假设我们有 N 个
Redis master。这些节点是完全独立的(没有复制)。在
为了获取锁,客户端会
依次尝试在所有 N 个实例中获取锁。当且仅当客户端能够
在大多数 (``(N+1)/2``) 实例中获取锁时
,才认为已获取锁。

RedLock 算法的详细描述可以在
Redis 文档中找到:`Distributed locks with
Redis <http://redis.io/topics/distlock>`__。

APIs
~~~~ ``redlock.RedLock`` 类与Python 标准库中

的 ``threading.Lock`` 类共享一个相似的 API 。基本用法^^^^^^^^^^^ .. code:: python from redlock import RedLock # 默认情况下,如果没有redis连接详细信息









# 提供,RedLock 使用 redis://127.0.0.1:6379/0
lock = RedLock("distributed_lock")
lock.acquire()
do_something()
lock.release()

With Statement / Context Manager
^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^

与 ``threading.Lock`` 一样,``redlock.RedLock`` 对象是上下文
管理器,因此支持 `With
声明 <https://docs.python.org/2/reference/datamodel.html#context-managers>`__。
这种方式更加pythonic和推荐。

.. code:: python

from redlock import RedLock
with RedLock("distributed_lock"):
do_something()

指定多个Redis节点
^^^^^^^^^^^^^^^^^^^^^^^^ ^^^

.. 代码:: python

from redlock import RedLock
with RedLock("distributed_lock",
connection_details=[
{'host': 'xxx.xxx.xxx.xxx', 'port': 6379, 'db': 0},
{'host': 'xxx. xxx.xxx.xxx','端口':6379,'db':0},
{'host':'xxx.xxx.xxx.xxx','port':6379,'db':0},
{'主机':'xxx.xxx.xxx.xxx','端口':6379,'db':0},
]
):
do_something()

| ``connection_details`` 参数需要一个
用于初始化 Redis 客户端的关键字参数列表。
| 其他可接受的 Redis 客户端参数可以在 `redis-py
文档 <http://redis-py.readthedocs.org/en/latest/#redis.StrictRedis>`__。

使用 RedLockFactory 重用 Redis 客户端
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

通常Redis 节点的连接细节是固定的。
``RedLockFactory`` 可以帮助重用它们,创建多个 RedLocks 但
只初始化客户端一次。

.. code:: python

from redlock import RedLockFactory
factory = RedLockFactory(
connection_details=[
{'host': 'xxx.xxx.xxx.xxx'},
{'host': 'xxx.xxx.xxx.xxx'},
{ '主机':'xxx.xxx.xxx.xxx'},
{'主机':'xxx.xxx.xxx.xxx'},



do_something()

with factory.create_lock("another_lock"):
do_something()

.. |RedLock logo| 图片:: https://github.com/glasslion/redlock/raw/master/docs/assets/redlock-small.png
.. |构建状态| 图片:: https://travis-ci.org/glasslion/redlock.svg?branch=master
:target: https://travis-ci.org/glasslion/redlock

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

redlock-1.2.0.tar.gz (7.2 kB 查看哈希)

已上传 source

内置分布

redlock-1.2.0-py2-none-any.whl (7.3 kB 查看哈希

已上传 2 7