Debug dei problemi di danneggiamento dei dati #
Un problema di cui può essere difficile eseguire il debug è se lo stesso RedisClient
l'istanza è condivisa su più thread che possono comportare la restituzione di dati danneggiati. In genere, questo è il risultato dell'utilizzo di IRedisClient
campo in un'istanza singleton o condividendolo come istanza statica. Per evitare ciò, ogni thread che utilizza Redis dovrebbe recuperare il client redis all'interno di un'istruzione using, ad esempio:
using var redis = redisManager.GetClient();
//...
Sfortunatamente il sito di chiamata che restituisce la risposta danneggiata o l'eccezione di runtime non identifica dove è stata utilizzata l'istanza del client Redis. Per aiutare a identificare dove vengono utilizzate le istanze del client, puoi affermare che il client viene utilizzato solo nel thread che lo ha risolto dal pool con:
RedisConfig.AssertAccessOnlyOnSameThread = true;
Questo acquisisce StackTrace del thread ogni volta che il client viene risolto dal pool che, poiché aggiunge molto sovraccarico, dovrebbe essere abilitato solo durante il debug dei problemi di connessione.
Se rileva che si sta accedendo al client da un thread diverso, genererà un InvalidAccessException
con il messaggio contenente i diversi Thread ID e lo StackTrace originale dove il client è stato risolto dal pool. Puoi confrontarlo con StackTrace dell'eccezione per identificare, si spera, dove il client viene utilizzato in modo improprio.
Evitare problemi di utilizzo simultaneo #
Cosa cercare nella tua base di codice per prevenire l'utilizzo simultaneo multiplo di un IRedisClient
esempio:
- Usa
IRedisClient
client dell'istanza redis all'interno di unusing
dichiarazione - Non utilizzare mai un'istanza client dopo che è stata eliminata
- Non utilizzare mai (o restituire) una "raccolta o risorsa di server" (ad es. Redis.Lists, lock) dopo che il client è stato eliminato
- Non mantenere mai un Singleton o
static
istanza a un client redis (soloIRedisClientsManager
fabbrica) - Non utilizzare mai lo stesso client redis in più thread, ad es. ogni thread risolve il proprio client dalla fabbrica