StackExchange.Redis Set/Get genéricos para configurar y leer valores
- La llamada interna
IDatabase.StringSet()escribe datos de tipo cadena en Redis - Lógica de serialización: objeto arbitrario → cadena JSON → arreglo de bytes UTF‑8 almacenado en Redis
- Lógica de deserialización: lectura del arreglo de bytes → cadena JSON → objeto genérico destino
- Valor devuelto:
true= configuración exitosa,false= configuración fallida
Espacios de nombres requeridos
using StackExchange.Redis;
using Newtonsoft.Json;
using System.Text;Lenguaje del código: CSS (css)
El siguiente ejemplo usa Set, recibe una clave, un arreglo de bytes y el tiempo de expiración.
/// <summary>
/// Escribir caché en Redis
/// </summary>
/// <param name="key">Clave de caché</param>
/// <param name="data">Cualquier objeto</param>
/// <param name="cacheTime">Duración de expiración 【minutos】</param>
/// <returns>true éxito / false fallo</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>
/// Serialización de objeto: object → byte[]
/// </summary>
private byte[] Serialize(object data)
{
string json = JsonConvert.SerializeObject(data);
return Encoding.UTF8.GetBytes(json);
}
/// <summary>
/// Leer caché por clave
/// </summary>
/// <typeparam name="T">Tipo objetivo</typeparam>
/// <param name="key">Clave de caché</param>
/// <returns>devuelve default(T) si el caché no existe</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>
/// Deserialización: byte[] → objeto T
/// </summary>
private T Deserialize<T>(byte[] serializedObject)
{
if (serializedObject == null)
{
return default(T);
}
string json = Encoding.UTF8.GetString(serializedObject);
return JsonConvert.DeserializeObject<T>(json);
}Lenguaje del código: PHP (php)
Notas
- Unidad de tiempo
En el códigoTimeSpan.FromMinutes(cacheTime)significa el valor ingresado representa 【minutos】
Si llamas desde un formulario conSet(key,val,1000), el caché expirará en 1000 minutos, no en segundos!
El código anterior del formulario usaba el valor
1000, es un error muy común.
Si necesitas usar segundos, cámbialo porTimeSpan.FromSeconds(cacheTime)
- Instalación de dependencias
Debes instalar ambos paquetes en NuGet:
StackExchange.RedisNewtonsoft.Json
- Formato de almacenamiento
Todos los objetos se serializan a binario JSON y se guardan en Redis; lo que ves en el cliente Redis es texto JSON estándar. - Compatibilidad con
RedisValuedb.StringGet(key)devuelveRedisValue, admite conversión implícita abyte[], por lo que se puede pasar directamente aDeserialize<T>. - Recomendación de seguridad para hilos
IConnectionMultiplexerdebe ser un singleton global, no crees una nueva conexión en cada lectura o escritura de Redis.
Ejemplo de uso
// Escribir (expira en 30 minutos)
bool ok = Set("user:1001", new {Id = 1001, Name = "test"}, 30);
// Leer
var user = Get<dynamic>("user:1001");
// Ejemplo de lectura de clase de entidad
// var model = Get<UserInfo>("user:1001");Lenguaje del código: JavaScript (javascript)
Recomendaciones
Extrae estos métodos junto con el código de conexión Redis a una clase helper estática independiente RedisHelper.cs. No los dejes dentro del código del formulario Form para lograr un desacoplamiento de lógica de negocio.
Escribir valor
Previous: Conectarse a Redis