2012-05-15 18 views
9

Sto progettando un servizio Web che utilizza Redis come database e desidero conoscere le best practice per l'utilizzo di Redis che si connette al client StackService.Redis serviceStack client di connessione pool

Il punto è che ho letto su Redis e ho trovato che il modo migliore per interagire con il server è l'utilizzo di una singola connessione concorrente.

Il problema è che, nonostante sto usando PooledRedisClientManager ogni volta che un client web fa una richiesta al servizio web ho un un cliente più connesso (connessione aperta) al server Redis e questo numero di client connesso aumenta senza limiti consumando sempre più memoria.

L'esempio di codice 'colpa':

PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost"); 
var redisClient = pooledClientManager.GetClient(); 
using (redisClient) 
{ 
    redisClient.Set("key1", "value1"); 
} 

Quello che ho fatto per risolvere il problema, è creare una classe che implementa il pattern Singleton con una statica RedisClient var; Che se lo redisClient non è inizializzato ne crea uno nuovo, e se lo è, restituisce quello inizializzato.

Soluzione:

public class CustomRedisPooledClient 
{ 
    private static CustomRedisPooledClient _instance = null; 
    public RedisClient redisClient = null; 

    // Objeto sincronización para hacer el Lock 
    private static object syncLock = new object(); 

    private CustomRedisPooledClient() 
    { 
     redisClient = new RedisClient("localhost"); 
    } 

    public static CustomRedisPooledClient GetPooledClient() 
    { 
     if (_instance == null) 
     { 
      lock (syncLock) 
      { 
       if (_instance == null) 
       { 
        _instance = new CustomRedisPooledClient(); 
       } 
      } 
     } 
     return _instance; 
    } 
} 

CustomRedisPooledClient customRedisPooledClient = CustomRedisPooledClient.GetPooledClient(); 
using (customRedisPooledClient.redisClient) 
{ 
    customRedisPooledClient.redisClient.Set("key1", "value1"); 
} 

Si tratta di una buona pratica?

Grazie in anticipo!

+0

Perché hai estratto un ** redisClient ** dal pool ma non lo stai utilizzando? ma stai usando ** pooledClientManager **? – mythz

+0

E 'stato un errore scrivere la domanda, ora è corretta –

+1

k, io modificherei la tua domanda perché il tuo' codice di errore 'ora funziona e la ** Soluzione ** fornita non è l'ideale. Aggiungi qual è il problema e fai riferimento alla risposta accettata per la soluzione ideale. – mythz

risposta

16

ho usato PooledRedisClientManager e funziona bene:

codice di esempio che ho eseguito solo una volta:

static PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost"); 

e il codice corro su molte discussioni:

var redisClient = pooledClientManager.GetClient(); 
using (redisClient) 
{ 
    redisClient.Set("key" + i.ToString(), "value1"); 
} 

e I avere solo 11 client collegati al server.

+0

Se faccio lo stesso ottengo un nuovo thread ad ogni richiesta fatta dal browser. Ho eseguito il debug e creato un nuovo thread (client) quando la riga redisClient.Set ("chiave" + i.ToString(), "valore1"); viene eseguito e perdo il controllo e sembra che sarà aperto per sempre. Ho fatto un test aggiornando la pagina web che chiama l'URL del servizio e ho raggiunto 100 client connessi –

+0

Forse il problema è che eseguo il codice su ogni richiesta, vero? –

+0

Sei sicuro di non eseguire "PooledRedisClientManager pooledClientManager = new PooledRedisClientManager (" localhost ");" ogni volta? – eyossi

Problemi correlati