sql >> Database teknologi >  >> NoSQL >> Redis

Hvordan kan jeg læse fra Redis inde i en MULTI-blok i Ruby?

Det kan du ikke, da alle kommandoer (inklusive get) faktisk udføres på exec tidspunkt. I denne situation returnerer get-kommandoen kun et fremtidigt objekt, ikke den faktiske værdi.

Der er to måder at implementere en sådan transaktion på.

Brug af en WATCH-klausul

Watch-klausulen bruges til at beskytte mod samtidige opdateringer. Hvis værdien af ​​variablen opdateres mellem uret og multi-klausulen, anvendes kommandoerne i multiblokken ikke. Det er op til klienten at forsøge transaktionen en anden gang.

loop do
    $redis.watch "foo" 
    val = $redis.get("foo")
    if val == "bar" then
        res = $redis.multi do |r|
            r.set("foo", "baz") 
        end
        break if res
    else
        $redis.unwatch "foo"
        break
    end
end

Her er scriptet lidt komplekst, fordi indholdet af blokken kan være tomt, så der er ingen nem måde at vide, om transaktionen er blevet annulleret, eller om den slet ikke fandt sted. Det er generelt nemmere, når multiblokken returnerer resultater i alle tilfælde undtagen hvis transaktionen annulleres.

Brug af Lua server-side scripting

Med Redis 2.6 eller bedre kan Lua-scripts udføres på serveren. Udførelsen af ​​hele manuskriptet er atomart. Det kan nemt implementeres i Ruby:

cmd = <<EOF
    if redis.call('get',KEYS[1]) == ARGV[1] then
       redis.call('set',KEYS[1],ARGV[2] )
    end
EOF
$redis.eval cmd, 1, "foo", "bar", "baz"

Dette er typisk meget enklere end at bruge WATCH-sætninger.



  1. Hvordan kan jeg vente på, at en docker-container er oppe at køre?

  2. Mongoose - Hvordan grupperes efter og befolkes?

  3. Hvad skal du vide, når du begynder at arbejde med MongoDB i produktionen - ti tips

  4. Sådan implementeres Open Source-databaser