Bạn không thể, vì tất cả các lệnh (bao gồm cả get) đều thực sự được thực thi tại thời gian thực hiện. Trong tình huống này, lệnh get chỉ trả về một đối tượng tương lai, không phải giá trị thực.
Có hai cách để thực hiện giao dịch đó.
Sử dụng một điều khoản XEM
Mệnh đồng hồ được sử dụng để bảo vệ chống lại các cập nhật đồng thời. Nếu giá trị của biến được cập nhật giữa điều khoản đồng hồ và đa, thì các lệnh trong khối đa không được áp dụng. Tùy thuộc vào khách hàng để thử giao dịch lần khác.
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
Tại đâ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 giao dịch có bị hủy hay không. Nó thường dễ dàng hơn khi khối đa trả về kết quả trong mọi trường hợp ngoại trừ nếu giao dịch bị hủy.
Sử dụng Lua server-side scripting
Với Redis 2.6 hoặc tốt hơn, kịch bản Lua thể được thực hiện trên máy chủ. Việc thực hiện toàn bộ kịch bản là nguyên tử. Nó có thể dễ dàng được triển khai 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 sử dụng mệnh đề WATCH.
Nguồn
2012-07-03 12:40:58
Tôi e rằng bạn không thể làm điều đó. –