A comprehensive Redis toolkit for Python with caching, memoization, and utilities
Project description
rediskit
A Python toolkit that provides Redis-backed performance and concurrency primitives for applications. It enables developers to add caching, distributed coordination, and data protection to their Python applications with minimal effort.
Still work in progress
Many features are still under development, there will be many breaking changes. Please use at your own risk.
Features
- Function Result Caching: Use the
@RedisMemoizedecorator to cache expensive function calls with automatic serialization, compression, and encryption - Distributed Coordination: Redis-based distributed locks and semaphores for coordinating access across multiple processes/machines
- Data Protection: Multi-version encryption keys with automatic key rotation for sensitive cached data
- Async Support: Full support for both synchronous and asynchronous applications
- Flexible Storage: Choose between string or hash-based Redis storage patterns
- Modern Type Hints: Full type safety with Python 3.12+ syntax
Installation
uv add rediskit
# or
poetry add rediskit
Quick Start
Basic Setup
from rediskit import RedisMemoize, init_redis_connection_pool
# Initialize Redis connection pool (call once at app startup)
init_redis_connection_pool()
# Cache expensive function results
@RedisMemoize(memoizeKey="expensive_calc", ttl=300)
def expensive_calculation(tenantId: str, value: int) -> dict:
# Simulate expensive computation
import time
time.sleep(2)
return {"result": value * 42}
# Usage
result = expensive_calculation("tenant1", 10) # Takes 2 seconds
result = expensive_calculation("tenant1", 10) # Returns instantly from cache
Custom Redis Connection
import redis
from rediskit import RedisMemoize
# Use your own Redis connection
my_redis = redis.Redis(host='my-redis-host', port=6379, db=1)
@RedisMemoize(
memoizeKey="custom_calc",
ttl=600,
connection=my_redis
)
def my_function(tenantId: str, data: dict) -> dict:
return {"processed": data}
Advanced Caching Options
from rediskit import RedisMemoize
# Hash-based storage with encryption
@RedisMemoize(
memoizeKey=lambda tenantId, user_id: f"user_profile:{tenantId}:{user_id}",
ttl=3600,
storageType="hash", # Store in Redis hash for efficient field access
enableEncryption=True, # Encrypt sensitive data
cacheType="zipJson" # JSON serialization with compression
)
def get_user_profile(tenantId: str, user_id: str) -> dict:
# Fetch user data from database
return {"user_id": user_id, "name": "John Doe", "email": "john@example.com"}
# Dynamic TTL and cache bypass
@RedisMemoize(
memoizeKey="dynamic_data",
ttl=lambda tenantId, priority: 3600 if priority == "high" else 300,
bypassCache=lambda tenantId, force_refresh: force_refresh
)
def get_dynamic_data(tenantId: str, priority: str, force_refresh: bool = False) -> dict:
return {"data": "fresh_data", "priority": priority}
Async Support
import asyncio
from rediskit import RedisMemoize, init_async_redis_connection_pool
# Initialize async Redis connection pool
await init_async_redis_connection_pool()
@RedisMemoize(memoizeKey="async_calc", ttl=300)
async def async_expensive_function(tenantId: str, value: int) -> dict:
await asyncio.sleep(1) # Simulate async work
return {"async_result": value * 100}
# Usage
result = await async_expensive_function("tenant1", 5)
Distributed Locking
from rediskit import GetRedisMutexLock, GetAsyncRedisMutexLock
# Synchronous distributed lock
with GetRedisMutexLock("critical_section", expire=30) as lock:
# Only one process can execute this block at a time
perform_critical_operation()
# Async distributed lock
async with GetAsyncRedisMutexLock("async_critical_section", expire=30) as lock:
await perform_async_critical_operation()
Encryption Management
from rediskit import Encrypter
# Generate new encryption keys
encrypter = Encrypter()
new_key = encrypter.generateNewHexKey()
# Encrypt/decrypt data manually
encrypted = encrypter.encrypt("sensitive data", useZstd=True)
decrypted = encrypter.decrypt(encrypted)
Configuration
Configure rediskit using environment variables:
# Redis connection settings
export REDISKIT_REDIS_HOST="localhost"
export REDISKIT_REDIS_PORT="6379"
export REDISKIT_REDIS_PASSWORD=""
# Encryption keys (base64-encoded JSON)
export REDISKIT_ENCRYPTION_SECRET="eyJfX2VuY192MSI6ICI0MGViODJlNWJhNTJiNmQ4..."
# Cache settings
export REDISKIT_REDIS_TOP_NODE="my_app_cache"
export REDISKIT_REDIS_SKIP_CACHING="false"
API Reference
Core Decorators
@RedisMemoize
Cache function results in Redis with configurable options.
Parameters:
memoizeKey: Cache key (string or callable)ttl: Time to live in seconds (int, callable, or None)bypassCache: Skip cache lookup (bool or callable)cacheType: Serialization method ("zipJson" or "zipPickled")resetTtlUponRead: Refresh TTL when reading from cacheenableEncryption: Encrypt cached datastorageType: Redis storage pattern ("string" or "hash")connection: Custom Redis connection (optional)
Connection Management
init_redis_connection_pool(): Initialize sync Redis connection poolinit_async_redis_connection_pool(): Initialize async Redis connection poolget_redis_connection(): Get sync Redis connectionget_async_redis_connection(): Get async Redis connection
Distributed Locking
GetRedisMutexLock(name, expire, auto_renewal, id): Get sync distributed lockGetAsyncRedisMutexLock(name, expire, auto_renewal): Get async distributed lock
Encryption
Encrypter(keyHexDict): Encryption/decryption with key versioning
Requirements
- Python 3.12+
- Redis server
- Dependencies: redis, redis-lock, nacl, zstd
License
Apache-2.0 license
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 rediskit-0.0.7.tar.gz.
File metadata
- Download URL: rediskit-0.0.7.tar.gz
- Upload date:
- Size: 37.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cfda426971d90be6128ee31317de31a52e3a21ab0765099ff34a69feb4210ae3
|
|
| MD5 |
1f162592e842b9dc934e5f78426f766b
|
|
| BLAKE2b-256 |
59673169b5d34bae9b855f2c9b655501519fe1d2fb019be18409a73844fe45a0
|
Provenance
The following attestation bundles were made for rediskit-0.0.7.tar.gz:
Publisher:
publish.yml on BadrElfarri/rediskit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rediskit-0.0.7.tar.gz -
Subject digest:
cfda426971d90be6128ee31317de31a52e3a21ab0765099ff34a69feb4210ae3 - Sigstore transparency entry: 251987958
- Sigstore integration time:
-
Permalink:
BadrElfarri/rediskit@90a50ff5e3f168d33cb9c622f23a8d45c2c9aedb -
Branch / Tag:
refs/tags/0.0.7 - Owner: https://github.com/BadrElfarri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@90a50ff5e3f168d33cb9c622f23a8d45c2c9aedb -
Trigger Event:
release
-
Statement type:
File details
Details for the file rediskit-0.0.7-py3-none-any.whl.
File metadata
- Download URL: rediskit-0.0.7-py3-none-any.whl
- Upload date:
- Size: 22.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b3c64bd230112369792e7e3b9e493dfd600438cd36bc0d824edf3a39b42f1d1c
|
|
| MD5 |
fc3703b6d42110878f0b0d93e2b5db9e
|
|
| BLAKE2b-256 |
0e0195ac17a663190740a5c7833aa8f1e786f3195a6832422f936f9290df3349
|
Provenance
The following attestation bundles were made for rediskit-0.0.7-py3-none-any.whl:
Publisher:
publish.yml on BadrElfarri/rediskit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rediskit-0.0.7-py3-none-any.whl -
Subject digest:
b3c64bd230112369792e7e3b9e493dfd600438cd36bc0d824edf3a39b42f1d1c - Sigstore transparency entry: 251987962
- Sigstore integration time:
-
Permalink:
BadrElfarri/rediskit@90a50ff5e3f168d33cb9c622f23a8d45c2c9aedb -
Branch / Tag:
refs/tags/0.0.7 - Owner: https://github.com/BadrElfarri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@90a50ff5e3f168d33cb9c622f23a8d45c2c9aedb -
Trigger Event:
release
-
Statement type: