Interagera med Azure Cache for Redis med hjälp av .NET
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 ConnectionMultiplexer
finns 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 enstring
som anger typen av resultat –STRING
,INTEGER
, osv.IsNull
är ett true/false-värde som visar om resultatet ärnull
.
Du kan sedan använda ToString()
på 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
ConnectionMultiplexer
du . Detta stänger alla anslutningar och stänger av kommunikationen till servern.
redisConnection.Dispose();
redisConnection = null;