Skip to main content
A little breathing room for .NET

Let your
Redis code
breathe.

A modern RESP client that feels like C#.
Fast, typed, async-first. From your first connection to your hottest Redis reads.

MIT licensedPure C#No sync-over-async
Program.csC# / .NET
using Respire;

await using var redis = await
RespireClient.ConnectAsync("redis://localhost");

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

string? greeting = await
redis.GetStringAsync("greeting");
Async all the wayRESP
Pre-release Built in the open. Evolving with you.
One client. Familiar territory.
  • Redis
  • Valkey
  • KeyDB
  • RESP3 cache
  • .NET 8+
  • Async-only
01 / Built to feel natural

Serious wire layer.
Calm application code.

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

01
string? · TimeSpan · IAsyncEnumerable

Natural .NET APIs

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

Meet the API
02
Read locally. Invalidate automatically.

Hot reads stay local

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

Explore client caching
03
Connect · observe · recover

Built for real services

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

Wire up your service
02 / Closer to your data

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.

The shorter pathKeep hot reads
close to home.
Your applicationLocal cache

Cache hit? No network round trip.

01 · missRead RedisCache response locally
02 · changeRedis pushes invalidationRespire evicts stale entry
03 · next readRefresh lazilyThen serve hot reads locally
One option. Same familiar API.
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.

03 / Room to keep moving

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