® integrazione .NET AspireRedis*
include:integrazione dell'hosting e integrazione di Client
Redis è la piattaforma dati più veloce al mondo per la memorizzazione nella cache, la ricerca vettoriale e i database NoSQL. L'integrazione .NET AspireRedis consente di connettersi alle istanze Redis esistenti o di creare nuove istanze da .NET utilizzando l'immagine contenitore docker.io/library/redis
.
Garnet è un archivio cache ad alte prestazioni di Microsoft Research ed è conforme al protocollo di serializzazione Redis (RESP). L'integrazione .NET AspireRedis consente di connettersi alle istanze di Garnet esistenti o di creare nuove istanze da .NET con l'immagine del contenitore ghcr.io/microsoft/garnet
.
docker.io/valkey/valkey
.
Integrazione dell'hosting
L'integrazione di hosting Redis modella una risorsa Redis come il tipo RedisResource. Per accedere a questo tipo e alle API che consentono di aggiungerlo al pacchetto NuGet 📦Aspire.Hosting.Redis nel progetto host dell'app .
- .NET dell'interfaccia della riga di comando
- PackageReference
dotnet add package Aspire.Hosting.Redis
Per altre informazioni, vedere dotnet add package o Gestire le dipendenze dei pacchetti nelle applicazioni .NET.
Aggiungere risorsa Redis
Nel progetto host della tua app, chiama AddRedis sull'istanza builder
per aggiungere una risorsa Redis:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Quando .NET.NET Aspire aggiunge un'immagine del contenitore all'host dell'app, come illustrato nell'esempio precedente con l'immagine docker.io/Redis/Redis
, crea una nuova istanza Redis nel computer locale. Viene aggiunto un riferimento alla risorsa Redis (la variabile cache
) alla ExampleProject
.
Il metodo WithReference configura una connessione nel ExampleProject
denominato "cache"
. Per ulteriori informazioni, vedere il ciclo di vita delle risorse del contenitore .
Suggerimento
Se preferisci connetterti a un'istanza di Redis esistente, chiama AddConnectionString. Per altre informazioni, vedere Fare riferimento alle risorse esistenti.
Aggiungere Redis risorsa con Redis Insights
Per aggiungere il Redis Insights alla risorsa Redis, chiamare il metodo WithRedisInsight
.
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache")
.WithRedisInsight();
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Redis Insights è un'interfaccia grafica gratuita per l'analisi dei dati Redis in tutti i sistemi operativi e le distribuzioni di Redis con l'aiuto dell'assistente di intelligenza artificiale, Redis Copilot.
.NET
.NET Aspire aggiunge un'altra immagine del contenitore docker.io/redis/redisinsight
all'host dell'app che esegue l'app comandante.
Nota
Per configurare la porta host per la catena di RedisInsightResource
, è necessario fare una chiamata all'API WithHostPort
e specificare il numero di porta desiderato.
Aggiungere la risorsa Redis con il comandante Redis
Per aggiungere il Redis Comandante alla risorsa Redis, chiamare il metodo WithRedisCommander:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache")
.WithRedisCommander();
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Redis Commander è un'applicazione Web Node.js usata per visualizzare, modificare e gestire un database Redis.
.NET
.NET Aspire aggiunge un'altra immagine del container docker.io/rediscommander/redis-commander
all'host dell'app che esegue l'app di comando.
Suggerimento
Per configurare la porta host per la catena di RedisCommanderResource, effettuare una chiamata all'API WithHostPort e fornire il numero di porta desiderato.
Aggiungere la risorsa Redis con volume di dati
Per aggiungere un volume di dati alla risorsa Redis, chiamare il metodo WithDataVolume nella risorsa Redis:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache")
.WithDataVolume(isReadOnly: false);
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Il volume di dati viene usato per rendere persistenti i dati Redis all'esterno del ciclo di vita del contenitore. Il volume di dati viene montato nel percorso /data
nel contenitore Redis e quando non viene specificato un parametro name
, il nome viene generato in modo casuale. Per ulteriori informazioni sui volumi di dati e sui motivi per cui sono preferiti rispetto ai montaggi associati , vedere la documentazione Docker: Volumi.
Aggiungere la risorsa Redis con il bind mount dei dati
Per aggiungere un montaggio di bind dati alla risorsa Redis, chiamare il metodo WithDataBindMount:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache")
.WithDataBindMount(
source: @"C:\Redis\Data",
isReadOnly: false);
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Importante
I di binding dei dati hanno funzionalità limitate rispetto ai volumi , che offrono prestazioni, portabilità e sicurezza migliori, rendendole più adatte per gli ambienti di produzione. Tuttavia, i montaggi bind consentono l'accesso diretto e la modifica diretta dei file nel sistema host, ideali per lo sviluppo e il test in cui sono richieste modifiche in tempo reale.
I montaggi di associazione dati si basano sul file system del computer host per rendere persistenti i dati Redis tra i riavvii del contenitore. Il montaggio di bind dei dati è effettuato sul percorso C:\Redis\Data
su Windows (o /Redis/Data
sul percorso di Unix) sulla macchina host nel contenitore Redis. Per ulteriori informazioni sui bind mount di dati, consultare la documentazione Docker: Bind mounts.
Aggiungi la risorsa Redis con persistenza
Per aggiungere la persistenza alla risorsa Redis, chiamare il metodo WithPersistence con il volume di dati o il montaggio dell'associazione dati:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache")
.WithDataVolume()
.WithPersistence(
interval: TimeSpan.FromMinutes(5),
keysChangedThreshold: 100);
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Il codice precedente aggiunge la persistenza alla risorsa Redis eseguendo snapshot dei dati Redis a un intervallo e una soglia specificati. Il interval
è il tempo tra le esportazioni di snapshot e il keysChangedThreshold
è il numero di operazioni di modifica della chiave necessarie per attivare uno snapshot. Per altre informazioni sulla persistenza, vedere i documenti Redis: Persistenza.
L'integrazione di hosting di Garnet modella una risorsa Garnet come il tipo GarnetResource. Per accedere a questo tipo e alle API che consentono di aggiungerlo al pacchetto NuGet 📦Aspire.Hosting.Garnet nell'host dell'app del progetto.
dotnet add package Aspire.Hosting.Garnet
Per altre informazioni, vedere dotnet add package o Manage package dependencies in .NET applications.
Aggiungere una risorsa Garnet
Nel progetto host dell'app, chiama AddGarnet sull'istanza builder
per aggiungere una risorsa Garnet.
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddGarnet("cache");
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Quando .NET.NET Aspire aggiunge un'immagine del container all'host dell'app, come illustrato nell'esempio precedente con l'immagine ghcr.io/microsoft/garnet
, crea una nuova istanza Garnet sul computer locale. Un riferimento alla risorsa Garnet (variabile cache
) viene aggiunto al ExampleProject
.
Il metodo WithReference configura una connessione nel ExampleProject
denominato "cache"
. Per altre informazioni, vedere ciclo di vita delle risorse contenitore.
Suggerimento
Se invece si preferisce connettersi a un'istanza Garnet esistente, chiamare AddConnectionString. Per altre informazioni, vedere Fare riferimento alle risorse esistenti.
Aggiungere una risorsa Garnet con un volume di dati
Per aggiungere un volume di dati alla risorsa Garnet, chiamare il metodo AddGarnet nella risorsa Garnet:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddGarnet("cache")
.WithDataVolume(isReadOnly: false);
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Il volume di dati viene usato per rendere persistenti i dati Garnet all'esterno del ciclo di vita del contenitore. Il volume di dati viene montato nel percorso /data
nel contenitore Garnet e quando non viene specificato un parametro name
, il nome viene generato in modo casuale. Per altre informazioni sui volumi di dati e sui motivi per cui sono preferiti rispetto a associare i montaggi, vedere la documentazione Docker: Volumi.
Aggiungere una risorsa Garnet con il montaggio di associazione dati
Per aggiungere un montaggio di associazione dati alla risorsa Garnet, chiamare il metodo WithDataBindMount:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddGarnet("cache")
.WithDataBindMount(
source: @"C:\Garnet\Data",
isReadOnly: false);
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Importante
Il bind mount dei dati ha funzionalità limitate rispetto ai volumi , che offrono prestazioni, portabilità e sicurezza migliori, rendendoli più adatti per gli ambienti di produzione. Tuttavia, i bind mounts consentono l'accesso e la modifica dei file nel sistema host, ideale per lo sviluppo e il test, dove sono necessarie modifiche a tempo reale.
I montaggi di associazione dei dati si basano sul sistema di file del computer host per rendere persistenti i dati Garnet tra i riavvii dei container. Il montaggio del data bind è eseguito nel percorso C:\Garnet\Data
su Windows (o /Garnet/Data
su Unix) sul computer host all'interno del contenitore Garnet. Per altre informazioni sui montaggi di associazione dati, vedere Docker docs: Bind mounts.
Aggiungere una risorsa Garnet con persistenza
Per aggiungere la persistenza alla risorsa Garnet, chiamare il metodo WithPersistence con il volume di dati o il bind mount dei dati.
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddGarnet("cache")
.WithDataVolume()
.WithPersistence(
interval: TimeSpan.FromMinutes(5),
keysChangedThreshold: 100);
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Il codice precedente aggiunge la persistenza alla risorsa Redis eseguendo snapshot dei dati Garnet a un intervallo e una soglia specificati. Il interval
è il tempo tra le esportazioni di snapshot e il keysChangedThreshold
è il numero di operazioni di modifica della chiave necessarie per attivare uno snapshot. Per altre informazioni sulla persistenza, vedere Redis docs: Persistenza.
L'integrazione hosting di Valkey modella una risorsa Valkey come tipo ValkeyResource. Per accedere a questo tipo e alle API che consentono di aggiungerlo al pacchetto NuGet 📦Aspire.Hosting.Valkey nel progetto host dell'app.
- .NET dell'interfaccia della riga di comando
- PackageReference
dotnet add package Aspire.Hosting.Valkey
Per altre informazioni, consultare dotnet add package o Gestire le dipendenze dei pacchetti nelle applicazioni .NET.
Aggiungere una risorsa Valkey
Nel progetto host dell'app chiamare AddValkey nell'istanza di builder
per aggiungere una risorsa Valkey:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddValkey("cache");
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Quando .NET.NET Aspire aggiunge un'immagine del container all'host dell'app, come illustrato nell'esempio precedente con l'immagine docker.io/valkey/valkey
, crea una nuova istanza Valkey nel computer locale. Un riferimento alla risorsa Valkey (la variabile cache
) viene aggiunto al ExampleProject
.
Il metodo WithReference configura una connessione nel ExampleProject
denominato "cache"
. Per altre informazioni, vedere il ciclo di vita delle risorse dei contenitori.
Consiglio
Preferisci invece connetterti a un'istanza Valkey esistente, chiama AddConnectionString. Per altre informazioni, vedere Fare riferimento alle risorse esistenti.
Aggiungere una risorsa Valkey con un volume di dati
Per aggiungere un volume di dati alla risorsa Valkey, chiamare il metodo AddValkey nella risorsa Valkey:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddValkey("cache")
.WithDataVolume(isReadOnly: false);
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Il volume di dati viene usato per rendere persistenti i dati Valkey all'esterno del ciclo di vita del contenitore. Il volume di dati viene montato nel percorso /data
nel contenitore Valkey e quando non viene specificato un parametro name
, il nome viene generato in modo casuale. Per ulteriori informazioni sui volumi e sui motivi per cui sono preferiti rispetto ai mount di collegamento , consultare la documentazione Docker: Volumi.
Aggiungere una risorsa Valkey con il montaggio dell'associazione dati
Per aggiungere un montaggio di associazione dati alla risorsa Valkey, chiamare il metodo WithDataBindMount:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddValkey("cache")
.WithDataBindMount(
source: @"C:\Valkey\Data",
isReadOnly: false);
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Importante
I di binding dei dati hanno funzionalità limitate rispetto ai volumi , che offrono prestazioni, portabilità e sicurezza migliori, rendendole più adatte per gli ambienti di produzione. Tuttavia, i bind mounts consentono l'accesso diretto e la modifica dei file nel sistema host, ideale per lo sviluppo e il test in cui sono necessarie modifiche in tempo reale.
I montaggi di associazione dati si basano sul file system del computer host per rendere persistenti i dati Valkey tra i riavvii del contenitore. Il punto di montaggio dati è montato nel percorso C:\Valkey\Data
su Windows (o /Valkey/Data
nel percorso Unix) sul computer host nel contenitore Valkey. Per altre informazioni sui montaggi di associazione dati, vedere Docker docs: Bind mounts.
Aggiungi una risorsa Valkey con persistenza
Per aggiungere la persistenza alla risorsa Valkey, chiamare il metodo WithPersistence con il volume dati o il bind mount dei dati:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddValkey("cache")
.WithDataVolume()
.WithPersistence(
interval: TimeSpan.FromMinutes(5),
keysChangedThreshold: 100);
builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
// After adding all resources, run the app...
Il codice precedente aggiunge la persistenza alla risorsa Redis eseguendo snapshot dei dati Valkey a un intervallo e una soglia specificati. Il interval
è il tempo tra le esportazioni di snapshot e il keysChangedThreshold
è il numero di operazioni di modifica della chiave necessarie per attivare uno snapshot. Per ulteriori informazioni sulla persistenza, consulta Redis docs: Persistenza.
Controlli di integrità per l'integrazione di hosting
L'integrazione dell'hosting Redis aggiunge automaticamente un controllo di integrità per il tipo di risorsa appropriato. Il controllo di integrità verifica che il server sia operativo e che sia possibile stabilire una connessione.
L'integrazione dell'hosting si basa sul pacchetto NuGet AspNetCore.HealthChecks. 📦.Redis
integrazione Client
Per iniziare a usare l'integrazione di .NET Aspire Stack Exchange Redisclient, installare il pacchetto NuGet 📦Aspire.StackExchange.Redis nel progetto che usa client, ovvero il progetto per l'applicazione che usa il Redisclient. L'integrazione Redisclient registra un'istanza di IConnectionMultiplexer che puoi usare per interagire con Redis.
dotnet add package Aspire.StackExchange.Redis
Aggiungere Redisclient
Nel file Program.cs del progetto client-consuming, chiama il metodo di estensione AddRedisClient su qualsiasi IHostApplicationBuilder per registrare un IConnectionMultiplexer
da usare tramite il contenitore per l'iniezione delle dipendenze. Il metodo accetta un parametro del nome di connessione.
builder.AddRedisClient(connectionName: "cache");
Consiglio
Il parametro connectionName
deve corrispondere al nome usato quando si aggiunge la risorsa Redis nel progetto host dell'app. Per altre informazioni, vedere Aggiungere Redis risorsa.
Mancia
Il parametro connectionName
deve corrispondere al nome usato quando si aggiunge la risorsa Garnet nel progetto host dell'app. Per altre informazioni, vedere Aggiungere una risorsa Garnet.
Consiglio
Il parametro connectionName
deve corrispondere al nome usato quando si aggiunge la risorsa Valkey nel progetto host dell'app. Per altre informazioni, vedere Aggiungere una risorsa Valkey.
È quindi possibile ottenere l'istanza di IConnection
utilizzando l'iniezione delle dipendenze. Ad esempio, per recuperare la connessione da un servizio di esempio:
public class ExampleService(IConnectionMultiplexer connectionMux)
{
// Use connection multiplexer...
}
Per ulteriori informazioni sull'iniezione di dipendenze, vedere .NET iniezione di dipendenze.
Aggiungere Redisclient con chiave
In alcuni casi potrebbe essere necessario registrare più istanze di IConnectionMultiplexer
con nomi di connessione diversi. Per registrare i client Redis con chiave, chiamare il metodo AddKeyedRedisClient:
builder.AddKeyedRedisClient(name: "chat");
builder.AddKeyedRedisClient(name: "queue");
È quindi possibile recuperare le istanze di IConnectionMultiplexer
usando l'iniezione delle dipendenze. Ad esempio, per recuperare la connessione da un servizio di esempio:
public class ExampleService(
[FromKeyedServices("chat")] IConnectionMultiplexer chatConnectionMux,
[FromKeyedServices("queue")] IConnectionMultiplexer queueConnectionMux)
{
// Use connections...
}
Per ulteriori informazioni sui servizi chiave, vedere .NET iniezione delle dipendenze: Servizi chiave.
Configurazione
L'integrazione Redisclient.NET Aspire Stack Exchange offre più opzioni per configurare la connessione Redis in base ai requisiti e alle convenzioni del progetto.
Usare una stringa di connessione
Quando si usa una stringa di connessione dalla sezione di configurazione ConnectionStrings
, è possibile specificare il nome della stringa di connessione quando si chiama AddRedis:
builder.AddRedis("cache");
Quando si usa una stringa di connessione dalla sezione di configurazione ConnectionStrings
, è possibile specificare il nome della stringa di connessione quando si chiama AddGarnet:
builder.AddGarnet("cache");
Quando si usa una stringa di connessione dalla sezione di configurazione ConnectionStrings
, è possibile specificare il nome della stringa di connessione quando si chiama AddValkey:
builder.AddValkey("cache");
La stringa di connessione verrà quindi recuperata dalla sezione di configurazione ConnectionStrings
:
{
"ConnectionStrings": {
"cache": "localhost:6379"
}
}
Per ulteriori informazioni su come formattare questa stringa di connessione, consultare la documentazione sulla configurazionedi
Utilizzare i fornitori di configurazione
L'integrazione RedisRedis stack di .NET Aspire supporta Microsoft.Extensions.Configuration. Carica il StackExchangeRedisSettings dalla configurazione usando la chiave Aspire:StackExchange:Redis
. Esempio appsettings.json che configura alcune delle opzioni:
{
"Aspire": {
"StackExchange": {
"Redis": {
"ConnectionString": "localhost:6379",
"DisableHealthChecks": true,
"DisableTracing": false
}
}
}
}
Per lo schema completo di integrazione RedisclientJSON, consultare Aspire.StackExchange.Redis/ConfigurationSchema.json.
Usare delegati inline
È anche possibile passare il delegato Action<StackExchangeRedisSettings>
per configurare alcune o tutte le opzioni in linea, ad esempio per configurare DisableTracing
:
builder.AddRedisClient(
"cache",
static settings => settings.DisableTracing = true);
Client controlli di integrità dell'integrazione
Per impostazione predefinita, le integrazioni di .NET.NET Aspire abilitano verifiche dello stato di salute per tutti i servizi. Per altre informazioni, vedere panoramica delle integrazioni .NET.NET Aspire.
L'integrazione di .NET Aspire Stack Exchange Redis gestisce le operazioni seguenti:
- Aggiunge il controllo di integrità quando StackExchangeRedisSettings.DisableHealthChecks è
false
, che tenta di connettersi all'istanza del contenitore. - Si integra con l'endpoint HTTP
/health
, che specifica che tutti i controlli di integrità registrati devono essere passati affinché l'app sia considerata pronta per accettare il traffico.
Osservabilità e telemetria
.NET
.NET Aspire le integrazioni impostano automaticamente le configurazioni di registrazione, tracciamento e metriche, talvolta note come i pilastri dell'osservabilità. Per altre informazioni sull'osservabilità e la telemetria dell'integrazione, vedere panoramica delle integrazioni .NET.NET Aspire. A seconda del servizio di backup, alcune integrazioni potrebbero supportare solo alcune di queste funzionalità. Ad esempio, alcune integrazioni supportano la registrazione e la traccia, ma non le metriche. Le funzionalità di telemetria possono essere disabilitate anche usando le tecniche presentate nella sezione Configurazione
Registrazione
L'integrazione .NET AspireRedis Stack Exchange utilizza le seguenti categorie di log:
Aspire.StackExchange.Redis
Tracciatura
L'integrazione .NET Aspire Stack Exchange Redis genererà le seguenti attività di tracciamento utilizzando OpenTelemetry:
OpenTelemetry.Instrumentation.StackExchangeRedis
Metriche
L'integrazione di .NET Aspire con Redis attualmente non supporta le metriche per impostazione predefinita a causa di limitazioni della libreria StackExchange.Redis
.
integrazione di hosting con AzureRedis
Per distribuire le risorse di Redis in Azure, installare il 📦Aspire.Hosting.Azure.Redis pacchetto NuGet:
- .NET dell'interfaccia della riga di comando
- PackageReference
dotnet add package Aspire.Hosting.Azure.Redis
Aggiungere la risorsa Azure Cache for Redisserver
Dopo aver installato il pacchetto di hosting .NET AspireAzureRedis, richiamare il metodo di estensione AddAzureRedis
nel progetto host dell'applicazione:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddAzureRedis("azcache")
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(cache);
La chiamata precedente a AddAzureRedis
configura la risorsa Redisserver da distribuire come Azure Cache for Redis.
Importante
Per impostazione predefinita, AddAzureRedis
configura autenticazione Microsoft Entra ID. Ciò richiede modifiche alle applicazioni che devono connettersi a queste risorse, ad esempio, integrazioni client.
Aggiungere Azure Cache for Redisclient
Per impostazione predefinita, quando si chiama AddAzureRedis
nell'integrazione dell'hosting Redis, viene configurato 📦 Microsoft.Azure.StackExchangeRedis pacchetto NuGet per abilitare l'autenticazione:
- .NET dell'interfaccia della riga di comando
- PackageReference
dotnet add package Microsoft.Azure.StackExchangeRedis
La connessione Redis può essere fruita tramite l'integrazione client e Microsoft.Azure.StackExchangeRedis
. Prendere in considerazione il codice di configurazione seguente:
var azureOptionsProvider = new AzureOptionsProvider();
var configurationOptions = ConfigurationOptions.Parse(
builder.Configuration.GetConnectionString("cache") ??
throw new InvalidOperationException("Could not find a 'cache' connection string."));
if (configurationOptions.EndPoints.Any(azureOptionsProvider.IsMatch))
{
await configurationOptions.ConfigureForAzureWithTokenCredentialAsync(
new DefaultAzureCredential());
}
builder.AddRedisClient("cache", configureOptions: options =>
{
options.Defaults = configurationOptions.Defaults;
});
Per altre informazioni, vedere il repository Microsoft.Azure.StackExchangeRedis.
Vedere anche
*: Redis è un marchio registrato di Redis Ltd. Tutti i diritti in esso contenuti sono riservati a Redis Ltd. Qualsiasi utilizzo da parte di Microsoft è solo a scopo referenziale e non indica alcuna sponsorizzazione, approvazione o affiliazione tra Redis e Microsoft. Tornare all'superiore?