Redis:有没有办法仅在集合存在时添加到排序集合?

Redis: Is there a way to add to sorted set only if set is exists?

我想知道是否有办法检查是否已经存在 redis 排序集。如果存在排序集,则向其添加元素,否则不会发生任何事情。

因为用 pipeline 这样做,所以每次从 redis 中检查排序集是否存在都会花费很多成本。

您可以使用exists命令(returns 1 if key is present else 0)来检查排序集是否存在以及zset是否存在,然后在回调中exists 命令可以调用 zadd 添加到 zset.

另外 exists 是一个 O(1) 操作。您可以从 http://redis.io/commands/exists

了解它

示例代码

var r = redis.createClient(6379,"127.0.0.1");
r.exists(zsetKey, function(err, isExists){ 
  if(isExists){ // isExists = 1 if zsetKey exists
    r.zadd(zetKey, score, member, function(insertErr, insertReply){
      // add to zset
    })
  }else{
    //key not present
  }
})

您可以 运行 Lua 管道中的脚本 - 下面的脚本会将所有参数添加到提供的键中,前提是该键存在:

local exists = redis.call('EXISTS', KEYS[1])
if exists == 1 then
  redis.call('ZADD', KEYS[1], unpack(ARGV))
end

注意:这里没有错误检查(即键的类型是 zset,参数是有效的...)以节省 CPU 个周期,并简化示例。也没有 return 代码 - 如果需要,请添加它。