Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/SPSCommerce/redlock-py
Redis distributed locks in Python
https://github.com/SPSCommerce/redlock-py
Last synced: 3 months ago
JSON representation
Redis distributed locks in Python
- Host: GitHub
- URL: https://github.com/SPSCommerce/redlock-py
- Owner: SPSCommerce
- License: mit
- Archived: true
- Created: 2014-09-29T19:45:24.000Z (about 10 years ago)
- Default Branch: master
- Last Pushed: 2020-12-11T12:17:01.000Z (almost 4 years ago)
- Last Synced: 2024-07-16T14:09:38.141Z (4 months ago)
- Language: Python
- Size: 28.3 KB
- Stars: 571
- Watchers: 33
- Forks: 118
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
[![Coverage Status](https://coveralls.io/repos/SPSCommerce/redlock-py/badge.png)](https://coveralls.io/r/SPSCommerce/redlock-py)
redlock-py - Redis distributed locks in Python
This python lib implements the Redis-based distributed lock manager algorithm [described in this blog post](http://redis.io/topics/distlock).
To create a lock manager:
dlm = Redlock([{"host": "localhost", "port": 6379, "db": 0}, ])
To acquire a lock:
my_lock = dlm.lock("my_resource_name",1000)
Where the resource name is an unique identifier of what you are trying to lock
and 1000 is the number of milliseconds for the validity time.The returned value is `False` if the lock was not acquired (you may try again),
otherwise an namedtuple representing the lock is returned, having three fields:* validity, an integer representing the number of milliseconds the lock will be valid.
* resource, the name of the locked resource as specified by the user.
* key, a random value which is used to safe reclaim the lock.To release a lock:
dlm.unlock(my_lock)
It is possible to setup the number of retries (by default 3) and the retry
delay (by default 200 milliseconds) used to acquire the lock.Both `dlm.lock` and `dlm.unlock` raise a exception `MultipleRedlockException` if there are errors when communicating with one or more redis masters. The caller of `dlm` should
use a try-catch-finally block to handle this exception. A `MultipleRedlockException` object
encapsulates multiple `redis-py.exceptions.RedisError` objects.**Disclaimer**: This code implements an algorithm which is currently a proposal, it was not formally analyzed. Make sure to understand how it works before using it in your production environments.
Further Reading:
http://redis.io/topics/distlock
http://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html
http://antirez.com/news/101
https://medium.com/@talentdeficit/redlock-unsafe-at-any-time-40ceac109dbb#.uj9ffh96x