Skip to content
DocsTry Aspire
DocsTry

Set up Redis in the AppHost

Redis logo

This article is the reference for the Aspire Redis Hosting integration. It enumerates the AppHost APIs — with examples for both AppHost.cs and apphost.mts — that you use to model a Redis resource in your AppHost project.

If you’re new to the Redis integration, start with the Get started with Redis integrations guide. For how consuming apps read the connection information this page exposes, see Connect to Redis.

To start building an Aspire app that uses Redis, install the 📦 Aspire.Hosting.Redis NuGet package:

Terminal
aspire add redis

Learn more about aspire add in the command reference.

This updates your aspire.config.json with the Redis hosting integration package:

aspire.config.json
{
"packages": {
"Aspire.Hosting.Redis": "13.5.3"
}
}

Once you’ve installed the hosting integration in your AppHost project, you can add a Redis resource as shown in the following examples:

apphost.mts
import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
const cache = await builder.addRedis("cache");
await builder.addNodeApp("api", "./api", "index.js")
.withReference(cache);
// After adding all resources, run the app...
  1. When Aspire adds a container image to the AppHost, as shown in the preceding example with the docker.io/library/redis image, it creates a new Redis instance on your local machine.

  2. The Redis resource is configured with a randomly generated password by default. To set an explicit password, see Add Redis resource with parameters.

  3. The AppHost reference call configures a connection in the consuming project named after the referenced Redis resource, such as cache in the preceding example.

  • Redis container imageDocker Hub
    docker.io/library/redis:8.6

    Added by AddRedis()addRedis().

    Source

Tags reflect the latest defaults on the microsoft/aspire main branch, and may be newer than the version pinned by the package you install.

Add a data volume to the Redis resource as shown in the following examples:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const cache: RedisResource
cache
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addRedis(name: string, options?: {
port?: number;
password?: string | ParameterResource;
}): RedisResource (+1 overload)

Adds a Redis container to the application model.

addRedis
("cache");
await
const cache: RedisResource
cache
.
RedisResource.withDataVolume(options?: {
name?: string;
isReadOnly?: boolean;
} | undefined): RedisResource (+1 overload)

Adds a named volume for the data folder to a Redis container resource and enables Redis persistence.

withDataVolume
({
isReadOnly?: boolean | undefined
isReadOnly
: false });
await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource

Adds a node application to the application model. Node should be available on the PATH.

addNodeApp
("api", "./api", "index.js")
.
ExecutableResource.withReference(source: EndpointReference | string | uri, options?: {
connectionName?: string;
optional?: boolean;
name?: string;
} | undefined): NodeAppResource (+1 overload)

Adds a reference to another resource

withReference
(
const cache: RedisResource
cache
);
// After adding all resources, run the app...

The data volume is used to persist Redis data outside the lifecycle of its container. The data volume is mounted at the /data path in the Redis container, and when a name parameter isn’t provided, the name is generated at random. Calling WithDataVolume (or withDataVolume) also enables Redis persistence so the in-memory state survives container restarts. For more information on data volumes and details on why they’re preferred over bind mounts, see Docker docs: Volumes.

Add a data bind mount to the Redis resource as shown in the following examples:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const cache: RedisResource
cache
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addRedis(name: string, options?: {
port?: number;
password?: string | ParameterResource;
}): RedisResource (+1 overload)

Adds a Redis container to the application model.

addRedis
("cache");
await
const cache: RedisResource
cache
.
RedisResource.withDataBindMount(source: string, options?: {
isReadOnly?: boolean;
} | undefined): RedisResource (+1 overload)

Adds a bind mount for the data folder to a Redis container resource and enables Redis persistence.

withDataBindMount
("C:\\Redis\\Data", {
isReadOnly?: boolean | undefined
isReadOnly
: false });
await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource

Adds a node application to the application model. Node should be available on the PATH.

addNodeApp
("api", "./api", "index.js")
.
ExecutableResource.withReference(source: EndpointReference | string | uri, options?: {
connectionName?: string;
optional?: boolean;
name?: string;
} | undefined): NodeAppResource (+1 overload)

Adds a reference to another resource

withReference
(
const cache: RedisResource
cache
);
// After adding all resources, run the app...

Data bind mounts rely on the host machine’s filesystem to persist Redis data across container restarts. The data bind mount is mounted at the C:\Redis\Data on Windows (or /Redis/Data on Unix) path on the host machine in the Redis container. As with WithDataVolume, this call also enables persistence. For more information on data bind mounts, see Docker docs: Bind mounts.

To configure Redis snapshot persistence explicitly, call WithPersistence (or withPersistence) alongside a data volume or bind mount:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const cache: RedisResource
cache
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addRedis(name: string, options?: {
port?: number;
password?: string | ParameterResource;
}): RedisResource (+1 overload)

