py-cachify is a library that provides small but useful cache utilities.
Some parts were heavily inspired by douglasfarinelli's python-cachelock lib, which is sadly no longer maintained.
py-cachify works well in both sync and async environments, has 100% test coverage, is backend agnostic (you can provide your own client as long as it matches the signature), and supports Python from 3.8 and upward.
It offers distributed (cache based) locks and decorators for securing function executions and storing their results in the cache.
Detailed documentation can be found at https://py-cachify.readthedocs.io/en/latest/.
To install:
pip install py-cachify
# or if using poetry
poetry add py-cachify
To start working with it, you'll have to initialize it using init_cachify
:
from py_cachify import init_cachify
init_cachify()
By default, it will use an in-memory cache.
If you want to use Redis:
from py_cachify import init_cachify
from redis.asyncio import from_url as async_from_url
from redis import from_url
init_cachify(sync_client=from_url(redis_url), async_client=async_from_url(async_redis_client))
Normally you wouldn't have to use both sync and async clients since an application usually works in a single mode i.e. sync/async.
Once initialized you can use everything that the library provides straight up without being worried about managing the cache yourself.
If you forgot to call init_cachify
the CachifyInitError
will be raised during runtime.
from py_cachify import once
# Make sure there is just one copy of a function running at a time
@once(key='long_running_function')
async def long_running_function() -> str:
# Executing long-running operation...
pass
For more detailed documentation and examples please visit https://py-cachify.readthedocs.io/en/latest/.
If you'd like to contribute, please first discuss the changes using Issues, and then don't hesitate to shoot a PR which will be reviewed shortly.
This project is licensed under the MIT License - see the LICENSE file for details.