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ặploop 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.