sql >> Database >  >> NoSQL >> Redis

Problemen oplossen

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 een using 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 de IRedisClientsManager fabriek)
  • Gebruik nooit dezelfde redis-client in meerdere threads, d.w.z. laat elke thread hun eigen client vanuit de fabriek oplossen

  1. Hoe kan ik commando's in redis uitvoeren zonder enige reactie te krijgen?

  2. MongoDB gaat Sharding gebruiken met $lookup Aggregation Operator

  3. De opdracht UNSUBSCRIBE gebruiken in Redis 2.6.11

  4. Meertalige gegevensmodellering op MongoDB