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

Как да приложите транзакция с връщане назад в Redis

Ако имате нужда от връщане на транзакцията, препоръчвам да използвате нещо различно от Redis. Redis транзакциите не са същите като при други хранилища за данни. Дори Multi/Exec не работи за това, което искате - първо, защото няма връщане назад. Ако искате връщане назад, ще трябва да издърпате и двата списъка, за да можете да възстановите - и се надяваме, че между нашето условие за грешка и "връщането" никой друг клиент също не е променил нито един от списъците. Да направите това по разумен и надежден начин не е тривиално, нито просто. Също така вероятно няма да е добър въпрос за SO, тъй като би бил много широк, а не специфичен за Redis.

Сега относно това защо EXEC не прави това, което човек може да си помисли. В предложения от вас сценарий MULTI/EXEC само обработва случаите на:

  1. Настройвате ЧАСОВНИЦИ, за да сте сигурни, че няма други промени
  2. Вашият клиент умира, преди да издаде EXEC
  3. Паметта на Redis липсва

Напълно е възможно да се получат грешки в резултат на издаване на командата EXEC. Когато издадете EXEC, Redis ще изпълни всички команди в опашката и връща списък с грешки. Той няма да осигури случая на add-to-list-1 да работи и add-to-list-2 не работи. Двата си списъка все още ще не са синхронизирани. Когато издадете, кажете LPUSH след издаване на MULTI, винаги ще получите OK освен ако не:

  • a) по-рано добавен часовник и нещо в този списък се промени или
  • b) Redis връща условие OOM в отговор на команда за натискане на опашка

DISCARD не работи, както някои си мислят. DISCARD се използвавместо EXEC, а не като механизъм за връщане назад. След като издадете EXEC, вашата транзакция е завършена. Redis изобщо няма механизъм за връщане назад – транзакцията на Redis не е за това.

Ключът към разбирането на това, което Redis нарича транзакции, е да се осъзнае, че те са по същество командна опашка на ниво клиентска връзка. Те не са машина за състояние на базата данни.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Отказ при отказ на клъстер

  2. Стартирайте redis-сървъра с конфигурационен файл

  3. Redis не улавя събития за излъчване в Laravel 5.1

  4. Как да приложите транзакция с връщане назад в Redis

  5. Събитието при изтичане на ключа