我尝试在 Redis 上执行命令,但不关心任何响应,甚至不希望任何响应最小化网络流量。一answer on stackoverflow说不返回任何内容的 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)?或者我是否必须 fork redis 代码并自己实现?
我真的很感谢任何有关如何在不深入研究 redis 源代码的情况下完全没有响应的提示。
最佳答案
EVAL "" 0 returns $-1\r\n
EVAL "return 1" 0 returns :1\r\n
在第一种情况下, $-1 是一个特定的批量回复,用于表示 nil 值(如 protocol specification 中所述)
据我所知,不可能告诉 Redis 它不必发送回复(即使是空答案)。
正如 Marc Gravell 所解释的,您可以使用 Lua 来捆绑多个操作并减少回复数据量。但是,您将无法避免最小回复数据包。
例如,您可以在一个 Lua 脚本中运行 100 个操作,并使用一个最小数据包作为回复。但是,在我看来,除非更改 Redis 源代码,否则无法避免此数据包。
关于lua - 如何在redis中执行命令而不得到任何响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14270126/