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 - 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
查看哈希)
内置分布
redlock-1.2.0-py2-none-any.whl
(7.3 kB
查看哈希)