Skip to main content

An ultra-fast local cache for Python, powered by Rust.

Project description

rust-py-cache

An ultra-fast local cache for Python, powered by Rust.

A local, in-memory, thread-safe cache with TTL, lazy expiration, and metrics. The core is written in Rust (PyO3 + maturin) on top of a concurrent DashMap; the Python API is minimal. Think of it as a "mini Redis" living inside your Python process.

PyPI Python License: MIT

🌐 Website: rust-py-cache.vercel.app

Installation

pip install rust-py-cache

To work on it locally (requires Rust + maturin):

python -m venv .venv && source .venv/bin/activate
pip install maturin pytest
maturin develop          # compiles the Rust core and installs into the venv
pytest                   # runs the tests

Usage

from rust_py_cache import Cache

cache = Cache()

cache.set("user:1", {"name": "Roberto"}, ttl=60)   # ttl in seconds
user = cache.get("user:1")                          # {"name": "Roberto"}
cache.get("missing", default=0)                     # 0

cache.exists("user:1")        # True (honors TTL)
cache.delete("user:1")        # True if removed, False if absent
cache.len()                   # approximate size
cache.keys()                  # list of keys
cache.cleanup_expired()       # remove expired entries; returns the count
cache.clear()                 # remove everything (keeps counters)
cache.stats()                 # {'hits', 'misses', 'sets', 'deletes', 'expired', 'size'}

Memoization decorator

@cache.cached(ttl=60)
def add(a, b):
    return a + b

add(2, 3)   # runs and caches
add(2, 3)   # served from cache

# custom key (fixed string or callable):
@cache.cached(ttl=300, key=lambda user_id: f"user:{user_id}")
def load_user(user_id):
    ...

See full examples under examples/ (FastAPI and Django).

API

Method Description
set(key, value, ttl=None) Store a value. ttl in seconds (int/float); None = no expiration; ttl <= 0ValueError. Overwrites.
get(key, default=None) The value, or default if missing/expired (expired entries are removed).
delete(key) True if removed, False if it didn't exist.
exists(key) True/False, honoring TTL.
keys() List of keys (may include expired-but-not-yet-collected ones).
len() / len(cache) Approximate size.
clear() Remove everything (does not reset counters).
cleanup_expired() Remove expired entries; returns how many.
stats() dict with hits, misses, sets, deletes, expired, size.
@cache.cached(ttl=None, key=None) Memoization decorator.

How it works

  • Serialization: in the MVP, values are serialized with pickle (on the Python side, via PyO3) and stored as opaque bytes (Vec<u8>) in the Rust core.
  • Concurrency: DashMap (a HashMap with per-shard locks) plus AtomicU64 counters, with no global lock on the hot path. Thread-safe, no busy loop.
  • TTL: expiration is lazy — an expired key is removed when accessed (get/exists) or via cleanup_expired(). There is no background thread in the MVP.

Limitations

  • The cache is process-local: multiple workers = multiple independent caches.
  • It does not replace Redis for distributed caching.
  • Data is lost when the process restarts.
  • pickle must not be used to deserialize untrusted data.
  • Lazy TTL: expired items may linger until accessed or until cleanup_expired().

Development

cargo test          # Rust core tests
maturin develop     # rebuild and install
pytest              # Python tests

If maturin develop complains about both VIRTUAL_ENV and CONDA_PREFIX being set, run conda deactivate first, or use env -u CONDA_PREFIX maturin develop.

Roadmap

Stages and next steps (LRU/LFU eviction, background expiration, configurable serializer, namespaces, etc.) are in ROADMAP.md.

License

MIT

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

rust_py_cache-0.1.3.tar.gz (20.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rust_py_cache-0.1.3-cp310-abi3-win_amd64.whl (161.1 kB view details)

Uploaded CPython 3.10+Windows x86-64

rust_py_cache-0.1.3-cp310-abi3-manylinux_2_34_x86_64.whl (307.9 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.34+ x86-64

rust_py_cache-0.1.3-cp310-abi3-macosx_11_0_arm64.whl (266.9 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

Details for the file rust_py_cache-0.1.3.tar.gz.

File metadata

  • Download URL: rust_py_cache-0.1.3.tar.gz
  • Upload date:
  • Size: 20.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rust_py_cache-0.1.3.tar.gz
Algorithm Hash digest
SHA256 f61cd5c595cbd081b92e0dabc385f9fb586a3b6937da0dac7ed6e75d1db8af58
MD5 23cc20f76559b9df3661e3d5d54a0e4d
BLAKE2b-256 4079d529c4559e4c723df3d856397e144082ab9780dadd965fada09048504b4a

See more details on using hashes here.

Provenance

The following attestation bundles were made for rust_py_cache-0.1.3.tar.gz:

Publisher: release.yml on robertolima-dev/rust-py-cache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rust_py_cache-0.1.3-cp310-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for rust_py_cache-0.1.3-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 1d4130b21ea09d0e45649c2be2e70e49922393ac88fc66fd3a9621d3f68e5421
MD5 bd0253dc367cf4ad07e160aa9f139684
BLAKE2b-256 3d6d5d51778682603bef0f6136c101b39212781efb021feddb8b9f652b2720fb

See more details on using hashes here.

Provenance

The following attestation bundles were made for rust_py_cache-0.1.3-cp310-abi3-win_amd64.whl:

Publisher: release.yml on robertolima-dev/rust-py-cache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rust_py_cache-0.1.3-cp310-abi3-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for rust_py_cache-0.1.3-cp310-abi3-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 7e77d3e3aab214cd665e3cbec051ffa8cfc0990a9df7c092698b71999aa68168
MD5 fb7f67801b9ad62839d0da001f6dc29a
BLAKE2b-256 3832df41e506a3ecfd9ccc41884fef7ab0030730f9677c5119874b0488762d49

See more details on using hashes here.

Provenance

The following attestation bundles were made for rust_py_cache-0.1.3-cp310-abi3-manylinux_2_34_x86_64.whl:

Publisher: release.yml on robertolima-dev/rust-py-cache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rust_py_cache-0.1.3-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rust_py_cache-0.1.3-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 57e624cfa08ef43d69ba20dc716dcdffe8dd9058f69875f59aff38c95b8bc613
MD5 c1e1844b30fc39a16c0b0a699036280c
BLAKE2b-256 6c1503a693e976c14beeae71796b4c95007d82518d1f0151d8980fdcb65bd302

See more details on using hashes here.

Provenance

The following attestation bundles were made for rust_py_cache-0.1.3-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on robertolima-dev/rust-py-cache

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page