Redis过期并增加

时间:2016-04-27 21:33:04

标签: node.js redis node-redis

我有一个场景,我想用redis实现一个缓存机制。进一步详细说明

首先,我使用 client.get()检查特定密钥,如果值不存在。我需要调用一个Web服务,它返回一个值并存储为键的子节点。然后我使用 client.set()将此密钥设置为redis。现在,如果设置超过24小时,此密钥需要过期,我该怎么做?

以下是redis

中键值的示例
parentValue:{
    child1:{
        serviceVal: "serviceVal",
        counter: 0
    },

    child2:{...},
    child3:{...}
    .... 
}

现在,当执行初始 client.get()时,如果值存在且此特定键未过期,则类似。我想增加对象中的计数器并在redis中更新此特定键。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

SET with NX and EX选项是您最简单的解决方案。请参阅我正在处理here的模块上的示例。

EX接受秒数,因此您需要24小时86400秒。

但是对于递增和过期,你可能最好使用redis lua脚本,例如:

--[[
  key 1 -> key name
  arg 1 -> expires in seconds
  arg 2 -> incr by value
]]

-- Key exists so increment it
if redis.call('exists',KEYS[1]) > 0 then
  redis.call('incrby',KEYS[1],tonumber(ARGV[2]))
  return 0
else
  -- key doesn't exist so create with an expiry and the incr amount
  redis.call('setex',KEYS[1],tonumber(ARGV[1]),tonumber(ARGV[2]))
  return 1
end

然后你只需要用密钥,到期时间以及增加多少来调用脚本。