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