Interakce se službou Azure Cache for Redis pomocí .NET

Dokončeno

Klientská aplikace obvykle používá klientskou knihovnu k formování požadavků a spouštění příkazů v mezipaměti Redis. Seznam klientských knihoven můžete získat přímo ze stránky klientů Redis.

Provádění příkazů na mezipaměti Redis

Oblíbený a vysoce výkonný klient Redis pro jazyk .NET je StackExchange.Redis. Tento balíček je k dispozici prostřednictvím balíčku NuGet a lze ho přidat do vašeho kódu .NET pomocí příkazového řádku nebo integrovaného vývojového prostředí. Následuje příklad použití klienta.

Připojení k mezipaměti Redis pomocí StackExchange.Redis

Připomeňme si, že pro připojení k serveru Redis používáme adresu hostitele, číslo portu a přístupový klíč. Azure také nabízí připojovací řetězec pro některé klienty Redis, kteří tato data spojí do jednoho řetězce. Vypadá nějak takto (s cache-name poli a password-here poli vyplněnými skutečnými hodnotami):

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

Tento řetězec pak můžete předat do StackExchange.Redis na vytvoření připojení k serveru.

Všimněte si, že na konci jsou dva další parametry:

  • ssl – zajišťuje, že je komunikace šifrovaná.
  • abortConnection – dovoluje vytvořit připojení, i když server v daném okamžiku není dostupný.

Existuje i několik dalších volitelných parametrů, které můžete připojit na konec řetězce, abyste nakonfigurovali klientskou knihovnu.

Vytvoření připojení

Hlavní objekt připojení v StackExchange.Redis je třída StackExchange.Redis.ConnectionMultiplexer. Tento objekt abstrahuje proces připojení k serveru Redis (nebo skupině serverů). Je optimalizovaný, aby efektivně spravoval připojení, a je zamýšlený tak, že bude k dispozici po celou dobu, co potřebujete přístup k mezipaměti.

Vytvoříte instanci objektu ConnectionMultiplexer pomocí statické metody ConnectionMultiplexer.Connect nebo ConnectionMultiplexer.ConnectAsync, a to předáním buď připojovacího řetězce, nebo objektu ConfigurationOptions.

Tady je jednoduchý příklad:

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

Jakmile budete mít ConnectionMultiplexer, máte tři hlavní věci, které byste mohli chtít udělat:

  • Přistupovat k databázi Redis.
  • Využijte funkce vydavatele/odběratele Redis, které jsou mimo rozsah tohoto modulu.
  • Přistupovat k jednotlivému serveru za účelem údržby nebo monitorování.

Přístup k databázi Redis

Typ IDatabase představuje databázi Redis. Můžete ji načíst pomocí metody GetDatabase():

IDatabase db = redisConnection.GetDatabase();

Tip

Objekt vrácený metodou GetDatabase je zjednodušený objekt a není nutné ho ukládat. Jenom objekt ConnectionMultiplexer je nutné udržovat aktivní.

Jakmile budete mít objekt IDatabase, můžete spouštět metody pro interakci s mezipamětí. Všechny metody mají synchronní a asynchronní verze, které vrací Task objekty, aby byly kompatibilní s klíčovými async slovy.await

Následuje příklad uložení klíče/hodnoty do mezipaměti:

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

Metoda StringSet vrátí hodnotu bool, která znamená, jestli hodnota byla nastavena (true) nebo nebyla nastavena (false). Potom můžeme tuto hodnotu načíst pomocí metody StringGet:

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

Získání a nastavení binárních hodnot

Připomeňme si, že klíče a hodnoty Redis binárně bezpečné. Stejné metody je možné použít k ukládání binárních dat. Pro práci s typy byte[] existují implicitní operátory převodu, abyste mohli s těmito daty pracovat přirozeně:

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

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

StackExchange.Redis představuje klíče používající typ RedisKey. Tato třída má implicitní převody na a z typů string a byte[], což umožňuje bez komplikací používat textové i binární klíče. Hodnoty jsou reprezentovány typem RedisValue . Stejně jako u typu RedisKey jsou k dispozici implicitní převody, aby bylo možné předávat hodnoty typu string nebo byte[].

Další běžné operace

Rozhraní IDatabase obsahuje několik dalších metod pro práci s mezipamětí Redis. Jsou k dispozici metody pro práci s hodnotami hash, seznamy, sadami a seřazenými sadami.

Tady jsou některé z nejběžnějších, které pracují s jedním klíčem. Úplný seznam můžete najít ve zdrojovém kódu rozhraní.

metoda Popis
CreateBatch Vytvoří skupinu operací, které se mají odeslat na server jako jedna jednotka, ale nemusí se nutně zpracovat jako jednotka.
CreateTransaction Vytvoří skupinu operací, které se mají odeslat na server jako jedna jednotka a zpracovat na serveru jako jednu jednotku.
KeyDelete Odstraní klíč/hodnotu.
KeyExists Vrátí informaci, jestli zadaný klíč v mezipaměti existuje.
KeyExpire Nastaví hodnotu TTL (vypršení platnosti) pro klíč.
KeyRename Přejmenuje klíč.
KeyTimeToLive Vrátí hodnotu TTL pro klíč.
KeyType Vrátí řetězcovou reprezentaci typu hodnoty uložené v klíči. Různé typy, které lze vrátit, jsou: řetězec, seznam, sada, zset a hash.

Provádění jiných příkazů

Objekt IDatabase má a ExecuteAsync metoduExecute, kterou lze použít k předávání textových příkazů na server Redis. Příklad:

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

ExecuteAsync Metody Execute vrací RedisResult objekt, který je držitelem dat, který obsahuje dvě vlastnosti:

  • Resp2Type vrátí string indikující typ výsledku - STRING, INTEGERatd.
  • IsNull – hodnota true/false na zjištění, jestli je výsledek null.

Pak můžete použít ToString() na RedisResult a získat skutečnou vrácenou hodnotu.

Můžete použít Execute k provádění jakýchkoli podporovaných příkazů – například je možné získat všechny klienty připojené k mezipaměti ("CLIENT LIST"):

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

Tento výstup zobrazí všechny připojené klienty:

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

Ukládání komplexnějších hodnot

Redis je orientovaný na binárně bezpečné řetězce, můžete ale uložit do mezipaměti i objektové grafy, když je serializujete do textového formátu – obvykle XML nebo JSON. Například pro naši statistiku GameStats máme objekt, který vypadá takto:

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"))}";
    }
}

Mohli bychom použít knihovnu Newtonsoft.Json a převést instanci tohoto objektu na řetězec:

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);

Ten pak můžeme načíst a převést zpět na objekt pomocí opačného procesu:

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

Vyčištění připojení

Pokud už připojení nepotřebujete, můžete Dispose použít ConnectionMultiplexer. Tím se ukončí všechna připojení a vypne se komunikace se serverem.

redisConnection.Dispose();
redisConnection = null;