Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Làm cách nào tôi có thể đọc từ Redis bên trong một khối MULTI trong Ruby?

Bạn không thể, vì tất cả các lệnh (bao gồm get) thực sự được thực thi tại thời điểm thực thi. Trong trường hợp này, lệnh get chỉ trả về một đối tượng trong tương lai, không trả về giá trị thực.

Có hai cách để thực hiện giao dịch đó.

Sử dụng mệnh đề XEM

Điều khoản đồng hồ được sử dụng để bảo vệ chống lại các bản cập nhật đồng thời. Nếu giá trị của biến được cập nhật giữa mệnh đề watch và multi, thì các lệnh trong khối multi sẽ không được áp dụng. Khách hàng có thể thực hiện giao dịch vào lúc khác.

Vòng lặp
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

Ở đây, tập lệnh hơi phức tạp vì nội dung của khối có thể trống, vì vậy không có cách nào dễ dàng để biết liệu giao dịch đã bị hủy hay nó hoàn toàn không diễn ra. Nói chung sẽ dễ dàng hơn khi đa khối trả về kết quả trong mọi trường hợp ngoại trừ trường hợp giao dịch bị hủy.

Sử dụng tập lệnh phía máy chủ Lua

Với Redis 2.6 trở lên, các tập lệnh Lua có thể được thực thi trên máy chủ. Việc thực thi toàn bộ tập lệnh là nguyên tử. Nó có thể được triển khai dễ dàng trong 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"

Điều này thường đơn giản hơn nhiều so với việc sử dụng mệnh đề XEM.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ví dụ trong việc sử dụng RedisStore trong socket.io

  2. phpredis trên Windows 7 64bit xampp

  3. Lưu trữ nhiều phiên bản dữ liệu trong bộ nhớ cache của Redis

  4. Chạy redis trên hình ảnh nodejs Docker

  5. Cách lấy DIFF trên tập hợp đã sắp xếp