2

redisでコマンドを実行しようとしましたが、応答を気にせず、ネットワークトラフィックを最小限に抑えたくありません. stackoverflow に関する1 つの回答は、何も返さない Lua スクリプトがそれを達成するのに役立つ可能性があると述べましたが、redis-cli で試してパッケージをスニッフィングすると、クライアントとサーバー間で同じ数のパッケージが転送されます。何も返さないか、整数 1 を返すスクリプト。

クエリの例は次のとおりです。

  • EVAL "" 0
  • EVAL "リターン 1" 0

どちらの場合も、wireshark は交換された 4 つのパッケージを示しています。1 つの [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..   

2 番目のケースでは、このパッケージには以下が含まれます。

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..    

2 番目のケースでは、要点は明らかです。:1 は 1 に対する整数の応答です。しかし、最初のケースではよくわかりません。$ は一括返信のインジケーターで、- はエラーのインジケーターです。これは、$-1 が redis-cli に表示されている (nil) のデータであることを意味しますか? それとも私はそこで完全に間違っていますか?そして、私が正しければ、(コマンドの ACK を除いて) 応答がまったく必要ないことを redis に伝える可能性はありますか? それとも、redis コードをフォークして自分で実装する必要がありますか?

redis のソース コードを掘り下げずに、まったく応答がないことを達成する方法についてのヒントを本当に感謝しています。

4

1 に答える 1

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

最初のケースでは、$-1 は nil 値を表すために使用される特定の一括返信です (プロトコル仕様で説明されているように) 。

私の知る限り、(空の回答であっても) 返信を送信する必要がないことを Redis に伝える可能性はありません。

Marc Gravell が説明したように、Lua を使用して複数の操作をバンドルし、応答データの量を減らすことができます。ただし、最小限の応答パケットを回避することはできません。

たとえば、1 つの Lua スクリプトで 100 の操作を実行し、応答として 1 つの最小パケットを持つことができます。ただし、Redis のソース コードを変更しない限り、このパケットを回避することはできません。

于 2013-01-11T15:57:01.117 に答える