StackExchange.Redis generisches Set / Get zum Schreiben und Lesen
- Interner Aufruf von
IDatabase.StringSet()zum Speichern von Redis‑String‑Daten - Serialisierungslogik:beliebiges Objekt → JSON‑Zeichenkette → UTF8‑Byte‑Array in Redis ablegen
- Deserialisierungslogik:Byte‑Array einlesen → JSON‑Zeichenkette → generisches Zielobjekt
- Rückgabewert:
true= erfolgreich,false= fehlgeschlagen
Benötigte Namespaces
using StackExchange.Redis;
using Newtonsoft.Json;
using System.Text;Code-Sprache: CSS (css)
Das folgende Beispiel nutzt Set mit Schlüssel, Byte‑Array und Ablaufzeit.
/// <summary>
/// Schreibt einen Eintrag in den Redis‑Cache
/// </summary>
/// <param name="key">Cache‑Schlüssel</param>
/// <param name="data">Beliebiges Objekt</param>
/// <param name="cacheTime">Ablaufzeit 【Minuten】</param>
/// <returns>true erfolgreich / false fehlgeschlagen</returns>
private bool Set(string key, object data, int cacheTime)
{
if (data == null)
{
return false;
}
byte[] entryBytes = Serialize(data);
TimeSpan expiresIn = TimeSpan.FromMinutes(cacheTime);
return db.StringSet(key, entryBytes, expiresIn);
}
/// <summary>
/// Objekt‑Serialisierung: object → byte[]
/// </summary>
private byte[] Serialize(object data)
{
string json = JsonConvert.SerializeObject(data);
return Encoding.UTF8.GetBytes(json);
}
/// <summary>
/// Cache‑Eintrag über Schlüssel auslesen
/// </summary>
/// <typeparam name="T">Zieltyp</typeparam>
/// <param name="key">Cache‑Schlüssel</param>
/// <returns>Gibt default(T) zurück, falls der Schlüssel nicht existiert</returns>
public T Get<T>(string key)
{
RedisValue rValue = db.StringGet(key);
if (!rValue.HasValue)
{
return default(T);
}
T result = Deserialize<T>(rValue);
return result;
}
/// <summary>
/// Deserialisierung: byte[] → T‑Objekt
/// </summary>
private T Deserialize<T>(byte[] serializedObject)
{
if (serializedObject == null)
{
return default(T);
}
string json = Encoding.UTF8.GetString(serializedObject);
return JsonConvert.DeserializeObject<T>(json);
}Code-Sprache: PHP (php)
Hinweise
- Zeiteinheit
Im Code bedeutetTimeSpan.FromMinutes(cacheTime)dass der Eingabewert in 【Minuten】 angegeben wird
Wenn Sie im FormularSet(key,val,1000)aufrufen, läuft der Cache nach 1000 Minuten ab, nicht nach Sekunden!
Im vorherigen Formular‑Beispiel war fest
1000hinterlegt – das ist eine häufige Fehlerquelle.
Wenn Sie Sekunden verwenden möchten, ersetzen Sie durchTimeSpan.FromSeconds(cacheTime)
- Abhängigkeiten installieren
Beide NuGet‑Pakete müssen installiert sein:
StackExchange.RedisNewtonsoft.Json
- Daten‑Speicherformat
Alle Objekte werden in JSON‑Binärdaten umgewandelt und in Redis gespeichert. Im Redis‑Client sehen Sie normalen JSON‑Text. RedisValue‑Kompatibilitätdb.StringGet(key)liefertRedisValue, es kann implizit nachbyte[]konvertiert und direkt anDeserialize<T>übergeben werden.- Hinweis zur Thread‑Sicherheit
IConnectionMultiplexersollte als globales Singleton verwendet werden. Erstellen Sie nicht bei jedem Redis‑Lese‑/Schreibvorgang eine neue Verbindung.
Anwendungsbeispiel
// Schreiben (läuft nach 30 Minuten ab)
bool ok = Set("user:1001", new {Id = 1001, Name = "test"}, 30);
// Lesen
var user = Get<dynamic>("user:1001");
// Beispiel zum Einlesen einer Modell‑Klasse
// var model = Get<UserInfo>("user:1001");Code-Sprache: JavaScript (javascript)
Empfehlung
Lagern Sie diese Hilfsmethoden samt Redis‑Verbindungscode in einer separaten statischen Hilfsklasse RedisHelper.cs aus. Vermeiden Sie die Ablage im Formular‑Code, um eine saubere Trennung der Zuständigkeiten zu erreichen.
Wert schreiben
Previous: Mit Redis verbinden