Redis
 sql >> база данни >  >> NoSQL >> Redis

Python &Redis:Най-добри практики за приложения за мениджър/работник

Вашият проблем е, че се опитвате да изпълнявате няколко команди едновременно с една връзка с redis.

Очаквате нещо като

Thread 1     Thread 2
LLEN test    
1                            
LPOP test   
command      
             LLEN test
             0

но получавате

Thread 1     Thread 2
LLEN test    
1                            
LPOP test   
             LLEN test
             command
0

Резултатите се връщат в същия ред, но няма нищо, свързващо нишка или команда с конкретен резултат. Отделните връзки на redis не са нишки безопасни - ще ви трябва по една за всяка работна нишка.

Можете също да видите подобни проблеми, ако използвате тръбопровода неподходящо – той е предназначен само за записване на сценарии като добавяне на много елементи към списък, където можете да подобрите производителността, като приемете, че LPUSH е успял, вместо да чакате сървърът да ви каже, че е успешен след всеки вещ. Redis пак ще върне резултатите, но те не са непременно резултати от последната изпратена команда.

Освен това основният подход е разумен. Има обаче няколко подобрения, които можете да направите:

  • Вместо да проверявате дължината, просто използвайте неблокиращ LPOP – ако върне null, списъкът е празен
  • Добавете таймер, така че ако списъкът е празен да изчака, а не просто да издава друга команда.
  • Включете проверка за анулиране в условието на цикъла while
  • Обработвайте грешки при свързване – използвам външен цикъл, настроен така, че ако връзката не успее, работникът ще се опита да се свърже отново (по същество рестартирайте главната ) за разумен брой опити, преди напълно да прекрати работния процес.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kubernetes NFS съхранение с помощта на PV и PVC

  2. Django - Как да използвам асинхронна опашка от задачи с целина и redis

  3. Повторен опит за свързване на клиента с Node JS Redis

  4. Redis стартира ръчно с init.d, но не и при стартиране

  5. използване на Async в транзакция в приложението Spring