Adds a Redis container to the application model.

addRedis
("cache");
await
const cache: RedisResource
cache
.
RedisResource.withDataVolume(options?: {
name?: string;
isReadOnly?: boolean;
} | undefined): RedisResource (+1 overload)

Adds a named volume for the data folder to a Redis container resource and enables Redis persistence.

withDataVolume
();
await
const cache: RedisResource
cache
.
RedisResource.withPersistence(options?: {
interval?: timespan;
keysChangedThreshold?: number;
} | undefined): RedisResource (+1 overload)

Configures a Redis container resource for persistence.

withPersistence
({
interval?: timespan | undefined
interval
: 5 * 60 * 1000,
keysChangedThreshold?: number | undefined
keysChangedThreshold
: 100,
});
await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource

Adds a node application to the application model. Node should be available on the PATH.

addNodeApp
("api", "./api", "index.js")
.
ExecutableResource.withReference(source: EndpointReference | string | uri, options?: {
connectionName?: string;
optional?: boolean;
name?: string;
} | undefined): NodeAppResource (+1 overload)

Adds a reference to another resource

withReference
(
const cache: RedisResource
cache
);
// After adding all resources, run the app...

The preceding code adds explicit persistence to the Redis resource by snapshotting data at the configured interval whenever the configured number of keys changes. The C# AppHost accepts a TimeSpan for interval; the TypeScript AppHost accepts the same value as milliseconds.

When you want to explicitly provide the port and password used by the Redis container, you can pass them as parameters:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const password: ParameterResource
password
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addParameter(name: string, options?: {
value?: string;
publishValueAsDefault?: boolean;
secret?: boolean;
}): ParameterResource (+1 overload)

Adds a parameter resource

addParameter
("password", {
secret?: boolean | undefined
secret
: true });
const
const cache: RedisResource
cache
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addRedis(name: string, options?: {
port?: number;
password?: string | ParameterResource;
}): RedisResource (+1 overload)

Adds a Redis container to the application model.

addRedis
("cache", {
port?: number | undefined
port
: 6379,
password?: string | ParameterResource | undefined
password
});
await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource

Adds a node application to the application model. Node should be available on the PATH.

addNodeApp
("api", "./api", "index.js")
.
ExecutableResource.withReference(source: EndpointReference | string | uri, options?: {
connectionName?: string;
optional?: boolean;
name?: string;
} | undefined): NodeAppResource (+1 overload)

Adds a reference to another resource

withReference
(
const cache: RedisResource
cache
);
// After adding all resources, run the app...

When no password parameter is provided, Aspire generates a strong password automatically using the CreateDefaultPasswordParameter method.

Redis Insight is a free graphical interface for analyzing Redis data. Add it to the Redis resource as shown in the following examples:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const cache: RedisResource
cache
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addRedis(name: string, options?: {
port?: number;
password?: string | ParameterResource;
}): RedisResource (+1 overload)

Adds a Redis container to the application model.

addRedis
("cache");
await
const cache: RedisResource
cache
.
RedisResource.withRedisInsight(options?: {
configureContainer?: ((obj: RedisInsightResource) => Promise<void>) | undefined;
containerName?: string;
} | undefined): RedisResource (+1 overload)

Adds Redis Insight management UI

withRedisInsight
();
await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource

Adds a node application to the application model. Node should be available on the PATH.

addNodeApp
("api", "./api", "index.js")
.
ExecutableResource.withReference(source: EndpointReference | string | uri, options?: {
connectionName?: string;
optional?: boolean;
name?: string;
} | undefined): NodeAppResource (+1 overload)

Adds a reference to another resource

withReference
(
const cache: RedisResource
cache
);
// After adding all resources, run the app...

The preceding code adds a container based on the docker.io/redis/redisinsight image. The Redis Insight UI is available from the Aspire dashboard and connects automatically to the Redis resource.

  • RedisInsight container imageCompanion · RedisDocker Hub
    docker.io/redis/redisinsight:3.4

    Added by WithRedisInsight()withRedisInsight().

    Source

Tags reflect the latest defaults on the microsoft/aspire main branch, and may be newer than the version pinned by the package you install.

To configure the host port for the Redis Insight container, use the configureContainer callback as shown in the following examples:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const cache: RedisResource
cache
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addRedis(name: string, options?: {
port?: number;
password?: string | ParameterResource;
}): RedisResource (+1 overload)

Adds a Redis container to the application model.

addRedis
("cache");
await
const cache: RedisResource
cache
.
RedisResource.withRedisInsight(options?: {
configureContainer?: ((obj: RedisInsightResource) => Promise<void>) | undefined;
containerName?: string;
} | undefined): RedisResource (+1 overload)

Adds Redis Insight management UI

