A collection of helpful utilities for coredis.
Project description
coredis-utils
A collection of helpful utilities for coredis.
Features
- Caching decorator with thundering herd protection and error caching
- Idempotency keys
- Fixed-window rate limiting
Installation
$ pip install coredis-utils
Getting started
First, create a CoredisUtils object wrapping a coredis.Redis instance:
from coredis import Redis
from coredis_utils import CoredisUtils
client = Redis(...)
utils = CoredisUtils(client)
Caching is implemented with a decorator:
@utils.cached(ttl=60)
async def my_task() -> int: ...
Idempotency uses a simple check:
if await utils.idempotent("my-key", ttl=60):
... # code in this block can only run once
Rate limiting is similar:
for _ in range(10):
if await utils.limit("my-ip-addr", 5, 1): # limit to 5/second
print("success")
success
success
success
success
success
Advanced caching
Cache keys are generated using a SHA256 hash of pickled arguments. You can exclude non-serializable arguments from cache key construction:
from sqlalchemy.ext.asyncio import AsyncSession
@utils.cached(ttl=60, exclude={"session"})
async def my_task(session: AsyncSession) -> int: ...
You can also customize which parts of arguments get hashed:
@utils.cached(
ttl=60,
key_fns={
# hash just the ID, not the entire model
"user": lambda u: u.id,
# hash a couple relevant fields
"message": lambda m: (m.type, m.timestamp),
},
)
async def my_task(user: User, message: Message) -> int: ...
Errors can be cached and propagated just like normal responses:
@utils.cached(ttl=60, error_ttl=5)
async def my_task() -> int:
raise Exception("Oh no!")
You can easily invalidate keys by passing the same arguments:
@utils.cached(ttl=60)
async def my_task(time: int) -> int: ...
await my_task.invalidate(3)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file coredis_utils-0.2.0.tar.gz.
File metadata
- Download URL: coredis_utils-0.2.0.tar.gz
- Upload date:
- Size: 7.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
20834815b45cce206296e87b3931d001fb4a9b272a72839b71d02d08b43f916f
|
|
| MD5 |
59c3381a5398b33184675483114af455
|
|
| BLAKE2b-256 |
95abaf08b098199f4e3cce407f01e7ceb4e40b3bc7683ca87b3403b85702ef25
|
File details
Details for the file coredis_utils-0.2.0-py3-none-any.whl.
File metadata
- Download URL: coredis_utils-0.2.0-py3-none-any.whl
- Upload date:
- Size: 8.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9dc91e5edd263d16a3a51489150400b60beba78c6611224bb767dfe74e889da0
|
|
| MD5 |
fdc4bfcd3b2f4d08d297d336198c12fa
|
|
| BLAKE2b-256 |
1b572744b8443528ffbb8908c5d5426c844254302590e9d62efe513793fa1a7e
|