Problemen met gegevenscorruptie opsporen #
Een probleem dat moeilijk te debuggen kan zijn, is als dezelfde RedisClient
instantie wordt gedeeld over meerdere threads, wat kan resulteren in het retourneren van beschadigde gegevens. Meestal is dit het resultaat van het gebruik van IRedisClient
veld in een singleton-instantie of delen als een statische instantie. Om dit te voorkomen, moet elke thread die Redis gebruikt de redis-client ophalen in een gebruiksverklaring, bijvoorbeeld:
using var redis = redisManager.GetClient();
//...
Helaas identificeert de call-site die de beschadigde respons of runtime Exception retourneert niet waar anders de Redis-clientinstantie werd gebruikt. Om te helpen identificeren waar clientinstanties worden gebruikt, kunt u stellen dat de client alleen wordt gebruikt in de thread die het vanuit de pool heeft opgelost met:
RedisConfig.AssertAccessOnlyOnSameThread = true;
Dit legt de StackTrace van de thread vast telkens wanneer de client wordt opgelost vanuit de pool, wat, omdat het veel overhead toevoegt, alleen moet worden ingeschakeld bij het oplossen van verbindingsproblemen.
Als het detecteert dat de client wordt benaderd vanuit een andere thread, genereert het een InvalidAccessException
met het bericht met de verschillende Thread Ids en de originele StackTrace waar de klant werd opgelost vanuit de pool. U kunt dit vergelijken met de StackTrace van de uitzondering om hopelijk te identificeren waar de client oneigenlijk wordt gebruikt.
Problemen met gelijktijdig gebruik vermijden #
Waar u op moet letten in uw codebase om te voorkomen dat een IRedisClient
meerdere keren tegelijk wordt gebruikt voorbeeld:
- Gebruik
IRedisClient
redis instance-client binnen eenusing
verklaring - Gebruik nooit een client-instantie nadat deze is verwijderd
- Gebruik (of retourneer) nooit een "serververzameling of -bron" (bijv. Redis.Lists, lock) nadat de client is verwijderd
- Houd nooit een Singleton of
static
instantie naar een redis-client (alleen deIRedisClientsManager
fabriek) - Gebruik nooit dezelfde redis-client in meerdere threads, d.w.z. laat elke thread hun eigen client vanuit de fabriek oplossen