withRedisInsight
({
configureContainer?: ((obj: RedisInsightResource) => Promise<void>) | undefined
configureContainer
: async
redisInsight: RedisInsightResource
redisInsight
=> {
await
redisInsight: RedisInsightResource
redisInsight
.
RedisInsightResource.withHostPort(port: number | null): RedisInsightResource

Configures the host port that the Redis Insight resource is exposed on instead of using randomly assigned port.

withHostPort
(8001);
}
});
await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource

Adds a node application to the application model. Node should be available on the PATH.

addNodeApp
("api", "./api", "index.js")
.
ExecutableResource.withReference(source: EndpointReference | string | uri, options?: {
connectionName?: string;
optional?: boolean;
name?: string;
} | undefined): NodeAppResource (+1 overload)

Adds a reference to another resource

withReference
(
const cache: RedisResource
cache
);
// After adding all resources, run the app...

The preceding code adds and configures the host port for the Redis Insight container. The host port is otherwise randomly assigned.

Redis Commander is a Node.js web application for viewing, editing, and managing a Redis database. Add it to the Redis resource as shown in the following examples:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const cache: RedisResource
cache
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addRedis(name: string, options?: {
port?: number;
password?: string | ParameterResource;
}): RedisResource (+1 overload)

Adds a Redis container to the application model.

addRedis
("cache");
await
const cache: RedisResource
cache
.
RedisResource.withRedisCommander(options?: {
configureContainer?: ((obj: RedisCommanderResource) => Promise<void>) | undefined;
containerName?: string;
} | undefined): RedisResource (+1 overload)

Adds Redis Commander management UI

withRedisCommander
();
await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource

Adds a node application to the application model. Node should be available on the PATH.

addNodeApp
("api", "./api", "index.js")
.
ExecutableResource.withReference(source: EndpointReference | string | uri, options?: {
connectionName?: string;
optional?: boolean;
name?: string;
} | undefined): NodeAppResource (+1 overload)

Adds a reference to another resource

withReference
(
const cache: RedisResource
cache
);
// After adding all resources, run the app...

The preceding code adds a container based on the ghcr.io/joeferner/redis-commander image. The Redis Commander UI is available from the Aspire dashboard and connects automatically to the Redis resource.

  • Redis Commander container imageCompanion · RedisGitHub Container Registry
    ghcr.io/joeferner/redis-commander:latest

    Added by WithRedisCommander()withRedisCommander().

    Source

Tags reflect the latest defaults on the microsoft/aspire main branch, and may be newer than the version pinned by the package you install.

To configure the host port for the Redis Commander container, use the configureContainer callback as shown in the following examples:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const cache: RedisResource
cache
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addRedis(name: string, options?: {
port?: number;
password?: string | ParameterResource;
}): RedisResource (+1 overload)

Adds a Redis container to the application model.

addRedis
("cache");
await
const cache: RedisResource
cache
.
RedisResource.withRedisCommander(options?: {
configureContainer?: ((obj: RedisCommanderResource) => Promise<void>) | undefined;
containerName?: string;
} | undefined): RedisResource (+1 overload)

Adds Redis Commander management UI

withRedisCommander
({
configureContainer?: ((obj: RedisCommanderResource) => Promise<void>) | undefined
configureContainer
: async
redisCommander: RedisCommanderResource
redisCommander
=> {
await
redisCommander: RedisCommanderResource
redisCommander
.
RedisCommanderResource.withHostPort(port: number | null): RedisCommanderResource

Configures the host port that the Redis Commander resource is exposed on instead of using randomly assigned port.

withHostPort
(8081);
}
});
await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource

Adds a node application to the application model. Node should be available on the PATH.

addNodeApp
("api", "./api", "index.js")
.
ExecutableResource.withReference(source: EndpointReference | string | uri, options?: {
connectionName?: string;
optional?: boolean;
name?: string;
} | undefined): NodeAppResource (+1 overload)

Adds a reference to another resource

withReference
(
const cache: RedisResource
cache
);
// After adding all resources, run the app...

The preceding code adds and configures the host port for the Redis Commander container. The host port is otherwise randomly assigned.

The WithClearCommand method adds a CLEAR command button to the Aspire dashboard for the Redis resource. When clicked, it flushes all keys from the Redis database, which is useful during development to reset cache state without restarting the container.

AppHost.cs
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache")
.WithClearCommand();
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...

By default, Aspire injects the Redis connection information using variable names derived from the resource name (for example, CACHE_URI, CACHE_HOST, CACHE_PORT, CACHE_PASSWORD). If your consuming app expects a different set of environment variable names, pass individual connection properties from the AppHost:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
,
type EndpointProperty = "Url" | "Host" | "IPV4Host" | "Port" | "Scheme" | "TargetPort" | "HostAndPort" | "TlsEnabled"
const EndpointProperty: {
readonly Url: "Url";
readonly Host: "Host";
readonly IPV4Host: "IPV4Host";
readonly Port: "Port";
readonly Scheme: "Scheme";
readonly TargetPort: "TargetPort";
readonly HostAndPort: "HostAndPort";
readonly TlsEnabled: "TlsEnabled";
}

