Anwendungen und Webdienste sind heutzutage das Herzstück eines jeden Unternehmens, so dass selbst kleine Firmen ihre eigenen Websites oder mobilen Anwendungen haben. Die Latenzzeit, die die Nutzer beim Abrufen von Daten erleben, hat einen großen Einfluss auf den Eindruck, den sie von der Nutzung Ihrer Lösung haben, insbesondere wenn das Ziel der Website der Verkauf von Waren ist. Darüber hinaus hat eine lange Ladezeit der Seite auch Auswirkungen auf die Suchmaschinenoptimierung (SEO) und kann den Traffic weiter verringern. Caching-Mechanismen wurden geschaffen, um solche Probleme zu beseitigen. Sie können auch dazu verwendet werden, unnötige Anfragen an die Datenschicht zu reduzieren, indem berechnete Daten im Speicher abgelegt werden, so dass künftige Anfragen sofort bedient werden können und der Verbrauch von Ressourcen wie z.B. Speicher reduziert wird. Für Dienste mit hohem Datenverkehr ist die Verwendung von Cache-Mechanismen ein Muss.
Redis ist eines der beliebtesten In-Memory-Datenspeichersysteme auf dem Markt. In diesem Artikel werden wir den Lesern einen allgemeinen Überblick darüber geben, was es ist, wie es verwendet werden kann, und wir werden auch Azure Cache für Redis und grundlegende Beispiele dafür untersuchen, wie man mit ihm arbeiten kann. Lassen Sie uns also all diese Fragen der Reihe nach durchgehen.
Einführung in Redis
Wie in der offiziellen Dokumentation erwähnt, ist Redis (was übrigens Remote Dictionary Server bedeutet) ein quelloffener (BSD-lizenzierter) In-Memory-Datenstrukturspeicher, der als Datenbank, Cache und Nachrichtenbroker verwendet wird.
Im Wesentlichen ist Redis einem Key-Value-Store ähnlich. Der Unterschied liegt darin, dass in traditionellen Key-Value-Stores String-Schlüssel mit String-Werten verknüpft werden, während Redis komplexere Datenstrukturen wie Strings, Hashes, Listen, Sets, sortierte Sets mit Range-Queries, Bitmaps, HyperLogLogs, geospatiale Indizes mit Radius-Queries und Streams unterstützt. Alle Schlüssel sind binärsicher, so dass Sie jede beliebige binäre Sequenz als Schlüssel verwenden können, von einer Zeichenkette bis zum Inhalt einer JPEG-Datei. Die Unterstützung dieser großen Anzahl komplexer Datentypen ist der Hauptunterschied zwischen Redis und anderen Key-Value-Datenbanken.
Redis ist außerdem außerordentlich schnell. Dies ist einer der Gründe, warum es für Lösungen mit sich schnell ändernden und häufig abgerufenen Daten verwendet wird. Manchmal wird Redis deshalb als alternative Primärdatenbank verwendet und einige Entwickler halten es für eine gute Lösung. Trotzdem müssen Sie bedenken, dass Sie bei einem Serverausfall alles verlieren, was sich im Speicher befand, und das ist das Hauptargument für die Verwendung als transienter Speicher.
Wie bereits erwähnt, ist Redis sehr funktionsreich und wird nicht nur als Speicher verwendet, sondern auch in einer Reihe von anderen Anwendungsfällen, die im Folgenden kurz erläutert werden:
- Zwischenspeicherung von Benutzersitzungen. Die Speicherung vieler Daten in den Cookies wirkt sich negativ auf die Leistung aus. Stattdessen können Sie den In-Memory-Cache verwenden.
- Redis Pub/Sub. Es ist seit Version 2.0 verfügbar und implementiert das Publish/Subscribe-Messaging-Paradigma mit größerer Skalierbarkeit aufgrund der Trennung von Abonnenten und Herausgebern. Sie wissen eigentlich nichts voneinander – die Verleger veröffentlichen Nachrichten in den Kanälen und die Abonnenten erhalten Nachrichten, die von Interesse sind.
- Warteschlangen. Zwei Arten von Warteschlangen bieten die Möglichkeit, Aufgaben in einer bestimmten Reihenfolge auszuführen oder ihre Ausführung zu planen.
- Zähler. Der Name spricht für sich selbst. Sie können benannte Zähler erstellen, von denen jeder die letzten 120 Stichproben mit einer Vielzahl von Zeitpräzisionen (wie 1 Sekunde, 5 Sekunden, 1 Minute usw.) speichern kann und die für Echtzeitanalysen verwendet werden können.
- Es unterstützt die Ausführung eines Stapels von Befehlen als eine einzige Operation in Form von verteilten Transaktionen.
- Unterstützt die Erstellung eigener skriptbasierter Erweiterungen für die Redis-Datenbank unter Verwendung des Lua-Interpreters, der ab Version 2.6.0 in Redis integriert ist.
- Es ermöglicht die Erstellung von Schlüsseln mit einer begrenzten Time-to-Live. Nach Ablauf der Zeitspanne wird ein solcher Schlüssel automatisch gelöscht.
- Redis Sentinel bietet Hochverfügbarkeit für Redis, so dass man damit einen Redis-Einsatz erstellen kann, der ohne menschliches Zutun bestimmten Arten von Ausfällen widersteht.
Redis kann in vielen Bereichen wie Gaming, Ad-Tech, Finanzdienstleistungen, Gesundheitswesen und IoT eingesetzt werden. In der Tat wurde es bereits von vielen bekannten Unternehmen wie Twitter, GitHub, Weibo, Pinterest, Snapchat, Craigslist, Digg, Stack Exchange, Flickr und vielen anderen erfolgreich eingesetzt. Der Verwendungszweck ist von Unternehmen zu Unternehmen unterschiedlich. Einige setzen Redis für den beabsichtigten Zweck ein, z. B. verwendet GitHub es als persistenten Schlüssel/Wertespeicher für die Routing-Informationen und eine Vielzahl anderer Daten. Stack Exchange verwendet es als Cache-Ebene. Flickr findet Redis-Listen sehr nützlich und alle Ereignisse, Uploads und Aktualisierungen durch das Aufgabensystem werden in eine Warteschlange in Form einer Redis-Liste gestellt. Digg verwendet die Zählerfunktionalität für kumulative Seitenereigniszähler. Und das sind nur ein paar Beispiele. Auf techstacks.io finden Sie eine große Liste von Unternehmen, die Redis verwenden. Die Popularität von Redis wächst rasant und die Zahl der Unternehmen nimmt ebenfalls zu.
Azure-Cache für Redis
Immer mehr Unternehmen entscheiden sich für Cloud-Dienste. Es gibt viele große und kleine Unternehmen auf der ganzen Welt, die sich auf Microsoft Azure verlassen, um ihre Anwendungen auszuführen. Eine der angebotenen Funktionen ist Azure Cache for Redis – ein sicherer, dedizierter Cache-Dienst von Microsoft. Er basiert auf Redis und kann auf die gleiche Weise genutzt werden. Wie es in der offiziellen Dokumentation heißt, gibt es viele Situationen, in denen Azure Cache for Redis hilfreich sein kann, und sie sind im Grunde genommen nahe an den Redis-Anwendungsfällen. Dieser Service ist in drei Stufen verfügbar, so dass Sie diejenige wählen können, die für Ihr Unternehmen am besten geeignet ist. Es wird keine kostenlose Preisstufe angeboten, und eigentlich gibt es dafür auch keinen Grund, denn Sie können Redis immer lokal ausprobieren, um zu verstehen, ob es Ihre Probleme löst oder nicht, und danach zu Azure wechseln.
Azure Cache for Redis bietet einerseits den gesamten Funktionsumfang und das Ökosystem von Redis und andererseits zuverlässiges Hosting und Monitoring durch Microsoft. Hier ist nur ein kurzer Überblick über die erzeugten Vorzüge:
- Azure Cache for Redis unterstützt eine Vielzahl von Programmiersprachen wie C, C#, Java, PHP, VCL, Fancy, Io, Lua, Perl, Rust, Go, Scala, Matlab, Python, so dass Sie bei der Wahl der Programmiersprache nicht zu sehr eingeschränkt sind.
- Da die Cache-Schicht und die Anwendungsschicht getrennt sind, können sie unabhängig voneinander skaliert werden und sind nicht von der Verfügbarkeit des jeweils anderen abhängig, was weitere Vorteile mit sich bringt.
- Die Daten können nicht nur im Arbeitsspeicher, sondern in jedem beliebigen persistenten Datenspeicher aufbewahrt werden. So können die Daten auch nach einem Ausfall verfügbar bleiben oder gesichert und in eine andere Redis-Instanz verschoben werden.
- Er verwendet die Redis-Authentifizierung und unterstützt auch SSL zur Sicherung der Cache/Client-Kommunikation.
- Der Microsoft Azure Cache for Redis-Dienst bietet auch Funktionen wie die Replikation. Wenn der primäre Cache ausfällt, wird das Replikat zum primären Cache und erstellt und füllt ein neues Replikat für ihn. Dieser Prozess erfolgt automatisch und wird von Microsoft Azure verwaltet.
- Wie jeder Microsoft Azure-Dienst ermöglicht auch Azure Cache for Redis die Überwachung des Zustands des Dienstes, der Nutzungsmetriken, der Cache-Leistung, die Konfiguration verschiedener Arten von Warnungen usw.
- Sie können sogar ein Wartungsfenster für Ihren Cache planen. Wenn es festgelegt ist, werden alle Aktualisierungen des Redis-Servers während dieses Zeitfensters durchgeführt.
- Sie können Daten in/aus Azure Cache for Redis importieren oder exportieren, was sehr hilfreich ist, wenn Sie Daten vorausbefüllen oder zwischen Instanzen migrieren müssen. Diese Operationen arbeiten mit RDB-Dateien, die vollständig mit Redis kompatibel sind. Daher können Sie Daten von jedem Redis-Server exportieren, unabhängig davon, wo er arbeitet, oder Sie können ohne Datenverlust auf einen anderen Server umziehen.
Die Kombination von Redis-Funktionen mit zuverlässigem Hosting und einer breiten Palette von Microsoft-Tools zieht eine große Anzahl von Unternehmen an. Alaska Airlines, SiriusIQ, Stackify, Tata Consultancy Services und viele andere wählen Azure Cache for Redis für ihre Lösungen. Ihre Geschäftsbereiche sind sehr unterschiedlich, was einmal mehr beweist, dass es in vielen Bereichen eingesetzt werden kann. Nachdem wir nun die allgemeinen Zwecke der Redis-Nutzung besprochen haben und ein grundlegendes Verständnis dafür haben, lassen Sie uns fortfahren und einen Schnellstart für die Nutzung von Microsoft Azure Cache for Redis mit .NET anbieten.
Azure Cache für Redis: Schnellstart
Eigentlich ist der Einstieg in Azure Cache for Redis ganz einfach. Sie müssen lediglich einen Cache erstellen und einrichten und die Cache-Clients so konfigurieren, dass sie auf den Cache zugreifen können. Wir werden jeden dieser Schritte überprüfen, um eine klare Vorstellung des Prozesses zu erhalten.
Einen Cache erstellen
Zuallererst sollte klargestellt werden, dass dieser Überblick viele Details enthält, die eher für Anfänger interessant sind.
Erstellen Sie zunächst ein Konto, falls Sie noch keins haben, und melden Sie sich beim Azure-Portal an. Wenn Sie damit bereits vertraut sind, können Sie die folgende Erklärung überspringen, andernfalls finden Sie hier die Schritte zur Erstellung des Azure Cache for Redis-Dienstes:
- Klicken Sie auf die Schaltfläche „Ressource erstellen“ in der oberen linken Ecke;
- Suchen Sie nach „Azure Cache for Redis“ und klicken Sie auf die Schaltfläche „Erstellen“;
- Füllen Sie die folgenden Felder aus:
- DNS-Name – Cache-Name;
- Abonnement;
- Ressourcengruppe;
- Standort. Wählen Sie diesen sorgfältig aus, wenn Sie den Dienst für ein bestehendes Projekt erstellen. Die Region sollte sich in der Nähe anderer Dienste befinden, die den Cache nutzen werden;
- Preisstufe. Die Preisstufe bestimmt die Größe, die Leistung und die Funktionen, die für den Cache verfügbar sind. Die Premium-Stufe bietet mehr Optionen, z. B. die Möglichkeit, einen Redis-Cluster, ein virtuelles Netzwerk usw. einzurichten, aber da wir ein einfaches Beispiel für die Nutzung des Cache betrachten, gehen wir auf diese Optionen nicht ein;
- „Aktivieren Sie den Nicht-SSL-Port (6379)“ – Diese Option sollte nicht verwendet werden, da die Zugriffsschlüssel über TCP im Klartext gesendet werden und den Zugang zu Ihrem Cache gefährden können.
Nach der Erstellung des Dienstes muss seine Übersichtsseite verfügbar sein, auf der Sie den Hostnamen, Nutzungsinformationen, Informationen zur Serverauslastung, Aktivitätsprotokolle, Schlüssel und viele andere nützliche Informationen finden können. Der nächste Schritt besteht darin, das Projekt zu erstellen und es für die Verwendung von Azure Cache for Redis zu konfigurieren.
Projekt- und Cache-Client-Konfiguration
Sie können diesen Dienst in verschiedenen Arten von Projekten verwenden und sogar über das Redis-Befehlszeilentool testen. In unserem Artikel werden wir ein Beispiel für die Verwendung in einer ASP.NET Core-Webanwendung betrachten. Wir werden ein .NET Core-Projekt von Grund auf neu erstellen, um alle für den Einstieg erforderlichen Schritte abzudecken. Führen Sie dazu die folgenden Schritte aus:
- Öffnen Sie Visual Studio;
- Klicken Sie auf die Menüoption „Datei“ und wählen Sie dann die Optionen „Neu“ und „Projekt“;
- Wählen Sie den Typ „ASP.NET Core Web Application“;
- Geben Sie den Projektnamen ein (in diesem Beispiel „AzureRedisIntro“), den Speicherort und klicken Sie auf „OK“;
- in diesem Beispiel werden wir ASP.NET Core 2.2 verwenden, also wählen Sie es in der Dropdown-Liste aus;
- Wählen Sie die Vorlage „API“ aus der Liste.
Hier sehen Sie Screenshots des Schritts zur Projekterstellung:
Da wir .NET Core verwenden, müssen wir das Paket „Microsoft.Extensions.Caching.Redis.Core“ über den NuGet-Paketmanager installieren. Klicken Sie dazu mit der rechten Maustaste auf den Projektnamen, wählen Sie „NuGet-Pakete verwalten…“, wechseln Sie auf die Registerkarte „Durchsuchen“ und suchen Sie das Paket.
Um sich mit dem erstellten Redis-Dienst zu verbinden, müssen wir den „Primary connection string“ in die Konfigurationsdatei kopieren. Sie finden sie auf der Übersichtsseite des Dienstes, indem Sie im Navigationsbereich auf den Abschnitt „Zugriffsschlüssel“ klicken. Die Konfigurationsdatei sollte also am Ende so aussehen:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"CacheConnection": "[Primary connection string]"
}
Nach diesen grundlegenden Vorbereitungen müssen wir den Zugriff auf den Cache-Dienst Redis konfigurieren. Dazu müssen Sie der Klasse Startup.cs die Methode `AddDistributedRedisCache` hinzufügen. Diese Methode ermöglicht die Verwendung des RedisCache über Dependency Injection in jedem Teil des Codes, der ein Instanzobjekt erwartet, das die Schnittstelle IDistributedCache implementiert. Hier ist der vollständige Inhalt der Datei „Startup.cs“:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace AzureRedisIntro {
public class Startup {
public static string CacheConnection = "";
public Startup(IHostingEnvironment env) {
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
CacheConnection = Configuration.GetConnectionString("CacheConnection");
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services) {
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddDistributedRedisCache(options => {
options.Configuration = Configuration.GetConnectionString("CacheConnection");
options.InstanceName = "RedisIntro"; // Your DNS Name
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
else {
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseMvc();
}
}
}
}
Verwendung des Azure Cache for Redis-Dienstes
Azure Cache for Redis kann entweder serialisierte .NET-Objekte oder primitive Datentypen zwischenspeichern. Für die Serialisierung können Sie einen beliebigen Serialisierer wählen, der für Sie bequemer ist, und in diesem Artikel werden wir das am häufigsten verwendete Paket Newtonsoft.Json verwenden. Es sollte bereits installiert sein, wenn Sie alle beschriebenen Schritte wiederholt haben.
Für unser recht einfaches Beispiel erstellen wir ein Modell, um die Speicherung serialisierter .NET-Objekte im Cache ein wenig zu überprüfen. Dazu erstellen Sie einfach einen neuen Ordner „Models“ und fügen die unten aufgeführte Datei „Book.cs“ hinzu:
using System;
namespace AzureRedisIntro.Models {
public class Book {
public Guid ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
}
Das Modell ist ziemlich klein und übersichtlich, daher gibt es keine Kommentare oder Erklärungen, und wir wenden uns dem Controller zu. Nachdem Sie das Projekt aus einer Vorlage erstellt haben, sollten Sie bereits einen Controller haben, in unserem Fall mit dem Namen „ValuesController“. Ersetzen Sie ihn durch den folgenden Code:
using AzureRedisIntro.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;
using Newtonsoft.Json;
using System;
namespace AzureRedisIntro.Controllers {
[Route("api/[controller]")]
[AllowAnonymous]
public class ValuesController : Controller {
private IDistributedCache _cache;
public ValuesController(IDistributedCache cache) {
_cache = cache;
}
[HttpGet("[action]")]
public object GetCacheValue(Guid bookID) {
if (bookID == Guid.Empty)
return BadRequest("Incorrect identifier.");
return JsonConvert.DeserializeObject(_cache.GetString(bookID.ToString()));
}
[HttpPost("[action]")]
public object SetCacheValue([FromBody]Book model) {
if (model == null)
return BadRequest("Model is empty.");
Book book = new Book() {
Description = model.Description,
Name = model.Name,
ID = model.ID
};
_cache.SetString(book.ID.ToString(), JsonConvert.SerializeObject(book));
return Ok();
}
}
}
Schauen wir uns jeden Teil des Codes an, um ein besseres Verständnis des Prozesses zu erhalten. Wir haben die Schnittstelle IDistributedCache bereits erwähnt, so dass die Rolle dieser Schnittstelle jetzt klar sein sollte, so dass wir nur die bereitgestellten Methoden überprüfen:
- Get, GetAsync – akzeptiert einen String-Schlüssel und ruft ein zwischengespeichertes Element als Byte[]-Array ab, wenn es im Cache gefunden wurde;
- Set, SetAsync – fügt dem Cache ein Element (als Byte[]-Array) unter Verwendung eines String-Schlüssels hinzu;
- Refresh, RefreshAsync – aktualisiert ein Element im Cache auf der Grundlage seines Schlüssels und setzt seine gleitende Verfallszeit (falls vorhanden) zurück;
- Remove, RemoveAsync – entfernt ein Cache-Element auf der Grundlage seines String-Schlüssels.
Im Beispiel haben wir mit den Methoden „GetCacheValue“ und „SetCacheValue“ die Verwendung der ersten beiden Methoden aus der Liste gezeigt (und, wie Sie sehen können, die synchronen Varianten). Nach der Ausführung eines Beispiels sollten diese Methoden die nächsten Ergebnisse liefern:
Wie Sie nach diesen kurzen Übersichten sehen können, ist alles ziemlich einfach, und Azure Cache for Redis ist ein wirklich einfach zu bedienender und leicht zu startender Dienst.
Zusammenfassend
In diesem Artikel haben wir versucht, einen allgemeinen Überblick über Redis und Azure Cache for Redis zu geben, um die Vorteile und Anwendungsfälle aufzuzeigen. Die meisten Informationen sind für Einsteiger nützlich oder für Personen, die sich für einige Details der Nutzung interessieren. Wir hoffen, dass dieser Artikel Anfängern einen Startpunkt bietet und andere dazu inspiriert, etwas Neues darüber zu lernen oder es sogar zu benutzen.