sql >> Database >  >> NoSQL >> Redis

Basis HORLOGE doen met StackExchange.Redis

De reden WATCH niet direct zichtbaar is vanwege de manier waarop SE.Redis is ontworpen om opdrachten van verschillende oproepstacks op een enkele verbinding te multiplexen. Dit maakt het noodzakelijk dat elk transactiewerk zeer . is strak beheerd.

Het is mij niet helemaal duidelijk wat het doel van "onveranderd" op zichzelf zou zijn , zonder vergelijking met een bekende waarde - anders creëer je gewoon een raceconditie. Het zou zeker mogelijk zijn om er ondersteuning voor toe te voegen, maar ik zou graag eerst de verwachte use-case willen begrijpen. Kun je het uitleggen?

Opnieuw uw bewerking; uw favoriete voorbeeld (de laatste) is gewoon niet mogelijk met redis - niets te maken met SE.Redis; als je een GET . doet in een MULTI , krijg je het antwoord pas als de EXEC voltooid - dus u kunt de waarde in de SET . onmogelijk gebruiken :het is nog niet beschikbaar .

Als het niet voor multiplexen was, zou je je tweede voorbeeld (gebaseerd op wat SE.Redis doet) een beetje opnieuw kunnen ordenen:

WATCH key
val = GET key
MULTI
val = val + 1
SET key $val
EXEC

dit is de typische gebruik van WATCH :je kijkt de dingen die u van tevoren opvraagt, dan weet u dat {key} is ongewijzigd tijdens deze lus (of in ieder geval zal de transactie zijn afgebroken; geen inconsistente toestand). Echter, WATCH speelt niet goed met een multiplexer , daarom dwingt SE.Redis u om de waarde voorafgaand aan de transactie op te halen , waarna u de waarde kunt vergelijken om te bevestigen dat deze ongewijzigd is. Zelfde resultaat; iets andere benadering, maar het is multiplexer-veilig. Zie hier voor meer informatie over dat onderwerp.




  1. MongoDB $eq Aggregation Pipeline Operator

  2. Hoe kan ik meerdere documenten in mangoest bijwerken?

  3. Wat is een goede strategie om soortgelijke woorden te groeperen?

  4. Importeer een JSON-bestand in MongoDB met mongoimport