Skip to content

wemake-services/asyncio-redis-rate-limit

Repository files navigation

asyncio-redis-rate-limit

wemake.services Build Status codecov Python Version wemake-python-styleguide

Rate limiter for async functions using Redis as a backend.

Features

  • Small and simple
  • Can be used as a decorator or as a context manager
  • Can be used for both clients and servers
  • Works with asyncio
  • Works with any amount of processes
  • Works with both redis.asyncio.client.Redis and aioredis
  • Free of race-conditions (hopefully!)
  • Supports redis since 7.0
  • Fully typed with annotations and checked with mypy, PEP561 compatible

Installation

pip install asyncio-redis-rate-limit

Extras available:

  • pip install asyncio-redis-rate-limit[redis]
  • pip install asyncio-redis-rate-limit[aioredis] (for python versions <3.11)

Example

As a decorator:

>>> from asyncio_redis_rate_limit import rate_limit, RateSpec
>>> from redis.asyncio import Redis as AsyncRedis  # pip install redis

>>> redis = AsyncRedis.from_url('redis://localhost:6379')

>>> @rate_limit(
...    rate_spec=RateSpec(requests=1200, seconds=60),
...    backend=redis,
... )
... async def request() -> ...:
...     ...   # Do something useful! Call this function as usual.

Or as a context manager:

>>> from asyncio_redis_rate_limit import RateLimiter, RateSpec
>>> from redis.asyncio import Redis as AsyncRedis  # pip install redis

>>> redis = AsyncRedis.from_url('redis://localhost:6379')

>>> async def request() -> ...:
...     async with RateLimiter(
...         unique_key='api-name.com',
...         backend=redis,
...         rate_spec=RateSpec(requests=5, seconds=1),
...     ):
...         ...  # Do the request itself.

License

MIT

Credits

This project was generated with wemake-python-package. Current template version is: 1d63652fbb33ebe2f6d932f511b7f529a4ce2d2a. See what is updated since then.