Skip to main content

A high-performance async caching solution for Python with extended features

Project description

async-cache-ext

A high-performance async caching solution for Python with extended features

A lightweight, efficient caching solution designed specifically for asyncio applications. Supports both LRU (Least Recently Used) and TTL (Time To Live) caching strategies with a clean, decorator-based API.

Features

  • 🚀 Async-First: Built specifically for asyncio applications
  • 🔄 Multiple Cache Types:
    • LRU (Least Recently Used) cache
    • TTL (Time To Live) cache
  • 🎯 Flexible Key Generation: Works with primitive types, custom objects, and ORM models
  • 🛠 Configurable: Adjustable cache size and TTL duration
  • 🧹 Cache Management: Clear cache on demand
  • 💡 Smart Argument Handling: Skip specific arguments in cache key generation
  • 🔍 Cache Bypass: Ability to bypass cache for specific calls

Installation

pip install async-cache-ext

Basic Usage

LRU Cache

The LRU cache maintains a fixed number of items, removing the least recently used item when the cache is full.

from cache import AsyncLRU

@AsyncLRU(maxsize=128)
async def get_user_data(user_id: int) -> dict:
    # Expensive database operation
    data = await db.fetch_user(user_id)
    return data

TTL Cache

The TTL cache automatically expires entries after a specified time period.

from cache import AsyncTTL

@AsyncTTL(time_to_live=60, maxsize=1024)
async def get_weather(city: str) -> dict:
    # External API call
    weather = await weather_api.get_data(city)
    return weather

Advanced Usage

Working with Custom Objects

The cache works seamlessly with custom objects and ORM models:

from dataclasses import dataclass
from cache import AsyncLRU

@dataclass
class UserFilter:
    age: int
    country: str
    status: str

@AsyncLRU(maxsize=128)
async def filter_users(filter_params: UserFilter) -> list:
    # Complex filtering operation
    users = await db.filter_users(
        age=filter_params.age,
        country=filter_params.country,
        status=filter_params.status
    )
    return users

Skipping Arguments

Useful for methods where certain arguments shouldn't affect the cache key:

from cache import AsyncTTL

class UserService:
    @AsyncTTL(time_to_live=300, maxsize=1000, skip_args=1)
    async def get_user_preferences(self, user_id: int) -> dict:
        # 'self' is skipped in cache key generation
        return await self.db.get_preferences(user_id)

Cache Management

Bypassing Cache

# Normal cached call
result = await get_user_data(123)

# Force fresh data
fresh_result = await get_user_data(123, use_cache=False)

Clearing Cache

# Clear the entire cache
get_user_data.cache_clear()

Performance Considerations

  • The LRU cache is ideal for frequently accessed data with no expiration requirements
  • The TTL cache is perfect for data that becomes stale after a certain period
  • Choose maxsize based on your memory constraints and data access patterns
  • Consider using skip_args when caching class methods to avoid instance-specific caching

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

License

This project is licensed under the MIT License - see the LICENSE file for details.

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_ext-1.1.1.tar.gz (8.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_ext-1.1.1-py3-none-any.whl (10.7 kB view details)

Uploaded Python 3

File details

Details for the file async_cache_ext-1.1.1.tar.gz.

File metadata

  • Download URL: async_cache_ext-1.1.1.tar.gz
  • Upload date:
  • Size: 8.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.22

File hashes

Hashes for async_cache_ext-1.1.1.tar.gz
Algorithm Hash digest
SHA256 8d1038ba375c9383842d569aa4d66af5aa3dc6042c03659497b94b60712bc52c
MD5 ec115fef1a27eaa5ab7bb173a542af11
BLAKE2b-256 fd3c470350183b91d9fdaa518a63f3cd7d241c1bc9c8f7db0d6fd27faef7c69e

See more details on using hashes here.

File details

Details for the file async_cache_ext-1.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for async_cache_ext-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 87ecd85684ec2d1a8cc56a9e2a0681c20c18680f418f9e45a1240617be88d49f
MD5 b70f686982549835de77df69b70e7f15
BLAKE2b-256 d46b701fbb8fe5223a75a912a16b974ac42f0f9a2fd3faffd34ec9b1386fa0f9

See more details on using hashes here.

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