Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Bagaimana saya bisa membaca dari Redis di dalam blok MULTI di Ruby?

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bisakah Anda terhubung ke Amazon ElastiСache Redis di luar Amazon?

  2. Bagaimana cara menyimpan dan mengambil string dengan aksen di redis?

  3. Pencadangan AOF dan RDB dalam redis

  4. pemendekan UUID

  5. Cara mengatur/mendapatkan kerangka data Pandas ke Redis menggunakan pyarrow