Anda tidak bisa, karena semua perintah (termasuk get) sebenarnya dieksekusi pada waktu exec. Dalam situasi ini, perintah get hanya mengembalikan objek yang akan datang, bukan nilai sebenarnya.
Ada dua cara untuk mengimplementasikan transaksi tersebut.
Menggunakan klausa WATCH
Klausa jam tangan digunakan untuk melindungi dari pembaruan bersamaan. Jika nilai variabel diperbarui antara jam tangan dan klausa multi, maka perintah di blok multi tidak diterapkan. Terserah klien untuk mencoba transaksi lain kali.
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
Di sini scriptnya agak rumit karena isi bloknya bisa kosong, jadi tidak ada cara mudah untuk mengetahui apakah transaksi telah dibatalkan, atau tidak terjadi sama sekali. Umumnya lebih mudah ketika multi blok mengembalikan hasil dalam semua kasus kecuali jika transaksi dibatalkan.
Menggunakan skrip sisi server Lua
Dengan Redis 2.6 atau lebih baik, skrip Lua dapat dieksekusi di server. Eksekusi seluruh skrip adalah atom. Ini dapat dengan mudah diimplementasikan di 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"
Ini biasanya jauh lebih sederhana daripada menggunakan klausa WATCH.