Interakce se službou Azure Cache for Redis pomocí .NET
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
,INTEGER
atd.IsNull
– hodnota true/false na zjištění, jestli je výsledeknull
.
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;