如何在Redis中执行命令,而不会得到任何响应?

我尝试在 Redis 上执行命令,但不关心任何响应,甚至不想减少网络流量。一个stackoverflow回答说一个不返回任何内容的 Lua 脚本可以帮助实现这一点,但当我在 redis-cli 上尝试并嗅探我的软件包时,无论我是否有一个返回 Integer 1 或没有返回的脚本,我仍然会得到相同数量的软件包在客户端和服务器之间传输。

示例查询如下:

  • EVAL "" 0
  • EVAL "return 1" 0

在这两种情况下,wireshark 显示交换了 4 个包。客户端到服务器的一个 [PSH, ACK],来自服务器的一个 [ACK],来自服务器的一个 [PSH, ACK],以及从客户端返回服务器的一个 [ACK]。

在第一种情况下,[PSH, ACK] 软件包,我期望从 redis 得到响应的,包含以下数据:

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 源代码的情况下获得没有任何响应的任何提示。

点赞
用户1114486
用户1114486
在第一种情况下,$ -1是一个特定的批量响应,用于表示nil值(如协议规范中所述)。

据我所知,没有可能告诉Redis它不必发送回复(即使是空答案)。

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

例如,您可以在一个Lua脚本中运行100个操作,并获得一个单一的最小数据包作为回复。但是,我认为除非修改Redis源代码,否则无法避免此数据包。
EVAL "" 0 返回 $-1\r\n
EVAL "return 1" 0 返回 :1\r\n

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

据我所知,无法告诉Redis不必发送回复(即使回复为空)。

如Marc Gravell所解释的,您可以使用Lua对操作进行打包并减少回复数据的体积。但是,您无法避免最小的回复数据包。

例如,您可以在一个Lua脚本中运行100个操作,并获得一个单一的最小数据包作为回复。但是,我认为无法避免这个数据包,除非修改Redis源代码。

2013-01-11 15:57:01