如何在没有得到任何响应的情况下在redis中执行命令?

时间:2013-01-11 01:13:25

标签: lua redis

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

示例查询是:

  • EVAL“”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源代码,我真的很感激有关如何实现无响应的任何提示。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

例如,您可以在一个Lua脚本中运行100个操作,并将一个最小数据包作为回复。但是,除了通过改变Redis源代码之外,IMO无法避免这个数据包。