2013-04-07 26 views
11

Redis đề xuất phương pháp sử dụng SET với các tham số tùy chọn làm cơ chế khóa. I E. "SET lock 1 EX 10 NX" sẽ chỉ thiết lập khóa nếu nó chưa tồn tại và nó sẽ hết hạn sau 10 giây.Node Redis - SET với EX và NX?

Tôi đang sử dụng nút Redis, có phương thức set(), nhưng tôi không chắc cách chuyển thông số bổ sung để khóa hết hạn và không được tạo nếu khóa đã tồn tại hoặc thậm chí là khả thi.

Có lẽ tôi phải sử dụng setnx() và hết hạn() làm các cuộc gọi riêng biệt?

Trả lời

30

Sau khi đọc mã nguồn Node Redis, tôi thấy rằng tất cả các phương pháp chấp nhận một số bất kỳ các đối số . Khi một lỗi về số lượng không chính xác của các đối số được tạo ra, điều này được tạo ra bởi Redis không phải là mô-đun nút.

Nỗ lực đầu tiên của tôi để cung cấp nhiều đối số là vì tôi chỉ cài đặt Redis 2.2.x, trong đó SET chỉ chấp nhận đối số NX và EX với 2.6.12.

Vì vậy, với Redis 2.6.12 cài đặt, các cuộc gọi phương pháp sau sẽ làm việc với redis nút để thiết lập một biến nếu nó không tồn tại và đặt nó là hết hiệu lực sau 5 phút:

$client->set('hello', 'world', 'NX', 'EX', 300, function(err, reply) {...}); 
$client->set(['hello', 'world', 'NX', 'EX', 300], function(err, reply) {...}); 
3

Bạn có thể sử dụng tập lệnh Lua để tạo lệnh setnex của riêng mình. Tất cả các kịch bản Lua chạy nguyên tử, do đó bạn không phải lo lắng về các máy khách khác đang thay đổi dữ liệu mà bạn đã đọc trong tập lệnh.

-- setnex.lua 
local key = ARGV[1] 
local expiry = ARGV[2] 
local value = ARGV[3] 
local reply = redis.call("SETNX", key, value) 
if 1 == reply then 
    redis.call("EXPIRE", key, expiry) 
end 
return reply 

Bạn có thể gọi nó từ node_redis như thế này:

client.eval(setnex_lua, 0, "mykey", 10, "myvalue", function (err, res) { 
    console.dir(err); 
    console.dir(res); 
});