redis可以管理依赖于以前命令的多个命令吗?

时间:2012-03-08 04:07:25

标签: database redis jedis

我对redis非常新,还在玩它。我想测试它是否与我的项目相关,但我不确定我正在运行的特定命令。 SO上的用户让我确信使用管道和交易的性能优势所以我想我会问如何做到这一点。

基本上我有两个陈述,我只想发布而不必等待结果(似乎是管道衬里的好候选人。看起来像这样:

Does valueX exist?
If it does insert valueY

它非常简单,但到目前为止,我一直在研究它的所有方法似乎等待响应,如果ValueX存在,并且因为我正在做我的程序超过十亿次循环它研磨它停止。 / p>

这可能吗?如果它有助于我使用Java但尚未确定哪个客户端库(jedis或jredis,仍在测试)。我实际上还没有完全确定redis,但是非常倾向于它(对于我正在做的速度看起来很好),所以任何建议都是可以接受的。

2 个答案:

答案 0 :(得分:7)

不,现在不可能完成这样的事情。您所寻求的是目前缺少的功能,但它将在2.6版本的Redis中提供。它被称为LUA脚本。您可以执行依赖于先前命令的服务器命令,一体化,而无需在客户端获取它们。有关详细信息,请参阅here

答案 1 :(得分:1)

Redis 不直接支持,但这在很多情况下是经常需要的。更广义的“原子”模式是:

resize

这可以通过简单的lua脚本来实现

Check multiple conditions
If all satisfied, run multiple commands

然后交易细节可以简单地传递-- Validate conditions and exec commands if ok local params = cjson.decode(ARGV[1]) -- Check conditions for __, check in pairs(params["if"]) do if #check == 2 then if check[1] ~= redis.call(unpack(check[2])) then return 0 end elseif check[2] == "==" then if check[1] ~= redis.call(unpack(check[3])) then return 0 end elseif check[2] == "!=" then if check[1] == redis.call(unpack(check[3])) then return 0 end elseif check[2] == ">" then if check[1] <= redis.call(unpack(check[3])) then return 0 end elseif check[2] == "<" then if check[1] >= redis.call(unpack(check[3])) then return 0 end else error('invalid operator "'..tostring(check[2])..'" (expected "==", "!=", ">" or "<")') end end -- Eval redis commands for __, exec in pairs(params["exec"]) do redis.call(unpack(exec)) end return 1

JSON.stringify(object)

在许多情况下,这种“条件交易”消除了对自定义脚本的需求。

有关更多示例/测试/源代码,请参阅 https://github.com/nodeca/redis-if