2015-09-11 10 views
7

Ho letto che per connettersi alla cache Azure Redis è meglio seguire questa pratica:Azure Redis StackExchange.Redis ConnectionMultiplexer in ASP.net MVC

private static ConnectionMultiplexer Connection { get { return LazyConnection.Value; } } 

    private static readonly Lazy<ConnectionMultiplexer> LazyConnection = 
     new Lazy<ConnectionMultiplexer>(
      () => 
      { 
       return 
        ConnectionMultiplexer.Connect(connStinrg); 
      }); 

E secondo docs Azure Redis:

La connessione a Azure Redis Cache è gestita dalla classe ConnectionMultiplexer. Questa classe è progettata per essere condivisa e riutilizzata in tutta l'applicazione client e non deve essere creata per ciascuna operazione.

Quindi, qual è la procedura migliore per condividere ConnectionMultiplexer nella mia app ASP.net MVC? Dovrebbe essere chiamato in Global.asax, o dovrei inizializzarlo una volta per Controller, o smth. altro ?

Inoltre, ho un servizio che ha il compito di comunicare con l'app, quindi se voglio comunicare con Redis all'interno del servizio dovrei inviare l'istanza di ConnectionMultiplexer al servizio da Controller, o dovrei inizializzarla in tutti i miei servizi, o ?

Come potete vedere sono un po 'perso qui, quindi per favore aiutatemi!

risposta

6

I documenti hanno ragione, si dovrebbe avere solo un'istanza di ConnectionMultiplexer e riutilizzarla. Non crearne più di uno, è consigliabile che sia shared and reused.

Ora per la parte di creazione, non dovrebbe essere in Controller o in Global.asax. Normalmente dovresti avere la tua classe RedisCacheClient (magari implementando qualche interfaccia ICache) che usi un'istanza privata statica di ConnectionMultiplexer all'interno e questo è il posto dove dovrebbe essere il tuo codice di creazione - esattamente come lo hai scritto nella tua domanda. La parte Lazy rinvierà la creazione di Connection Multiplexer fino al primo utilizzo.

0

Dears;

È possibile riutilizzare StackExchange.Redis ConnectionMultiplexer utilizzando il seguente codice. Può essere utilizzato in qualsiasi livello del tuo codice.

public class RedisSharedConnection 
{ 
    private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() => 
    { 
     ConnectionMultiplexer connectionMultiplexer = ConnectionMultiplexer.Connect(ConfigurationManager.ConnectionStrings["RedisConnectionString"].ConnectionString); 
     connectionMultiplexer.PreserveAsyncOrder = false; 
     return connectionMultiplexer; 
    }); 

    public static ConnectionMultiplexer Connection 
    { 
     get 
     { 
      return lazyConnection.Value; 
     } 
    } 
}