Enum Aspire.Hosting.ApplicationModel.EndpointProperty

EndpointProperty
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const cache: RedisResource
cache
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addRedis(name: string, options?: {
port?: number;
password?: string | ParameterResource;
}): RedisResource (+1 overload)

Adds a Redis container to the application model.

addRedis
("cache");
const
const cacheEndpoint: EndpointReference
cacheEndpoint
= await
const cache: RedisResource
cache
.
RedisResource.primaryEndpoint: () => Promise<EndpointReference>

Gets the primary endpoint for the Redis server.

primaryEndpoint
();
const
const cacheHost: EndpointReferenceExpression
cacheHost
= await
const cacheEndpoint: EndpointReference
cacheEndpoint
.
EndpointReference.property(property: EndpointProperty): EndpointReferenceExpression

Gets the specified property expression of the endpoint.

property
(
const EndpointProperty: {
readonly Url: "Url";
readonly Host: "Host";
readonly IPV4Host: "IPV4Host";
readonly Port: "Port";
readonly Scheme: "Scheme";
readonly TargetPort: "TargetPort";
readonly HostAndPort: "HostAndPort";
readonly TlsEnabled: "TlsEnabled";
}

Enum Aspire.Hosting.ApplicationModel.EndpointProperty

EndpointProperty
.
type Host: "Host"
Host
);
const
const cachePort: EndpointReferenceExpression
cachePort
= await
const cacheEndpoint: EndpointReference
cacheEndpoint
.
EndpointReference.property(property: EndpointProperty): EndpointReferenceExpression

Gets the specified property expression of the endpoint.

property
(
const EndpointProperty: {
readonly Url: "Url";
readonly Host: "Host";
readonly IPV4Host: "IPV4Host";
readonly Port: "Port";
readonly Scheme: "Scheme";
readonly TargetPort: "TargetPort";
readonly HostAndPort: "HostAndPort";
readonly TlsEnabled: "TlsEnabled";
}

Enum Aspire.Hosting.ApplicationModel.EndpointProperty

EndpointProperty
.
type Port: "Port"
Port
);
await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource

Adds a node application to the application model. Node should be available on the PATH.

addNodeApp
("my-app", "./app", "index.js")
.
ExecutableResource.withReference(source: EndpointReference | string | uri, options?: {
connectionName?: string;
optional?: boolean;
name?: string;
} | undefined): NodeAppResource (+1 overload)

Adds a reference to another resource

withReference
(
const cache: RedisResource
cache
)
.
ExecutableResource.withEnvironment(name: string, value: string | IResourceWithConnectionString | IValueProvider): NodeAppResource

Sets an environment variable

withEnvironment
("REDIS_HOST",
const cacheHost: EndpointReferenceExpression
cacheHost
)
.
ExecutableResource.withEnvironment(name: string, value: string | IResourceWithConnectionString | IValueProvider): NodeAppResource

Sets an environment variable

withEnvironment
("REDIS_PORT",
const cachePort: EndpointReferenceExpression
cachePort
)
.
ExecutableResource.withEnvironment(name: string, value: string | IResourceWithConnectionString | IValueProvider): NodeAppResource

Sets an environment variable

withEnvironment
("REDIS_PASSWORD", await
const cache: RedisResource
cache
.
RedisResource.passwordParameter: () => Promise<ParameterResource>

Gets the parameter that contains the Redis server password.

passwordParameter
());
await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.build(): DistributedApplication

Builds the distributed application

build
().
DistributedApplication.run(cancellationToken?: cancellationToken): void

Runs the distributed application

run
();

To reference an externally managed Redis instance instead of running one as a container, use AddConnectionString:

apphost.mts
import { createBuilder } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
const cache = await builder.addConnectionString("cache");
await builder.addNodeApp("my-app", "./app", "index.js")
.withReference(cache);
// After adding all resources, run the app...
await builder.build().run();

With AddConnectionString and addConnectionString, Aspire resolves cache from ConnectionStrings:cache (or environment variable ConnectionStrings__cache) in the AppHost configuration. Consuming apps receive that value as a single connection string, not deconstructed Redis resource-specific connection-property variables such as CACHE_HOST, CACHE_PORT, or CACHE_URI.

For the full reference of Redis resource connection properties — and how consuming apps in C#, TypeScript, Python, and Go read them — see Connect to Redis.

The Redis hosting integration automatically adds a health check for the Redis resource. The health check verifies that the Redis instance is running and that a connection can be established to it.

The hosting integration relies on the 📦 AspNetCore.HealthChecks.Redis NuGet package.