2

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

示例查询是:

  • 评估“”0
  • 评估“返回 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 源代码的情况下完全没有响应的提示。

4

1 回答 1

2
EVAL "" 0             returns $-1\r\n
EVAL "return 1" 0     returns :1\r\n

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

AFAIK,不可能告诉 Redis 它不必发送回复(即使是空答案)。

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

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

于 2013-01-11T15:57:01.117 回答