Skip to main content

Secure and efficient distributed locks (Radisson like) implemetation

Project description

aioredlock-py

fury licence pyversions Publish Build Docs

Secure and efficient distributed locks (Redisson like) implemetation. Ensure efficient performance with biased locking's implementation, can load more than 1k/s of concurrent requests with default parameter settings.

Requirements

  • aioredis>=2.0.0

Install

pip install aioredlock-py

Feature

  • Ensure reliability with context manager.
  • Use lua scripts to ensure atomicity on lock release.
  • Notification prompt you to cancel the following execution if acquisition fails
  • Reliable in high concurrency.

Documentation

https://aioredlock-py.readthedocs.io

Basic usage

import asyncio
import aioredis
from aioredlock_py import Redisson

async def single_thread(redis):
    for _ in range(10):
        async with Redisson(redis, key="no1") as lock:
            if not lock:
                # If the lock still fails after several attempts, `__aenter__` 
                # will return None to prompt you to cancel the following execution
                return 'Do something, failed to acquire lock' # raise ...
            # else 
            # Service logic protected by Redisson
            await redis.incr("foo")

async def test_long_term_occupancy(redis):
    async with Redisson(redis, key="no1", ex=10) as lock:
        if not lock: return;
        # Service logic protected by Redisson
        await redis.set("foo", 0)
        # By default, a lock is automatically released if no action is 
        # taken for 20 seconds after redisson holds it. Let's assume that 
        # your service logic takes a long time (30s in this case) to process,
        # you don't need to worry about it causing chaos, because there's 
        # background threads help you automatically renew legally held locks.
        await asyncio.sleep(30)
        await redis.incr("foo")


async def main():
    redis = aioredis.from_url("redis://localhost")
    await redis.delete("redisson:no1")
    await redis.set("foo", 0)
    await asyncio.gather(*(single_thread(redis) for _ in range(20)))
    assert int(await redis.get("foo")) == 200
    # test_long_term_occupancy(redis)

asyncio.run(main())

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_py-0.1.5.tar.gz (6.0 kB view details)

Uploaded Source

Built Distribution

aioredlock_py-0.1.5-py3-none-any.whl (6.5 kB view details)

Uploaded Python 3

File details

Details for the file aioredlock_py-0.1.5.tar.gz.

File metadata

  • Download URL: aioredlock_py-0.1.5.tar.gz
  • Upload date:
  • Size: 6.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.8.12

File hashes

Hashes for aioredlock_py-0.1.5.tar.gz
Algorithm Hash digest
SHA256 fd56ef89fd9d6b82916ceb9404cd2bd050610e37fe3cc59611a5582982f01028
MD5 e9b2cf4cb434b05cb89e116acd9259a9
BLAKE2b-256 6f13547bbf3253de66806ec2f5309294dfcb43753b5bd9b686151757e6e68f7a

See more details on using hashes here.

File details

Details for the file aioredlock_py-0.1.5-py3-none-any.whl.

File metadata

File hashes

Hashes for aioredlock_py-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 3e3b6448eb79b0d181b41df66f826fa54d4fa9986f4dc2a26ccdf135f8b95b44
MD5 c77b778cf9788495d2d4a73ee8756257
BLAKE2b-256 6c2452daa6e1bc8c3045876d22f476dd5e5736a01d7b23073081104fc6649ac9

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