2011-09-25 11 views
15

Sto utilizzando la libreria di Booksleeve in un'applicazione C#/ASP.NET 4. Attualmente l'oggetto RedisConnection è un oggetto statico attraverso la mia classe MonoLink. Devo mantenere questa connessione aperta o dovrei aprirla/chiuderla dopo ogni query/transazione (come sto facendo ora)? Solo un po 'confuso. Ecco come lo sto usando, al momento:Con quale frequenza devo aprire/chiudere la mia connessione a Booksleeve?

public static MonoLink CreateMonolink(string URL) 
{ 
    redis.Open(); 
    var transaction = redis.CreateTransaction(); 

    string Key = null; 

    try 
    { 
     var IncrementTask = transaction.Strings.Increment(0, "nextmonolink"); 
     if (!IncrementTask.Wait(5000)) 
     { 
      transaction.Discard(); 
      throw new System.TimeoutException("Monolink index increment timed out."); 
     } 

     // Increment complete 
     Key = string.Format("monolink:{0}", IncrementTask.Result); 

     var AddLinkTask = transaction.Strings.Set(0, Key, URL); 
     if (!AddLinkTask.Wait(5000)) 
     { 
      transaction.Discard(); 
      throw new System.TimeoutException("Add monolink creation timed out."); 
     } 

     // Run the transaction 
     var ExecTransaction = transaction.Execute(); 
     if (!ExecTransaction.Wait(5000)) 
     { 
      throw new System.TimeoutException("Add monolink transaction timed out."); 
     } 
    } 
    catch (Exception ex) 
    { 
     transaction.Discard(); 
     throw ex; 
    } 
    finally 
    { 
     redis.Close(false); 
    } 

    // Link has been added to redis 
    MonoLink ml = new MonoLink(); 
    ml.Key = Key; 
    ml.URL = URL; 

    return ml; 
} 

Grazie, in anticipo, per eventuali risposte/insight. Inoltre, c'è qualche tipo di documentazione ufficiale per questa libreria? Grazie S.O.^_ ^.

risposta

8

Devo mantenere questa connessione aperta, oppure devo aprire/chiudere dopo ogni query/transazione (come sto facendo ora)?

C'è probabilmente un po 'in testa, se si apre una nuova connessione ogni volta che si vuole fare una query/transazione e anche se Redis è progettato per alto livello di client collegati contemporaneamente, ci potrebbero essere problemi di prestazioni se il loro numero è di circa decine di migliaia. Per quanto ne so, il pooling delle connessioni dovrebbe essere fatto dalle librerie client (perché redis stesso non ha questa funzionalità), quindi dovresti controllare se booksleeve supports questa roba. Altrimenti dovresti aprire la connessione all'avvio dell'applicazione e tenerla aperta per tutta la vita (nel caso in cui non ti servano client paralleli connessi a redis per qualche motivo).

Inoltre, c'è qualche tipo di documentazione ufficiale per questa libreria?

L'unica documentazione che sono riuscito a trovare su come usarlo era tests folder nei suoi codici sorgente.

25

According to il author of Booksleeve,

Il collegamento è sicuro e destinato ad essere massicciamente condivisa filo; non effettuare una connessione per operazione.

+1

Questa dovrebbe essere la risposta accettata – welegan

4

Per riferimento (continua @bzlm's answer), ho creato un Singleton che fornisce sempre la stessa connessione Redis utilizzando BookSleeve (se è chiuso, è in fase di creazione. Altrimenti, la connessione esistente viene servito).

Guardate questa: https://stackoverflow.com/a/8777999/290343

si consuma in quel modo:

RedisConnection connection = Redis.RedisConnectionGateway.Current.GetConnection(); 
Problemi correlati