Skip to main content

lexigram-cache

Multi-backend caching system for Lexigram Framework — Redis, Memcached, and in-memory caching.


Overview

Multi-backend async caching for the Lexigram Framework. Supports Redis, in-memory, and Memcached backends with stampede protection, circuit breaker, Result-aware caching, and domain model round-trip serialization.

Configure backends via CacheModule.configure() and inject CacheBackendProtocol into any service. The @cacheable decorator provides cache-aside logic with automatic key generation and Result support.

Full documentation: docs.lexigram.dev

Install

uv add lexigram-cache
# Optional extras
uv add "lexigram-cache[redis,memcached,semantic]"

Quick Start

from lexigram import Application
from lexigram.di.module import Module, module
from lexigram.cache import CacheModule, CacheConfig
from lexigram.cache.config import CacheBackendConfig
from lexigram.cache.types import BackendType
from lexigram.contracts.infra.cache import CacheBackendProtocol


@module(
    imports=[
        CacheModule.configure(
            CacheConfig(
                backends=[
                    CacheBackendConfig(
                        name="default",
                        type=BackendType.REDIS,
                        default=True,
                        redis_url="redis://localhost:6379/0",
                    )
                ]
            )
        )
    ]
)
class AppModule(Module):
    pass


async def main():
    async with Application.boot(modules=[AppModule]) as app:
        cache = await app.container.resolve(CacheBackendProtocol)
        await cache.set("greeting", "hello", ttl=60)
        value = await cache.get("greeting")
        print(value.unwrap())  # "hello"


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

Configuration

Zero-config usage: Call CacheModule.configure() with no arguments; backends are then loaded from the cache: section of application.yaml. Use CacheModule.stub() (in-memory) in tests.

Option 1 — YAML file

# application.yaml
cache:
  enabled: true
  backends:
    - name: redis
      type: redis
      default: true
      redis_url: "redis://localhost:6379/0"
      default_ttl: 300
  service:
    enable_protection: true

Option 2 — Profiles + Environment Variables (recommended)

export LEX_CACHE__ENABLED=true
export LEX_CACHE__BACKENDS__0__TYPE=redis
export LEX_CACHE__BACKENDS__0__REDIS_URL=redis://localhost:6379/0

Option 3 — Python

from lexigram.cache import CacheModule, CacheConfig
from lexigram.cache.config import CacheBackendConfig
from lexigram.cache.types import BackendType

CacheModule.configure(
    CacheConfig(
        backends=[
            CacheBackendConfig(
                name="redis",
                type=BackendType.REDIS,
                default=True,
                redis_url="redis://localhost:6379/0",
            )
        ]
    )
)

Config reference

Field Default Env var Description
enabled True LEX_CACHE__ENABLED Enable the cache module
backends[].name LEX_CACHE__BACKENDS__0__NAME Unique backend name
backends[].type LEX_CACHE__BACKENDS__0__TYPE Backend type: redis, memory, memcached
backends[].redis_url LEX_CACHE__BACKENDS__0__REDIS_URL Redis connection URL
backends[].default_ttl null LEX_CACHE__BACKENDS__0__DEFAULT_TTL Default TTL in seconds
service.enable_protection True LEX_CACHE__SERVICE__ENABLE_PROTECTION Stampede protection
service.circuit_breaker_enabled False LEX_CACHE__SERVICE__CIRCUIT_BREAKER_ENABLED Circuit breaker on backend failures

Module Factory Methods

Method Description
CacheModule.configure(...) Configure with explicit CacheConfig
CacheModule.stub() In-memory backend for unit testing

Key Features

  • Multi-backend — Redis, in-memory, and Memcached with a unified protocol
  • Stampede protection — Distributed lock on cold reads prevents thundering herd
  • Circuit breaker — Opens on repeated backend failures, falls through to origin
  • @cacheable decorator — Cache-aside with automatic key generation and Result support
  • Domain model serialization — Type-tagged JSON envelope preserves type identity round-trip
  • Production security — Blocks insecure Redis passwords when LEX_ENV=production

Testing

from lexigram.cache import CacheService

async with Application.boot(modules=[CacheModule.stub()]) as app:
    cache = await app.container.resolve(CacheService)
    await cache.set("key", "value", ttl=60)
    assert await cache.get("key") == "value"

Key Source Files

File What it contains
src/lexigram/cache/module.py CacheModule with configure() and stub()
src/lexigram/cache/config.py CacheConfig, CacheBackendConfig, CacheServiceConfig
src/lexigram/cache/di/provider.py CacheProvider boot and registration
src/lexigram/cache/decorators.py @cacheable decorator
src/lexigram/cache/backends/ Redis, in-memory, and Memcached implementations

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lexigram_cache-0.1.5001.tar.gz (168.8 kB view details)

Uploaded Source

Built Distribution

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

lexigram_cache-0.1.5001-py3-none-any.whl (139.6 kB view details)

Uploaded Python 3

File details

Details for the file lexigram_cache-0.1.5001.tar.gz.

File metadata

  • Download URL: lexigram_cache-0.1.5001.tar.gz
  • Upload date:
  • Size: 168.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.14

File hashes

Hashes for lexigram_cache-0.1.5001.tar.gz
Algorithm Hash digest
SHA256 d941e22fee1d17a7c2c00100289ca3df149f0e3ef69dfd3413604a07fa94a2dc
MD5 6eeaa8c955df7e703808e1070f520a67
BLAKE2b-256 05488d9083ef70ae3b6d5988090aa40a9d504d50babf1dc49f8fb498805aff98

See more details on using hashes here.

File details

Details for the file lexigram_cache-0.1.5001-py3-none-any.whl.

File metadata

File hashes

Hashes for lexigram_cache-0.1.5001-py3-none-any.whl
Algorithm Hash digest
SHA256 bdd54af5357632b403e2df45457c191ce0eb9d537a26ae3ac7fcb800f9ddfe74
MD5 e24c949f8bcebf5278e60145e1de45b5
BLAKE2b-256 762b692d878ad857aabb7a34a464f26e5285588d8d00b6dde01353ed2e559ee5

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.5009

1 file

0.1.5006

2 files

This release

0.1.5001 This release

2 files

0.1.3007

1 file

0.1.3006

1 file

0.1.3005

1 file

0.1.4

2 files

0.1.2

1 file

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page