Skip to main content

Official FastAPI integration for Redis

Idiomatic Redis integration for FastAPI - connection management and DI-based caching with automatic key consistency.

Integration PyPI - Version Python Version MIT licensed Checked with mypy Ruff codecov PyPI Downloads Guide

Discord Twitch YouTube Twitter Stack Exchange questions

Features

  • Fluent setup — FastAPIRedis(app).lifespan().caching() configures pools and caching in one chain, attaching to the FastAPI lifespan events
  • Dependency injection — cache(), cache_evict(), cache_put() as Depends() factories, plus CacheBackend for complex invalidation and conditional logic
  • HTTP-native caching — ETag, 304 Not Modified, Cache-Control directives out of the box
  • Rate limiting — rate_limit() dependency with a fluent rate language ("10/second"), X-RateLimit-* / Retry-After headers, and distributed per-client counters
  • Testable — full dependency_overrides support; no need for monkey-patching
  • Pydantic-validated configuration — fully configurable via environment variables or via an .env file

Requirements

Dependency Supported versions
Python 3.10 to 3.14
FastAPI 0.115+
redis-py 6.0+
Pydantic 2.0+
Redis server 7.4+

Installation

pip install fastapi-redis-sdk

Caching

Cache GET responses with a dependency — on a hit the endpoint is skipped, on a miss the response is stored after it returns:

from fastapi import Depends, FastAPI
from redis_fastapi import FastAPIRedis, cache

app = FastAPI()
FastAPIRedis(app).lifespan().caching()

@app.get("/products/{product_id}", dependencies=[Depends(cache(ttl=300, eviction_group="products"))])
async def get_product(product_id: int):
    return await db.get_product(product_id)

cache_evict() and cache_put() handle invalidation and write-through with matching keys, and CacheBackendDep exposes imperative get/set/delete/has/delete_group for conditional logic. Cached responses carry X-Redis-Cache (HIT/MISS/BYPASS), Cache-Control and ETag headers, with 304 Not Modified for both If-None-Match and If-Modified-Since, and replay the response's own header fields on a hit.

See the Caching Guide for the full patterns, CacheBackend usage, Pydantic model caching, feature comparison, and best practices.

Rate limiting

Protect an endpoint with the rate_limit() dependency. Stack two limits to cap bursts and sustained traffic at once — a short high-rate window plus a longer low-rate window:

from fastapi import Depends, FastAPI
from redis_fastapi import FastAPIRedis, rate_limit

app = FastAPI()
FastAPIRedis(app).lifespan().rate_limiting()

@app.get(
    "/search",
    dependencies=[
        Depends(rate_limit("10/second", scope="search:burst")),      # burst
        Depends(rate_limit("100/minute", scope="search:sustained")),  # sustained
    ],
)
async def search():
    return {"results": [...]}

Both limits count per client IP by default; a request must satisfy both, and the distinct scope keeps the two counters independent on the same route. When either is exceeded the request gets a 429 Too Many Requests with Retry-After, and every response carries X-RateLimit-Limit / -Remaining / -Reset. Counters live in Redis, so limits hold across every worker and pod.

See the Rate Limiting Guide for identifiers, the global limiter, custom responses, IETF headers, and the imperative backend.

Sessions

Keep session data in Redis. The cookie holds only an opaque session ID:

from fastapi import Depends, FastAPI
from redis_fastapi import FastAPIRedis, SessionDep, valid_session

app = FastAPI()
FastAPIRedis(app).lifespan().sessions()

@app.post("/login")
async def login(session: SessionDep):
    session["user_id"] = 42  # rotates the session ID after the endpoint completes
    return {"ok": True}

@app.get("/me", dependencies=[Depends(valid_session())])
async def me(session: SessionDep):
    return {"user_id": session.get("user_id")}

Redis enforces an idle timeout and an absolute timeout. valid_session() returns 401 when a request has no live session, and request.session works as it does with Starlette's SessionMiddleware.

See the Sessions Guide for timeouts, sign-out everywhere, CSRF, encryption and migration.

Configuration

All settings are read from environment variables (prefixed REDIS_) or a .env file. Set REDIS_URL for the simplest setup:

export REDIS_URL=redis://user:pass@host:6379/0

Or configure individual fields:

export REDIS_HOST=redis.example.com
export REDIS_PORT=6380
export REDIS_PASSWORD=secret

Additional options: TLS (REDIS_SSL, REDIS_SSL_CERTFILE, etc.), connection pool (REDIS_MAX_CONNECTIONS, REDIS_SOCKET_TIMEOUT), OSS Cluster mode (REDIS_CLUSTER=true), key prefix (REDIS_PREFIX), and default cache TTL (REDIS_DEFAULT_TTL, default 0 = no expiry).

For programmatic configuration:

from redis_fastapi import get_settings

settings = get_settings()
settings.url = "redis://custom:6379/0"
settings.default_ttl = 120

See the Configuration Guide for the full environment variable reference and API details.

Metadata

Release files for fastapi-redis-sdk 0.9.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fastapi-redis-sdk 0.9.0
File Size Uploaded
fastapi_redis_sdk-0.9.0.tar.gz 95.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fastapi-redis-sdk 0.9.0
File Interpreter ABI Platform
fastapi_redis_sdk-0.9.0-py3-none-any.whl Python 3 none any Details

Total release size: 198.1 kB

Release files / fastapi_redis_sdk-0.9.0.tar.gz

Download URL fastapi_redis_sdk-0.9.0.tar.gz
Size 95.6 kB
Tags Source
SHA-256 checksum
How to use checksums
6fc7e5cfbf1d1baade7b07feeea3b8c24d40ce8befced79799b0064512b794dd
BLAKE2b-256 checksum
How to use checksums
9193c6366dc30b7441a2757b3b8ff385865d0e9505d5fc91f70c6ccf30ef229b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / fastapi_redis_sdk-0.9.0-py3-none-any.whl

Download URL fastapi_redis_sdk-0.9.0-py3-none-any.whl
Size 102.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d08ed2155b26449c64b17d8a77fdee3befb4ff0afbc3cdf9670c22601a6b045f
BLAKE2b-256 checksum
How to use checksums
95fae0ec7b86db992f1486430a1e363978689627910b5ec8f74f23cd64852a48
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.9.0 This release

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release 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