Skip to main content

Asyncio implemetation of Redis distributed locks (Neorisk)

Project description

https://github.com/joanvila/aioredlock/workflows/Tests/badge.svg https://codecov.io/gh/joanvila/aioredlock/branch/master/graph/badge.svg https://badge.fury.io/py/aioredlock.svg

The asyncio redlock algorithm implementation.

Redlock and asyncio

The redlock algorithm is a distributed lock implementation for Redis. There are many implementations of it in several languages. In this case, this is the asyncio compatible implementation for python 3.5+.

Usage

from aioredlock import Aioredlock, 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:
assert not await lock_manager.is_locked("resource_name")

# Try to acquire the lock:
try:
    lock = await lock_manager.lock("resource_name", lock_timeout=10)
except LockError:
    print('Lock not acquired')
    raise

# Now the lock is acquired:
assert lock.valid
assert await lock_manager.is_locked("resource_name")

# Extend lifetime of the lock:
await lock_manager.extend(lock, lock_timeout=10)
# Raises LockError if the lock manager can not extend the lock lifetime
# on more then half of the Redis instances.

# Release the lock:
await lock_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:
assert not lock.valid
assert not await lock_manager.is_locked("resource_name")

# Or you can use the lock as async context manager:
try:
    async with await lock_manager.lock("resource_name") as lock:
        assert lock.valid is True
        # Do your stuff having the lock
        await lock.extend()  # alias for lock_manager.extend(lock)
        # Do more stuff having the lock
    assert lock.valid is False # lock will be released by context manager
except LockError:
    print('Lock not acquired')
    raise

# Clear the connections with Redis:
await lock_manager.destroy()

How it works

The Aioredlock constructor accepts the following optional parameters:

  • redis_connections: A list of connections (dictionary of host and port and kwargs for aioredis.create_redis_pool(), or tuple (host, port), or string Redis URI) where the Redis instances are running. The default value is [{'host': 'localhost', 'port': 6379}].

  • retry_count: An integer representing number of maximum allowed retries to acquire the lock. The default value is 3 times.

  • retry_delay_min and retry_delay_max: Float values representing waiting time (in seconds) before the next retry attempt. The default values are 0.1 and 0.3, respectively.

In order to acquire the lock, the lock function should be called. If the lock operation is successful, lock.valid will be true, if the lock is not acquired then the LockError will be raised.

From that moment, the lock is valid until the unlock function is called or when the lock_timeout is reached.

Call the extend function to reset lifetime of the lock to lock_timeout interval.

Use the is_locked function to check if the resource is locked by other redlock instance.

In order to clear all the connections with Redis, the lock_manager destroy method can be called.

To-do

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aioredlock-neorisk-0.4.0.tar.gz (7.8 kB view details)

Uploaded Source

Built Distribution

aioredlock_neorisk-0.4.0-py3-none-any.whl (9.3 kB view details)

Uploaded Python 3

File details

Details for the file aioredlock-neorisk-0.4.0.tar.gz.

File metadata

  • Download URL: aioredlock-neorisk-0.4.0.tar.gz
  • Upload date:
  • Size: 7.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.3

File hashes

Hashes for aioredlock-neorisk-0.4.0.tar.gz
Algorithm Hash digest
SHA256 80b6933ed8cd64aaf68a8fab8e33e0d364f8dee3f2a8329b14c82468ecadd8d0
MD5 69d43fb7ad6f729cc3b7e8183a14c42d
BLAKE2b-256 450c02e34ac26290c70c27f4d6fb82747b54327ffb202a613a9c667fe5fa22fa

See more details on using hashes here.

File details

Details for the file aioredlock_neorisk-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: aioredlock_neorisk-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 9.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.3

File hashes

Hashes for aioredlock_neorisk-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 43359ec4a83e913343f9f0d2bf1d5ebdb322edb01f9f132da6532a6fa2db00c5
MD5 10427ed0b29192e239f28f4bb0d37ee4
BLAKE2b-256 e2a913cbf0ebb99b2c20ee86419392dcbea15a9b570f4acd6dbaa1583ef08543

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page