Cómo almacenar el tipo de colección Lista en Redis a través de StackExchange.
StackExchange, de StackOverFlow, es un contenedor .NET para Redis que cada vez más desarrolladores .NET utilizan en sus proyectos.
Dado que SS ya no es de código abierto en su nueva versión y tiene restricciones en la versión gratuita, la gran mayoría de los desarrolladores que utilizan ServiceStack se están migrando gradualmente a ServiceStack.
Problemas reales
Los desarrolladores que utilizan .NET encontrarán que el tipo Lista no tiene ninguna encapsulación de almacenamiento, por lo que deben implementar requisitos similares a los siguientes:
Supongamos que tengo un modelo de Cliente. public.class.Cliente
{
public.string.FirstName.{get; set;?}
público?
público ?
público?
público?
}
var clientes = new Listlt;Customergt;();
¿Cómo almacenar Listlt;customergt;clientes en Redis?
Pros y contras
Esto se debe a que StackExchange.Redis es un proxy de cliente puro, que solo implementa las funciones proporcionadas por Redis de forma gratuita y no encapsula ninguna otra función. Tampoco tiene coincidencia de tipos automática como un ORM.
Simplemente almacena pares clave-valor, como cadenas o
byte[] . Entonces, como puede ver, debe serializarse y almacenarse en un formato similar a Json. De manera similar a Protobuf-Net, usar NewtonSoft de terceros o el popular formato de serialización Protocol.Buffers
de Google también es una buena opción.
Redis admite cinco tipos de almacenamiento: cadenas, hashes, listas, conjuntos y conjuntos ordenados que, como se mencionó anteriormente, están compuestos por cadenas.
El tipo Set está desordenado y debe tener valores únicos, mientras que el tipo Lista está ordenado y permite duplicados.
Solución
Si solo desea almacenar en caché un lote de datos Listlt;Customergt;, encapsule sus propios métodos ListGet() y ListSet().
Hice la comparación usando List y String.
El tipo de lista de Redis también se diferencia del mundo .NET en que en realidad es una cola bidireccional que puede insertar valores a izquierda y derecha.
Entonces, si desea insertar datos en lotes, debe insertarlos uno por uno. El código se simplifica de la siguiente manera: // ListSet encapsulado
public?void?ListSetlt;Tgt;(string?key,?Listlt;Tgt;?value)
{
.....
// Las siguientes bases de datos son objetos de bases de datos de Redis.
foreach(var.single.in.value)
{
var.s.=.ConvertJson(single);?//serialize
database.ListRightPush(key,?s);?//Insértalos uno por uno
}
}
/ListGet encapsulado p >
public?void?ListGetlt;Tgt;(string?key)
{
...
//ListRange devuelve un conjunto de strings Objetos
//Necesitan ser deserializados en entidades una por una
var?vList?=?database.ListRange(key)?;?
Listlt ;Tgt; ?resultado?=?new?Listlt;Tgt;();
foreach?(var?item?in?vList)
{
var?model ?=?ConvertObjlt;Tgt;?(item);?//Deserialize
resultado.Add(model);
}
return?