Interagera med Azure Cache for Redis med hjälp av .NET

Slutförd

Vanligtvis använder ett klientprogram ett klientbibliotek för att skapa begäranden och köra kommandon i en Redis-cache. Du kan hämta en lista med klientbibliotek direkt från Redis klientsida.

Köra kommandon på Redis-cachen

StackExchange.Redis är en populär Redis-klient med höga prestanda för språket .NET. Paketet är tillgängligt via NuGet och kan läggas till i din .NET-kod med hjälp av kommandoraden eller IDE. Här följer exempel på hur du använder klienten.

Ansluta till din Redis-cache med StackExchange.Redis

Kom ihåg att vi använder värdadressen, portnumret och en åtkomstnyckel för att ansluta till en Redis-server. Azure erbjuder också en niska veze för vissa Redis-klienter som paketera dessa data i en enda sträng. Det ser ut ungefär så här (med fälten cache-name och password-here ifyllda med verkliga värden):

[cache-name].redis.cache.windows.net:6380,password=[password-here],ssl=True,abortConnect=False

Du kan skicka den här strängen till StackExchange.Redis för att skapa en anslutning till servern.

Observera att det finns ytterligare två parametrar i slutet:

  • SSL – Ser till att kommunikationen är krypterad.
  • abortConnection – Tillåter att en anslutning skapas även om servern inte är tillgänglig just då.

Det finns flera andra valfria parametrar som du kan lägga till i strängen när du konfigurerar klientbiblioteket.

Skapa en anslutning

Det huvudsakliga anslutningsobjektet i StackExchange.Redis är klassen StackExchange.Redis.ConnectionMultiplexer. Det här objektet eliminerar processen för att ansluta till en Redis-server (eller en grupp med servrar). Det har optimerats för att effektivt hantera anslutningar och kan användas varje gång du behöver åtkomst till cachen.

Du skapar en ConnectionMultiplexer-instans med statisk ConnectionMultiplexer.Connect eller ConnectionMultiplexer.ConnectAsync-metoden och skickar antingen en anslutningssträng eller ett ConfigurationOptions-objekt.

Här är ett enkelt exempel:

using StackExchange.Redis;
...
var connectionString = "[cache-name].redis.cache.windows.net:6380,password=[password-here],ssl=True,abortConnect=False";
var redisConnection = ConnectionMultiplexer.Connect(connectionString);

När du har en ConnectionMultiplexerfinns det tre primära saker som du kanske vill göra:

  • Få åtkomst till en Redis-databas.
  • Använd utgivar-/prenumerantfunktionerna i Redis, som ligger utanför omfånget för den här modulen.
  • Få åtkomst till en enskild server för underhåll eller övervakning.

Åtkomst till en Redis-databas

Typen IDatabase representerar Redis-databasen. Du kan hämta en med GetDatabase()-metoden:

IDatabase db = redisConnection.GetDatabase();

Dricks

Det objekt som returneras från GetDatabase är ett förenklat objekt som inte behöver lagras. Det är bara ConnectionMultiplexer som måste vara aktiv.

När du har ett IDatabase-objekt kan du köra metoder för att interagera med cacheminnet. Alla metoder har synkrona och asynkrona versioner som returnerar Task objekt för att göra dem kompatibla med nyckelorden async och await .

Följande är ett exempel på lagring av en nyckel/ett värde i cacheminnet:

bool wasSet = db.StringSet("favorite:flavor", "i-love-rocky-road");

StringSet-metoden returnerar en bool som visar ifall värdet har angetts (true) eller inte (false). Vi kan sedan hämta värdet med StringGet-metoden:

string value = db.StringGet("favorite:flavor");
Console.WriteLine(value); // displays: ""i-love-rocky-road""

Hämta och ange binära värden

Kom ihåg att Redis-nycklar och värden är binärt säkra. Samma metoder kan användas för att lagra binära data. Det finns implicita konverteringsoperatörer som använder byte[]-typer, så du kan arbeta med data naturligt:

byte[] key = ...;
byte[] value = ...;

db.StringSet(key, value);
byte[] key = ...;
byte[] value = db.StringGet(key);

StackExchange.Redis representerar nycklar med RedisKey-typen. Den här klassen har implicita konverteringar till och från både string och byte[], vilket gör att både text och binära nycklar kan användas utan problem. Värden representeras av RedisValue -typen. Precis som med RedisKey, finns det implicita konverteringar på plats så att du kan skicka string eller byte[].

Andra vanliga åtgärder

IDatabase-gränssnittet innehåller flera andra metoder för att arbeta med Redis-cache. Det finns metoder för att arbeta med hashvärden, listor, uppsättningar och ordnade uppsättningar.

