Skip to main content
Pre-release A modern RESP client for .NET

Let your Redis code breathe.

Fast, typed, async-first access to Redis, Valkey, KeyDB, and other RESP-compatible servers—with built-in server-assisted caching for hot Redis reads.

MIT licensedPure C#No sync-over-async
Program.cs connected
await using var redis = await
    RespireClient.ConnectAsync("redis://localhost");

await redis.SetAsync(
    "greeting",
    "hello",
    expiry: TimeSpan.FromMinutes(5));

string? greeting = await
    redis.GetStringAsync("greeting");
caller
RESP
Designed from first principles

Serious wire layer.
Calm application code.

Respire handles connection choreography so your code can speak in the language of your domain.

01

Natural .NET APIs

Real return types, honest nullability, TimeSpan-based expiry, and async streams. Protocol details stay below the surface.

02

Hot reads stay local

Redis-assisted client caching serves eligible reads from bounded process memory and evicts them from RESP3 invalidation pushes.

03

Built for real services

Reconnects, resubscribing pub/sub, OpenTelemetry, dependency injection, typed serialization, and caching adapters included.

A reason to switch

Hot Redis reads.
No Redis round trip.

Enable one option. Respire stores eligible responses in bounded process memory while Redis tells it exactly when tracked keys change. No cache-aside wrappers, notification channels, or application invalidation handlers.

01 · missRead RedisCache response locally
02 · changeRedis pushes invalidationRespire evicts stale entry
03 · next readRefresh lazilyThen serve hot reads locally
StackExchange.Redis has no equivalent built-in cache
await using var redis = await
    RespireClient.ConnectAsync(new RespireOptions
    {
        Endpoints = { new("localhost") },
        ClientSideCache = new(),
    });

// Same API. First call misses; hot reads stay local.
string? name = await redis.GetStringAsync("user:42:name");
151.5 nscached GET
186.5 μsStackExchange server GET
0 Bmissing GET cache hit

net10 BenchmarkDotNet short run. Cache hit versus server read; uncached clients measured statistically the same.

Headline capability

Blocking commands.
Nothing else blocked.

Respire routes blocking list and stream operations through dedicated pooled connections. Normal traffic keeps moving.

string? job = await redis.Lists.LeftPopAsync(
    "jobs",
    waitFor: TimeSpan.FromSeconds(30));
Build a work queue
Ready when you are

One connection string.
Your first command.

Explore core concepts, production integrations, and every escape hatch.

Read the quickstart