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.