sql >> Databasteknik >  >> NoSQL >> Redis

Hur man gör grundläggande WATCH med StackExchange.Redis

Anledningen till WATCH inte exponeras direkt beror på hur SE.Redis är designad för att multiplexa kommandon från olika anropsstackar på en enda anslutning. Detta gör det nödvändigt att alla transaktionsarbeten är mycket tätt hanterad.

Jag vet inte riktigt vad syftet med "oförändrat" skulle vara i sig själv , utan jämförelse med något känt värde - annars skapar du bara ett tävlingstillstånd. Det skulle definitivt vara möjligt att lägga till stöd för det, men jag skulle verkligen vilja förstå det förväntade användningsfallet först. Kan du förklara?

Re din redigering; ditt föredragna exempel (det sista) är helt enkelt inte möjligt med redis - inget att göra med SE.Redis; om du gör en GET inuti en MULTI , du får inte svaret förrän EXEC slutförs - så du kan omöjligen använda värdet i SET :det är inte tillgängligt ännu .

Om det inte var för multiplexering, kunde du ordna om ditt andra exempel (baserat på vad SE.Redis gör) lite:

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

detta är det typiska användning av WATCH :du tittar de saker som du frågar i förväg, då vet du att {key} är oförändrad under denna loop (eller åtminstone kommer transaktionen att ha avbrutits; inget inkonsekvent tillstånd). Men WATCH spelar inte bra med en multiplexer , vilket är anledningen till att SE.Redis tvingar dig ner på vägen för att hämta värdet före transaktionen , så att du kan jämföra värdet för att hävda att det är oförändrat. Samma resultat; något annorlunda tillvägagångssätt, men det är multiplexersäkert. För mer om det ämnet se här.




  1. MongoDB $count Aggregation Operator

  2. Sök i MongoDB i en array och sortera efter antal matchningar

  3. Resulterar varje anrop inom ett multi()-anrop i phpredis i en ny nätverksresa till redis?

  4. Enheter att använda för maxdistance och MongoDB?