sql >> Databasteknik >  >> NoSQL >> Redis

Hur man implementerar transaktion med återställning i Redis

Om du behöver återställa transaktioner rekommenderar jag att du använder något annat än Redis. Redis-transaktioner är inte desamma som för andra databutiker. Inte ens Multi/Exec fungerar för det du vill ha – först eftersom det inte finns någon rollback. Om du vill ha återställning måste du dra ner båda listorna så att du kan återställa - och hoppas att mellan vårt feltillstånd och "återställningen" har ingen annan klient också ändrat någon av listorna. Att göra detta på ett förnuftigt och tillförlitligt sätt är inte trivialt, inte heller enkelt. Det skulle förmodligen inte heller vara en bra fråga för SO eftersom den skulle vara väldigt bred och inte Redis-specifik.

Nu till varför EXEC inte gör vad man kan tro. I ditt föreslagna scenario MULTI/EXEC endast hanterar ärenden om:

  1. Du ställer in WATCHES för att säkerställa att inga andra ändringar har skett
  2. Din klient dör innan EXEC utfärdas
  3. Redis har slut på minne

Det är fullt möjligt att få fel som ett resultat av att utfärda EXEC-kommandot. När du utfärdar EXEC kommer Redis att köra alla kommandon i kön och returnerar en lista med fel. Det ger inte fallet att add-to-list-1 fungerar och add-to-list-2 misslyckas. Du skulle fortfarande ha dina två listor osynkroniserade. När du utfärdar, säg en LPUSH efter att ha utfärdat MULTI, får du alltid tillbaka ett OK såvida du inte:

  • a) tidigare lagt till en klocka och något i listan ändrats eller
  • b) Redis returnerar ett OOM-villkor som svar på ett köat push-kommando

DISCARD fungerar inte som vissa kanske tror. DISCARD används istället för EXEC, inte som en återställningsmekanism. När du har utfärdat EXEC är din transaktion slutförd. Redis har ingen återställningsmekanism alls - det är inte vad Redis transaktion handlar om.

Nyckeln till att förstå vad Redis kallar transaktioner är att inse att de i huvudsak är en kommandokö på klientanslutningsnivå. De är inte en databastillståndsmaskin.



  1. Infoga element i kapslade arrayer i MongoDB

  2. Hur man förfinar exporterade MongoDB-dokument i mongoexport

  3. Att använda multiprocessing pool från selleri uppgift väcker undantag

  4. Hur mycket snabbare är Redis än mongoDB?