Här är några av de vanligaste metoderna som fungerar med enkla nycklar. Du kan läsa källkoden för gränssnittet om du vill se hela listan.

Metod beskrivning
CreateBatch Skapar en grupp åtgärder som ska skickas till servern som en enda enhet, men inte nödvändigtvis bearbetas som en enhet.
CreateTransaction Skapar en grupp åtgärder som ska skickas till servern som en enda enhet och bearbetas på servern som en enda enhet.
KeyDelete Ta bort nyckel/värde.
KeyExists Returneras om den angivna nyckeln finns i cacheminnet.
KeyExpire Anger en tidsgräns för TTL-värdet (Time to live) för en nyckel.
KeyRename Byter namn på en nyckel.
KeyTimeToLive Returnerar TTL-värdet för en nyckel.
KeyType Returnerar en strängrepresentation av typen på det värde som lagras i nyckeln. De olika typer som kan returneras är: sträng, lista, uppsättning, zset och hash.

Köra andra kommandon

Objektet IDatabase har en Execute metod och ExecuteAsync som kan användas för att skicka textkommandon till Redis-servern. Till exempel:

var result = db.Execute("ping");
Console.WriteLine(result.ToString()); // displays: "PONG"

Metoderna Execute och ExecuteAsync returnerar ett RedisResult objekt som är en datahållare som innehåller två egenskaper:

  • Resp2Type som returnerar en string som anger typen av resultat – STRING, INTEGER, osv.
  • IsNull är ett true/false-värde som visar om resultatet är null.

Du kan sedan använda ToString()RedisResult för att hämta det faktiska returvärdet.

Du kan använda Execute till att utföra de kommandon som stöds – till exempel kan vi hämta alla klienter som är anslutna till cachen (”CLIENT LIST”):

var result = await db.ExecuteAsync("client", "list");
Console.WriteLine($"Type = {result.Resp2Type}\r\nResult = {result}");

Detta matar ut alla anslutna klienter:

Type = BulkString
Result = id=9469 addr=16.183.122.154:54961 fd=18 name=DESKTOP-AAAAAA age=0 idle=0 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 ow=0 owmem=0 events=r cmd=subscribe numops=5
id=9470 addr=16.183.122.155:54967 fd=13 name=DESKTOP-BBBBBB age=0 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 ow=0 owmem=0 events=r cmd=client numops=17

Lagra mer komplexa värden

Redis är inriktade på binära säkra strängar, men du kan cachelagra objektdiagram genom att serialisera dem till ett textformat – vanligtvis XML eller JSON. För vår statistik har vi till exempel ett GameStats objekt som ser ut så här:

public class GameStat
{
    public string Id { get; set; }
    public string Sport { get; set; }
    public DateTimeOffset DatePlayed { get; set; }
    public string Game { get; set; }
    public IReadOnlyList<string> Teams { get; set; }
    public IReadOnlyList<(string team, int score)> Results { get; set; }

    public GameStat(string sport, DateTimeOffset datePlayed, string game, string[] teams, IEnumerable<(string team, int score)> results)
    {
        Id = Guid.NewGuid().ToString();
        Sport = sport;
        DatePlayed = datePlayed;
        Game = game;
        Teams = teams.ToList();
        Results = results.ToList();
    }

    public override string ToString()
    {
        return $"{Sport} {Game} played on {DatePlayed.Date.ToShortDateString()} - " +
               $"{String.Join(',', Teams)}\r\n\t" + 
               $"{String.Join('\t', Results.Select(r => $"{r.team } - {r.score}\r\n"))}";
    }
}

Vi kan använda biblioteket Newtonsoft.Json till att omvandla en instans av det här objektet till en sträng:

var stat = new GameStat("Soccer", new DateTime(2019, 7, 16), "Local Game", 
                new[] { "Team 1", "Team 2" },
                new[] { ("Team 1", 2), ("Team 2", 1) });

string serializedValue = Newtonsoft.Json.JsonConvert.SerializeObject(stat);
bool added = db.StringSet("event:1950-world-cup", serializedValue);

Vi kan hämta den och omvandla den tillbaka till ett objekt genom en omvänd process:

var result = db.StringGet("event:2019-local-game");
var stat = Newtonsoft.Json.JsonConvert.DeserializeObject<GameStat>(result.ToString());
Console.WriteLine(stat.Sport); // displays "Soccer"

Rensa anslutningen

När anslutningen inte längre behövs kan Dispose ConnectionMultiplexerdu . Detta stänger alla anslutningar och stänger av kommunikationen till servern.

redisConnection.Dispose();
redisConnection = null;