当前位置: 首页 > 面试题库 >

Redis可以禁用对管道命令的答复吗?

能修谨
2023-03-14
问题内容

我目前正在开发一个缓存,需要为每个调用增加数百个计数器,如下所示:

redis.pipelined do
  keys.each{ |key| redis.incr key }
end

现在,在我的配置文件中,我看到redis
gem仍收集了我不需要的答复,并浪费了一些宝贵的时间。我可以通过某种方式告诉Redis我对回复不感兴趣吗?有没有更好的方法来增加很多值。

MINCR例如,我没有找到命令。

提前致谢!


问题答案:

是的…至少在2.6中。您可以在LUA脚本中执行此操作,只需让LUA脚本返回空结果即可。这是使用booksleeve客户端的:

const int DB = 0; // any database number
// prime some initial values
conn.Keys.Remove(DB, new[] {"a", "b", "c"});
conn.Strings.Increment(DB, "b");
conn.Strings.Increment(DB, "c");
conn.Strings.Increment(DB, "c");

// run the script, passing "a", "b", "c", "c" to
// increment a & b by 1, c twice
var result = conn.Scripting.Eval(DB,
    @"for i,key in ipairs(KEYS) do redis.call('incr', key) end",
    new[] { "a", "b", "c", "c"}, // <== aka "KEYS" in the script
    null); // <== aka "ARGV" in the script

// check the incremented values
var a = conn.Strings.GetInt64(DB, "a");
var b = conn.Strings.GetInt64(DB, "b");
var c = conn.Strings.GetInt64(DB, "c");

Assert.IsNull(conn.Wait(result), "result");
Assert.AreEqual(1, conn.Wait(a), "a");
Assert.AreEqual(2, conn.Wait(b), "b");
Assert.AreEqual(4, conn.Wait(c), "c");

incrby通过将“ by”数字作为参数传递来做同样的事情,将中间部分更改为:

// run the script, passing "a", "b", "c" and 1, 1, 2
// increment a & b by 1, c twice
var result = conn.Scripting.Eval(DB,
    @"for i,key in ipairs(KEYS) do redis.call('incrby', key, ARGV[i]) end",
    new[] { "a", "b", "c" }, // <== aka "KEYS" in the script
    new object[] { 1, 1, 2 }); // <== aka "ARGV" in the script


 类似资料:
  • 问题内容: 我对Redis还是很陌生,仍然在玩它。我想测试一下它是否与我的项目相关,但是我不确定正在运行的特定命令。SO的用户让我确信使用管道和事务的性能优势,所以我想问一下如何做到这一点。 基本上,我有两个要发布的语句,而不必等待结果(似乎是管道衬砌的一个很好的候选者。它看起来像这样: 它非常简单,但是到目前为止,我一直在研究它的所有方式似乎都在等待ValueX是否存在的响应,并且由于我正在执行

  • 本文向大家介绍Redis禁用命令、危险命令及规避方法,包括了Redis禁用命令、危险命令及规避方法的使用技巧和注意事项,需要的朋友参考一下 FLUSHALL FLUSHDB 命令会清空数据,而且从不失败,对于线上集群非常危险。 KEYS * 命令,当数据规模较大时使用,会严重影响Redis性能,也非常危险。 如果从根本上规避这些风险呢? Redis提供了非常简单且有效的方法,直接在配置文件中设置禁

  • 问题内容: 当我将字符串值1和7存储到“ mykey”中时, redis中到底存储了 什么?以及getbit在redis中如何工作? 有人试图在该值内循环位吗? 我知道bitcount会给我2,但我也想从中获得确切的字符串值1和7,这可能吗? -- 我通过使用erlang redis客户端读取输出进行了一些实验。 erlang输出: 然后删除此条目: 我做同样的事情来偏移2 4 8,在这里您可以看

  • 问题内容: 我正在尝试编写一个程序,在其中我需要监视某些事件的未命名管道的末端。我可以使用具有轮询功能的未命名管道。 如果是,请您告诉我带有函数描述符的轮询函数的语法 问题答案: 投票的例子 要使用,如果要检查是否可读或可写:

  • 问题内容: 考虑类似: 这是好习惯吗?难道这会在我们读取输入文件的同时覆盖输入文件,还是总是先在内存中读取它,然后通过管道传递给第二个命令? 显然,我可以将临时文件用作中介步骤,但我只是想知道.. 问题答案: 不,那不行。管道中的所有命令同时执行,并且外壳程序在执行命令之前准备重定向。因此,该命令很可能在cat读取文件之前将其覆盖。 您需要moreutils提供的海绵(1)。

  • 本文向大家介绍CMD命令行管道命令使用介绍,包括了CMD命令行管道命令使用介绍的使用技巧和注意事项,需要的朋友参考一下 一、什么是管道命令   管道命令能够将一个命令的执行结果经过筛选,只保留我们需要的信息。   如 dir 命令会显示目录下所有文件夹和文件,可以使用管道命令| findstr "" 将dir的结果进行筛选,只保留需要的信息 | 命令管道符 格式:第一条命令 | 第二条命令 [|