Domanda Si tratta di un utilizzo valido di ServiceStack Redis?


Sono nuovo di Redis (utilizzandolo in un servizio ospitato) e voglio usarlo come memoria di dimostrazione / sandbox per gli elenchi.

Io uso il seguente pezzo di codice. Per me funziona. Ma è un uso valido (e non del tutto sbagliato) per un sito Web di piccole dimensioni con più utenti simultanei (fino a 100) (per una piccola quantità di dati - fino a 1000 voci di elenco)?

Sto usando una connessione statica e un elenco tipizzato redisclient statico come questo:

public class MyApp
{   
    private static ServiceStack.Redis.RedisClient redisClient;

    public static IList<Person> Persons;
    public static IRedisTypedClient<Person> PersonClient;

    static MyApp()
    {
        redisClient = new RedisClient("nnn.redistogo.com", nnn) { Password = "nnn" };
        PersonClient = redisClient.GetTypedClient<Person>();
        Persons = PersonClient.Lists["urn:names:current"];
    }
}

Facendo questo ho un elenco di dati persistente molto facile da usare, che è esattamente quello che voglio quando sto costruendo / dimostrando i blocchi di base della mia applicazione.

foreach (var person in MyApp.Persons) ...

Aggiungere una nuova persona:

MyApp.Persons.Add(new Person { Id = MyApp.PersonClient.GetNextSequence(), Name = "My Name" });

La mia preoccupazione è (al momento) non il fatto che sto caricando la lista completa in memoria in Appstart, ma piuttosto la possibilità che la mia connessione all'host redis non stia seguendo standard buoni - o che ci sia qualche altro problema che non sono consapevole di

Grazie


11
2017-11-11 12:45


origine


risposte:


In realtà quando usi PersonClient.Lists["urn:names:current"] in realtà stai memorizzando un riferimento a una connessione RedisClient che non è thread-safe. Va bene se si trova in un'app GUI o Console, ma non è l'ideale in un'applicazione web multi-thread. Nella maggior parte degli scenari si desidera utilizzare una factory di connessione thread-safe, ad es.

var redisManager = new PooledRedisClientManager("localhost:6379");

Che funziona molto come un pool di connessione al database. Quindi ogni volta che vuoi accedere a RedisClient funziona come:

using (var redis = redisManager.GetClient())
{
    var allItems = redis.As<Person>().Lists["urn:names:current"].GetAll();
}

Nota: .As<T> è un alias più breve per .GetTypedClient<T> Un'altra scorciatoia conveniente per eseguire un client tipizzato da un redisManager è:

var allItems = redisManager.ExecAs<Person>(r => r.Lists["urn:names:current"].GetAll());

Di solito preferisco passare IRedisClientsManager nel mio codice quindi non mantiene una connessione RedisClient ma può accedervi ogni volta che è necessario.


16
2017-11-11 15:54



C'è un progetto di esempio Qui


0
2018-03-19 18:15