Skip to main content

an asyncio application layer cache and dataloader for python based microservices and applications with thundering herd protection

Project description

info:

In-memory application layer cache

https://img.shields.io/pypi/v/async-cache.svg https://www.codetriage.com/iamsinghrajat/async-cache/badges/users.svg https://static.pepy.tech/personalized-badge/async-cache?period=total&units=international_system&left_color=black&right_color=blue&left_text=Downloads

Installation

pip install async-cache

See full documentation at https://async-cache.readthedocs.io/

Core Usage: Function API for Microservices

Use AsyncCache for flexible caching:

from cache import AsyncCache

cache = AsyncCache(maxsize=1000, default_ttl=300)  # TTL in seconds

async def get_data(key):
    return await cache.get(
        key,
        loader=lambda: db_query(key),  # auto-caches on miss
    )

# Warmup hot keys at startup
await cache.warmup({"hot:key": lambda: preload_hot()})

# Metrics for observability
print(cache.get_metrics())  # hits, misses, size, hit_rate

Key Features & Examples

Thundering Herd Protection

Prevents duplicate work under concurrent load (e.g., popular keys). Without it, 100 misses = 100 DB hits; with it, = 1.

cache = AsyncCache()
async def loader():
    return await db_query()  # expensive
# 100 concurrent -> 1 loader call
results = await asyncio.gather(*[cache.get('key', loader=loader) for _ in range(100)])
DataLoader-Style Batching

Groups concurrent gets into one batch call (reduces DB load; configurable window/size).

async def batch_loader(keys):
    # one DB query for batch
    return {k: await db_batch_query(k) for k in keys}
# auto-groups within 5ms window
await asyncio.gather(
    cache.get(1, batch_loader=batch_loader),
    cache.get(2, batch_loader=batch_loader)
)
Cache Warmup

Preload at startup to avoid cold misses.

await cache.warmup({
    "user:1": lambda: load_user(1),
    "config:global": lambda: load_config(),
})
Metrics

Observability for hit rate, size, etc. (global or per-function).

metrics = cache.get_metrics()  # or func.get_metrics()
# {'hits': 950, 'misses': 50, 'size': 200, 'hit_rate': 0.95}
# Use for Prometheus/monitoring
TTL & Invalidation

Per-key control + size-based eviction.

await cache.set('key', value, ttl=60)  # override
await cache.delete('key')  # or func.invalidate_cache(args)
cache.clear()

Decorator Convenience

For simple/readable code (uses core API under the hood):

from cache import AsyncLRU, AsyncTTL

@AsyncLRU(maxsize=128)
async def func(*args):
    ...

@AsyncTTL(time_to_live=60, skip_args=1)  # e.g. skip 'self'
async def method(self, arg):
    ...

Testing

A local test dashboard is available for interactive testing:

python demo/app.py  # Runs on http://localhost:5001

Use it to verify caching behavior, metrics, and concurrent load handling.

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

async_cache-2.0.3.tar.gz (18.9 kB view details)

Uploaded Source

Built Distribution

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

async_cache-2.0.3-py3-none-any.whl (9.9 kB view details)

Uploaded Python 3

File details

Details for the file async_cache-2.0.3.tar.gz.

File metadata

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

File hashes

Hashes for async_cache-2.0.3.tar.gz
Algorithm Hash digest
SHA256 b59fa5ffcc0490fe993dc5bc07b7b7110e31ba0204693188e2569a839b28c51b
MD5 4e061e28cb71cbceea319d8a8331a86b
BLAKE2b-256 f348eeeef74bc9c60cbd240b108901eaaab8de330c519ede4d6fbac70c1e0e15

See more details on using hashes here.

Provenance

The following attestation bundles were made for async_cache-2.0.3.tar.gz:

Publisher: python-publish.yml on iamsinghrajat/async-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 async_cache-2.0.3-py3-none-any.whl.

File metadata

  • Download URL: async_cache-2.0.3-py3-none-any.whl
  • Upload date:
  • Size: 9.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for async_cache-2.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 a28b93156ab253d400a34c6fb46e618a7709fc15fc8516b530d4ea61abc010a7
MD5 29e21e08e394aac7c58cd45dd8d5621e
BLAKE2b-256 d26fd3278dfbe128f73f909872dbc5e3116bd22542cba35450cb0725159e351b

See more details on using hashes here.

Provenance

The following attestation bundles were made for async_cache-2.0.3-py3-none-any.whl:

Publisher: python-publish.yml on iamsinghrajat/async-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