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

如何在Redis中执行命令而完全没有任何响应?

卜飞鸣
2023-03-14
问题内容

我尝试在redis上执行命令,但不关心任何响应,甚至都不希望使网络流量最小化。一个答案说,不返回任何内容的Lua脚本可以帮助实现这一目标,但是当我在redis-
cli上尝试并嗅探我的包时,无论是否有,我仍然得到相同数量的客户端和服务器之间传输的包。一个不返回任何内容或返回一个整数1的脚本。

示例查询为:

  • 评估“” 0
  • EVAL“返回1” 0

在两种情况下,wireshark都显示了4个软件包的交换。一个[PSH,ACK]客户端到服务器,[ACK]从服务器到客户端,[PSH,ACK]从服务器到客户端,[ACK]从客户端回到服务器。在第一种情况下,我希望是Redis的响应的[PSH,ACK]程序包包含以下数据:

0000  02 00 00 00 45 00 00 39  bc a8 40 00 40 06 00 00   ....E..9 ..@.@...
0010  7f 00 00 01 7f 00 00 01  18 eb e6 bb 03 4d 7c 9c   ........ .....M|.
0020  e2 97 bf 53 80 18 23 df  fe 2d 00 00 01 01 08 0a   ...S..#. .-......
0030  11 cd c0 31 11 cd c0 31  24 2d 31 0d 0a            ...1...1 $-1..

在第二种情况下,此软件包包含:

0000  02 00 00 00 45 00 00 38  fa 9f 40 00 40 06 00 00   ....E..8 ..@.@...
0010  7f 00 00 01 7f 00 00 01  18 eb e6 bb 03 4d 7c a1   ........ .....M|.
0020  e2 97 bf 76 80 18 23 dd  fe 2c 00 00 01 01 08 0a   ...v..#. .,......
0030  11 ce be 46 11 ce be 46  3a 31 0d 0a               ...F...F :1..

对于第二种情况,重点很明确。:1是1的整数回复。但是对于第一种情况,我不确定。$是批量答复的指示器,-是错误的指示器。这是否意味着$ -1是redis-
cli中显示的(nil)数据?还是我完全错了?如果我是对的,是否有可能告诉redis我根本不需要任何响应(命令的ACK除外)?还是我必须派出redis代码并自己实现?

我非常感谢在不深入研究Redis源代码的情况下如何实现完全不响应的任何提示。


问题答案:

EVAL “” 0 returns $-1\r\n
EVAL “return 1” 0 returns :1\r\n

在第一种情况下,$ -1是用于表示nil值的特定批量答复(如协议规范中所述)

AFAIK,无法告诉Redis不必发送答复(即使是空答案)。

正如Marc Gravell所解释的那样,您可以使用Lua捆绑多个操作并减少答复数据量。但是,您将避免避免最少的答复数据包。

例如,您可以在一个Lua脚本中运行100个操作,并有一个最小的数据包作为答复。但是,除非更改Redis源代码,否则无法避免IMO使用此数据包。



 类似资料:
  • 我的Gradle项目使用了KotlinDSL和JUnit5/Jupiter(以及Kotlin作为编程语言),Gradle似乎没有正确地接受我的任何测试。当我在命令行上运行Gradle测试时,它告诉我 不管我怎么尝试。然而,在我的IDE中,我可以轻松地运行项目中的每个单个测试类,而不会出现任何问题。

  • 我能够使用Jsch连接shell通道,然后我必须执行后续命令,我已经阅读了下面的帖子通过Jsch Shell执行多个命令 我已经试过了,如下所示 但是cmd1是UNIX服务器登录脚本,所以即使我用putty给出下面的命令 我无法在一个实例中执行所有三个,只有cmd1正在执行,因此也不能使用Jsch。 因为cmd1是用于登录的,所以通常我会在puty中执行cmd1,然后一旦登录到unix服务器,我就

  • 我想创建一个完全不使用任何XMLs的Spring应用程序(不web.xml不context.xml或任何东西)。到目前为止,它似乎工作得很好,除了我的视图解析器有一些问题,我不能自己解决。 这是我的WebApplicationInitializer 还有我的spring配置 最后是我的控制器 位于。 因此,如果我在控制器中使用注释,那么控制器会给我响应“index”,因此我知道我的配置至少在某种程

  • 问题内容: 我正在尝试使用以下代码执行Redis的几种异步方法 所有方法成功执行 但是我得到了错误 该方法被执行并返回true,它可能将其解释为true,但是我不明白为什么它必须使用该方法应用于它? 我可以通过将一个函数(err,结果)作为最后一个元素添加到client.hincrby中来获得增量的结果。但是,如何在end函数的result变量中获得所有结果呢? 问题答案: 我想您使用的async

  • 问题内容: 我想使用Java程序将avi文件转换为3gp。 为此,我使用“ EM Total Video Converter命令行2.43”,其命令为 “ C:\ EM TVCC > TVCC -f E:\ TestVideo \ 01.avi -o E:\ OutputFiles \ target.3gp” 我在站点http://www.rgagnon.com/javadetails/java-

  • 2. Shell如何执行命令 2.1. 执行交互式命令 用户在命令行输入命令后,一般情况下Shell会fork并exec该命令,但是Shell的内建命令例外,执行内建命令相当于调用Shell进程中的一个函数,并不创建新的进程。以前学过的cd、alias、umask、exit等命令即是内建命令,凡是用which命令查不到程序文件所在位置的命令都是内建命令,内建命令没有单独的man手册,要在man手册