Redis的Multi的内幕真相

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 今天遇到个Redis奇慢的问题,断点分析发现跟multi有关。 由于本人太忙不想去阅读Redis Server的源代码(其实是懒),就通过TCPDump来分析吧。 步骤: 1. 先在Redis Server上启动TCPDump: tcpdump -i eno16777736 port 6379 -X   2.

今天遇到个Redis奇慢的问题,断点分析发现跟multi有关。

由于本人太忙不想去阅读Redis Server的源代码(其实是懒),就通过TCPDump来分析吧。

步骤:

1. 先在Redis Server上启动TCPDump: tcpdump -i eno16777736 port 6379 -X

 

2. 测试Multi:

<?php

$redis = new redis();
$result = $redis->connect('localhost', 6379);
//默认是Redis::MULTI
$multi = $redis->multi();

for($i=0;$i<100;$i++)
$multi->set('testkey' . (string)$i, 'helloworld' . (string)$i);

$replies = $multi->exec();

var_dump($replies);

?>

  

TCPDump抓包:

sudo tcpdump -i lo0 port 6379 -XX -vvv

  

TCPDump数据:

19:09:22.437455 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 64, bad cksum 0 (->3cb6)!)
    localhost.60828 > localhost.6379: Flags [S], cksum 0xfe34 (incorrect -> 0x48c3), seq 3085749856, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 472321303 ecr 0,sackOK,eol], length 0
	0x0000:  0200 0000 4500 0040 0000 4000 4006 0000  ....E..@..@.@...
	0x0010:  7f00 0001 7f00 0001 ed9c 18eb b7ec ce60  ...............`
	0x0020:  0000 0000 b002 ffff fe34 0000 0204 3fd8  .........4....?.
	0x0030:  0103 0305 0101 080a 1c27 0d17 0000 0000  .........'......
	0x0040:  0402 0000                                ....
19:09:22.437505 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 64, bad cksum 0 (->3cb6)!)
    localhost.6379 > localhost.60828: Flags [S.], cksum 0xfe34 (incorrect -> 0x8ab4), seq 934042899, ack 3085749857, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 472321303 ecr 472321303,sackOK,eol], length 0
	0x0000:  0200 0000 4500 0040 0000 4000 4006 0000  ....E..@..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb ed9c 37ac 5d13  ............7.].
	0x0020:  b7ec ce61 b012 ffff fe34 0000 0204 3fd8  ...a.....4....?.
	0x0030:  0103 0305 0101 080a 1c27 0d17 1c27 0d17  .........'...'..
	0x0040:  0402 0000                                ....
19:09:22.437515 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.60828 > localhost.6379: Flags [.], cksum 0xfe28 (incorrect -> 0xd2d0), seq 1, ack 1, win 12759, options [nop,nop,TS val 472321303 ecr 472321303], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 ed9c 18eb b7ec ce61  ...............a
	0x0020:  37ac 5d14 8010 31d7 fe28 0000 0101 080a  7.]...1..(......
	0x0030:  1c27 0d17 1c27 0d17                      .'...'..
19:09:22.437525 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.6379 > localhost.60828: Flags [.], cksum 0xfe28 (incorrect -> 0xd2d0), seq 1, ack 1, win 12759, options [nop,nop,TS val 472321303 ecr 472321303], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb ed9c 37ac 5d14  ............7.].
	0x0020:  b7ec ce61 8010 31d7 fe28 0000 0101 080a  ...a..1..(......
	0x0030:  1c27 0d17 1c27 0d17                      .'...'..
19:09:22.437866 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 67, bad cksum 0 (->3cb3)!)
    localhost.60828 > localhost.6379: Flags [P.], cksum 0xfe37 (incorrect -> 0x7d88), seq 1:16, ack 1, win 12759, options [nop,nop,TS val 472321303 ecr 472321303], length 15: RESP "MULTI"
	0x0000:  0200 0000 4500 0043 0000 4000 4006 0000  ....E..C..@.@...
	0x0010:  7f00 0001 7f00 0001 ed9c 18eb b7ec ce61  ...............a
	0x0020:  37ac 5d14 8018 31d7 fe37 0000 0101 080a  7.]...1..7......
	0x0030:  1c27 0d17 1c27 0d17 2a31 0d0a 2435 0d0a  .'...'..*1..$5..
	0x0040:  4d55 4c54 490d 0a                        MULTI..
19:09:22.437885 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.6379 > localhost.60828: Flags [.], cksum 0xfe28 (incorrect -> 0xd2c2), seq 1, ack 16, win 12758, options [nop,nop,TS val 472321303 ecr 472321303], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb ed9c 37ac 5d14  ............7.].
	0x0020:  b7ec ce70 8010 31d6 fe28 0000 0101 080a  ...p..1..(......
	0x0030:  1c27 0d17 1c27 0d17                      .'...'..
19:09:22.437979 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 57, bad cksum 0 (->3cbd)!)
    localhost.6379 > localhost.60828: Flags [P.], cksum 0xfe2d (incorrect -> 0x5259), seq 1:6, ack 16, win 12758, options [nop,nop,TS val 472321303 ecr 472321303], length 5: RESP "OK"
	0x0000:  0200 0000 4500 0039 0000 4000 4006 0000  ....E..9..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb ed9c 37ac 5d14  ............7.].
	0x0020:  b7ec ce70 8018 31d6 fe2d 0000 0101 080a  ...p..1..-......
	0x0030:  1c27 0d17 1c27 0d17 2b4f 4b0d 0a         .'...'..+OK..
19:09:22.437993 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.60828 > localhost.6379: Flags [.], cksum 0xfe28 (incorrect -> 0xd2bc), seq 16, ack 6, win 12759, options [nop,nop,TS val 472321303 ecr 472321303], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 ed9c 18eb b7ec ce70  ...............p
	0x0020:  37ac 5d19 8010 31d7 fe28 0000 0101 080a  7.]...1..(......
	0x0030:  1c27 0d17 1c27 0d17                      .'...'..
19:09:22.438224 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 97, bad cksum 0 (->3c95)!)
    localhost.60828 > localhost.6379: Flags [P.], cksum 0xfe55 (incorrect -> 0x6423), seq 16:61, ack 6, win 12759, options [nop,nop,TS val 472321303 ecr 472321303], length 45: RESP "SET" "testkey0" "helloworld0"
	0x0000:  0200 0000 4500 0061 0000 4000 4006 0000  ....E..a..@.@...
	0x0010:  7f00 0001 7f00 0001 ed9c 18eb b7ec ce70  ...............p
	0x0020:  37ac 5d19 8018 31d7 fe55 0000 0101 080a  7.]...1..U......
	0x0030:  1c27 0d17 1c27 0d17 2a33 0d0a 2433 0d0a  .'...'..*3..$3..
	0x0040:  5345 540d 0a24 380d 0a74 6573 746b 6579  SET..$8..testkey
	0x0050:  300d 0a24 3131 0d0a 6865 6c6c 6f77 6f72  0..$11..hellowor
	0x0060:  6c64 300d 0a                             ld0..
19:09:22.438245 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.6379 > localhost.60828: Flags [.], cksum 0xfe28 (incorrect -> 0xd291), seq 6, ack 61, win 12757, options [nop,nop,TS val 472321303 ecr 472321303], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb ed9c 37ac 5d19  ............7.].
	0x0020:  b7ec ce9d 8010 31d5 fe28 0000 0101 080a  ......1..(......
	0x0030:  1c27 0d17 1c27 0d17                      .'...'..
19:09:22.438291 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 61, bad cksum 0 (->3cb9)!)
    localhost.6379 > localhost.60828: Flags [P.], cksum 0xfe31 (incorrect -> 0xae97), seq 6:15, ack 61, win 12757, options [nop,nop,TS val 472321303 ecr 472321303], length 9: RESP "QUEUED"
	0x0000:  0200 0000 4500 003d 0000 4000 4006 0000  ....E..=..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb ed9c 37ac 5d19  ............7.].
	0x0020:  b7ec ce9d 8018 31d5 fe31 0000 0101 080a  ......1..1......
	0x0030:  1c27 0d17 1c27 0d17 2b51 5545 5545 440d  .'...'..+QUEUED.
	0x0040:  0a                                       .
19:09:22.438307 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.60828 > localhost.6379: Flags [.], cksum 0xfe28 (incorrect -> 0xd287), seq 61, ack 15, win 12758, options [nop,nop,TS val 472321303 ecr 472321303], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 ed9c 18eb b7ec ce9d  ................
	0x0020:  37ac 5d22 8010 31d6 fe28 0000 0101 080a  7.]"..1..(......
	0x0030:  1c27 0d17 1c27 0d17                      .'...'..
19:09:22.438362 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 97, bad cksum 0 (->3c95)!)
    localhost.60828 > localhost.6379: Flags [P.], cksum 0xfe55 (incorrect -> 0x61ee), seq 61:106, ack 15, win 12758, options [nop,nop,TS val 472321303 ecr 472321303], length 45: RESP "SET" "testkey1" "helloworld1"
	0x0000:  0200 0000 4500 0061 0000 4000 4006 0000  ....E..a..@.@...
	0x0010:  7f00 0001 7f00 0001 ed9c 18eb b7ec ce9d  ................
	0x0020:  37ac 5d22 8018 31d6 fe55 0000 0101 080a  7.]"..1..U......
	0x0030:  1c27 0d17 1c27 0d17 2a33 0d0a 2433 0d0a  .'...'..*3..$3..
	0x0040:  5345 540d 0a24 380d 0a74 6573 746b 6579  SET..$8..testkey
	0x0050:  310d 0a24 3131 0d0a 6865 6c6c 6f77 6f72  1..$11..hellowor
	0x0060:  6c64 310d 0a                             ld1..
19:09:22.438378 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.6379 > localhost.60828: Flags [.], cksum 0xfe28 (incorrect -> 0xd25c), seq 15, ack 106, win 12756, options [nop,nop,TS val 472321303 ecr 472321303], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb ed9c 37ac 5d22  ............7.]"
	0x0020:  b7ec ceca 8010 31d4 fe28 0000 0101 080a  ......1..(......
	0x0030:  1c27 0d17 1c27 0d17                      .'...'..
19:09:22.438396 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 61, bad cksum 0 (->3cb9)!)
    localhost.6379 > localhost.60828: Flags [P.], cksum 0xfe31 (incorrect -> 0xae62), seq 15:24, ack 106, win 12756, options [nop,nop,TS val 472321303 ecr 472321303], length 9: RESP "QUEUED"
	0x0000:  0200 0000 4500 003d 0000 4000 4006 0000  ....E..=..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb ed9c 37ac 5d22  ............7.]"
	0x0020:  b7ec ceca 8018 31d4 fe31 0000 0101 080a  ......1..1......
	0x0030:  1c27 0d17 1c27 0d17 2b51 5545 5545 440d  .'...'..+QUEUED.
	0x0040:  0a                                       .
19:09:22.438407 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.60828 > localhost.6379: Flags [.], cksum 0xfe28 (incorrect -> 0xd250), seq 106, ack 24, win 12758, options [nop,nop,TS val 472321304 ecr 472321303], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 ed9c 18eb b7ec ceca  ................
	0x0020:  37ac 5d2b 8010 31d6 fe28 0000 0101 080a  7.]+..1..(......
	0x0030:  1c27 0d18 1c27 0d17                      .'...'..
19:09:22.438444 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 97, bad cksum 0 (->3c95)!)
    localhost.60828 > localhost.6379: Flags [P.], cksum 0xfe55 (incorrect -> 0x5fb7), seq 106:151, ack 24, win 12758, options [nop,nop,TS val 472321304 ecr 472321303], length 45: RESP "SET" "testkey2" "helloworld2"
	0x0000:  0200 0000 4500 0061 0000 4000 4006 0000  ....E..a..@.@...
	0x0010:  7f00 0001 7f00 0001 ed9c 18eb b7ec ceca  ................
	0x0020:  37ac 5d2b 8018 31d6 fe55 0000 0101 080a  7.]+..1..U......
	0x0030:  1c27 0d18 1c27 0d17 2a33 0d0a 2433 0d0a  .'...'..*3..$3..
	0x0040:  5345 540d 0a24 380d 0a74 6573 746b 6579  SET..$8..testkey
	0x0050:  320d 0a24 3131 0d0a 6865 6c6c 6f77 6f72  2..$11..hellowor
	0x0060:  6c64 320d 0a                             ld2..
19:09:22.438457 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.6379 > localhost.60828: Flags [.], cksum 0xfe28 (incorrect -> 0xd226), seq 24, ack 151, win 12754, options [nop,nop,TS val 472321304 ecr 472321304], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb ed9c 37ac 5d2b  ............7.]+
	0x0020:  b7ec cef7 8010 31d2 fe28 0000 0101 080a  ......1..(......
	0x0030:  1c27 0d18 1c27 0d18                      .'...'..
19:09:22.438484 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 61, bad cksum 0 (->3cb9)!)
    localhost.6379 > localhost.60828: Flags [P.], cksum 0xfe31 (incorrect -> 0xae2c), seq 24:33, ack 151, win 12754, options [nop,nop,TS val 472321304 ecr 472321304], length 9: RESP "QUEUED"
	0x0000:  0200 0000 4500 003d 0000 4000 4006 0000  ....E..=..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb ed9c 37ac 5d2b  ............7.]+
	0x0020:  b7ec cef7 8018 31d2 fe31 0000 0101 080a  ......1..1......
	0x0030:  1c27 0d18 1c27 0d18 2b51 5545 5545 440d  .'...'..+QUEUED.   (加入队列)
	0x0040:  0a                                       .
19:09:22.438493 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.60828 > localhost.6379: Flags [.], cksum 0xfe28 (incorrect -> 0xd219), seq 151, ack 33, win 12758, options [nop,nop,TS val 472321304 ecr 472321304], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 ed9c 18eb b7ec cef7  ................
	0x0020:  37ac 5d34 8010 31d6 fe28 0000 0101 080a  7.]4..1..(......
	0x0030:  1c27 0d18 1c27 0d18                      .'...'..
19:09:22.438534 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 66, bad cksum 0 (->3cb4)!)
    localhost.60828 > localhost.6379: Flags [P.], cksum 0xfe36 (incorrect -> 0xd1e4), seq 151:165, ack 33, win 12758, options [nop,nop,TS val 472321304 ecr 472321304], length 14: RESP "EXEC"
	0x0000:  0200 0000 4500 0042 0000 4000 4006 0000  ....E..B..@.@...
	0x0010:  7f00 0001 7f00 0001 ed9c 18eb b7ec cef7  ................
	0x0020:  37ac 5d34 8018 31d6 fe36 0000 0101 080a  7.]4..1..6......
	0x0030:  1c27 0d18 1c27 0d18 2a31 0d0a 2434 0d0a  .'...'..*1..$4..
	0x0040:  4558 4543 0d0a                           EXEC..
19:09:22.438546 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.6379 > localhost.60828: Flags [.], cksum 0xfe28 (incorrect -> 0xd20f), seq 33, ack 165, win 12754, options [nop,nop,TS val 472321304 ecr 472321304], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb ed9c 37ac 5d34  ............7.]4
	0x0020:  b7ec cf05 8010 31d2 fe28 0000 0101 080a  ......1..(......
	0x0030:  1c27 0d18 1c27 0d18                      .'...'..
19:09:22.438582 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 71, bad cksum 0 (->3caf)!)
    localhost.6379 > localhost.60828: Flags [P.], cksum 0xfe3b (incorrect -> 0x3d7e), seq 33:52, ack 165, win 12754, options [nop,nop,TS val 472321304 ecr 472321304], length 19: RESP "OK" "OK" "OK"
	0x0000:  0200 0000 4500 0047 0000 4000 4006 0000  ....E..G..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb ed9c 37ac 5d34  ............7.]4
	0x0020:  b7ec cf05 8018 31d2 fe3b 0000 0101 080a  ......1..;......
	0x0030:  1c27 0d18 1c27 0d18 2a33 0d0a 2b4f 4b0d  .'...'..*3..+OK.
	0x0040:  0a2b 4f4b 0d0a 2b4f 4b0d 0a              .+OK..+OK..          (执行3次请求后批量返回3个结果)
19:09:22.438593 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.60828 > localhost.6379: Flags [.], cksum 0xfe28 (incorrect -> 0xd1f9), seq 165, ack 52, win 12757, options [nop,nop,TS val 472321304 ecr 472321304], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 ed9c 18eb b7ec cf05  ................
	0x0020:  37ac 5d47 8010 31d5 fe28 0000 0101 080a  7.]G..1..(......
	0x0030:  1c27 0d18 1c27 0d18                      .'...'.. 

 

3. 测试Multi PIPELINE:

<?php

$redis = new redis();
$result = $redis->connect('localhost', 6379);

$multi = $redis->multi(Redis::PIPELINE);

for($i=0;$i<100;$i++)
$multi->set('testkey' . (string)$i, 'helloworld' . (string)$i);

$replies = $multi->exec();

var_dump($replies);

 

TCPDUMP数据分析:

19:21:38.905913 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 64, bad cksum 0 (->3cb6)!)
    localhost.63949 > localhost.6379: Flags [S], cksum 0xfe34 (incorrect -> 0x21b4), seq 3990454584, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 473055013 ecr 0,sackOK,eol], length 0
	0x0000:  0200 0000 4500 0040 0000 4000 4006 0000  ....E..@..@.@...
	0x0010:  7f00 0001 7f00 0001 f9cd 18eb edd9 8138  ...............8
	0x0020:  0000 0000 b002 ffff fe34 0000 0204 3fd8  .........4....?.
	0x0030:  0103 0305 0101 080a 1c32 3f25 0000 0000  .........2?%....
	0x0040:  0402 0000                                ....
19:21:38.905963 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 64, bad cksum 0 (->3cb6)!)
    localhost.6379 > localhost.63949: Flags [S.], cksum 0xfe34 (incorrect -> 0x077e), seq 3128427605, ack 3990454585, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 473055013 ecr 473055013,sackOK,eol], length 0
	0x0000:  0200 0000 4500 0040 0000 4000 4006 0000  ....E..@..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb f9cd ba78 0455  .............x.U
	0x0020:  edd9 8139 b012 ffff fe34 0000 0204 3fd8  ...9.....4....?.
	0x0030:  0103 0305 0101 080a 1c32 3f25 1c32 3f25  .........2?%.2?%
	0x0040:  0402 0000                                ....
19:21:38.905975 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.63949 > localhost.6379: Flags [.], cksum 0xfe28 (incorrect -> 0x4f9a), seq 1, ack 1, win 12759, options [nop,nop,TS val 473055013 ecr 473055013], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 f9cd 18eb edd9 8139  ...............9
	0x0020:  ba78 0456 8010 31d7 fe28 0000 0101 080a  .x.V..1..(......
	0x0030:  1c32 3f25 1c32 3f25                      .2?%.2?%
19:21:38.905985 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.6379 > localhost.63949: Flags [.], cksum 0xfe28 (incorrect -> 0x4f9a), seq 1, ack 1, win 12759, options [nop,nop,TS val 473055013 ecr 473055013], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb f9cd ba78 0456  .............x.V
	0x0020:  edd9 8139 8010 31d7 fe28 0000 0101 080a  ...9..1..(......
	0x0030:  1c32 3f25 1c32 3f25                      .2?%.2?%
19:21:38.914905 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 187, bad cksum 0 (->3c3b)!)
    localhost.63949 > localhost.6379: Flags [P.], cksum 0xfeaf (incorrect -> 0x09c9), seq 1:136, ack 1, win 12759, options [nop,nop,TS val 473055022 ecr 473055013], length 135: RESP "SET" "testkey0" "helloworld0" "SET" "testkey1" "helloworld1" "SET" "testkey2" "helloworld2"
	0x0000:  0200 0000 4500 00bb 0000 4000 4006 0000  ....E.....@.@...
	0x0010:  7f00 0001 7f00 0001 f9cd 18eb edd9 8139  ...............9
	0x0020:  ba78 0456 8018 31d7 feaf 0000 0101 080a  .x.V..1.........
	0x0030:  1c32 3f2e 1c32 3f25 2a33 0d0a 2433 0d0a  .2?..2?%*3..$3..
	0x0040:  5345 540d 0a24 380d 0a74 6573 746b 6579  SET..$8..testkey
	0x0050:  300d 0a24 3131 0d0a 6865 6c6c 6f77 6f72  0..$11..hellowor
	0x0060:  6c64 300d 0a2a 330d 0a24 330d 0a53 4554  ld0..*3..$3..SET
	0x0070:  0d0a 2438 0d0a 7465 7374 6b65 7931 0d0a  ..$8..testkey1..
	0x0080:  2431 310d 0a68 656c 6c6f 776f 726c 6431  $11..helloworld1
	0x0090:  0d0a 2a33 0d0a 2433 0d0a 5345 540d 0a24  ..*3..$3..SET..$
	0x00a0:  380d 0a74 6573 746b 6579 320d 0a24 3131  8..testkey2..$11
	0x00b0:  0d0a 6865 6c6c 6f77 6f72 6c64 320d 0a    ..helloworld2..        (一次性,批量发送、执行)
19:21:38.914935 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)
    localhost.6379 > localhost.63949: Flags [.], cksum 0xfe28 (incorrect -> 0x4f05), seq 1, ack 136, win 12755, options [nop,nop,TS val 473055022 ecr 473055022], length 0
	0x0000:  0200 0000 4500 0034 0000 4000 4006 0000  ....E..4..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb f9cd ba78 0456  .............x.V
	0x0020:  edd9 81c0 8010 31d3 fe28 0000 0101 080a  ......1..(......
	0x0030:  1c32 3f2e 1c32 3f2e                      .2?..2?.
19:21:38.915037 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 67, bad cksum 0 (->3cb3)!)
    localhost.6379 > localhost.63949: Flags [P.], cksum 0xfe37 (incorrect -> 0xf1b4), seq 1:16, ack 136, win 12755, options [nop,nop,TS val 473055022 ecr 473055022], length 15: RESP "OK" "OK" "OK"
	0x0000:  0200 0000 4500 0043 0000 4000 4006 0000  ....E..C..@.@...
	0x0010:  7f00 0001 7f00 0001 18eb f9cd ba78 0456  .............x.V
	0x0020:  edd9 81c0 8018 31d3 fe37 0000 0101 080a  ......1..7......
	0x0030:  1c32 3f2e 1c32 3f2e 2b4f 4b0d 0a2b 4f4b  .2?..2?.+OK..+OK
	0x0040:  0d0a 2b4f 4b0d 0a                        ..+OK..                (一次性,返回结果)
19:21:38.915060 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!) localhost.63949 > localhost.6379: Flags [.], cksum 0xfe28 (incorrect -> 0x4ef3), seq 136, ack 16, win 12758, options [nop,nop,TS val 473055022 ecr 473055022], length 0 0x0000: 0200 0000 4500 0034 0000 4000 4006 0000 ....E..4..@.@... 0x0010: 7f00 0001 7f00 0001 f9cd 18eb edd9 81c0 ................ 0x0020: ba78 0465 8010 31d6 fe28 0000 0101 080a .x.e..1..(...... 0x0030: 1c32 3f2e 1c32 3f2e .2?..2?. 19:21:38.916018 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->3cc2)!)

  

 

总结一下:

1. Multi:

  1.1. 每发送一条指令,都需要单独发给服务器,服务器再单独返回“该条指令已加入队列”这个消息。这是比Pipeline慢的原因之一。

  1.2. Multi执行的时候会先暂停其他命令的执行,类似于加了个锁,直到整个Multi结束完成再继续其他客户端的请求。这是Multi能保证一致性的原因,也是比Pipeline慢的原因之二。(需要读Redis Server的代码,从TCPDump上看不出)

2. Pipeline:

  2.1. 将所有命令打包一次性发送。发送成功后,服务端不用返回类似“命令已收到”这样的消息,而是一次性批量执行所有命令,成功后再一次性返回所有处理结果。

  2.2. 服务端处理命令的时候,不需要加锁,而是与其他客户端的命令混合在一起处理,所以无法保证一致性。

 

适用场景:

1. 如果要顺序执行一组命令(既网上所谓的“Redis事务”),Multi很合适。

2. 如果要往Redis里批量插入Log, 或者使用Redis List做为队列并插入很多消息的话,Pipleline是挺合适的。 

3. 网络不好,又顺序性不强的数据,适合Pipleline 

 

性能:

without pipelining 1.185238 seconds
with pipelining 0.250783 seconds (有时能快一个数量级)

参考:https://redis.io/topics/pipelining

谋胆并重
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
存储 NoSQL 调度
Redis Lua脚本:原子性的真相揭秘
【4月更文挑战第20天】
908 0
Redis Lua脚本:原子性的真相揭秘
|
缓存 NoSQL Redis
redis事务(multi,exec,discard,watch),错误处理
redis事务(multi,exec,discard,watch),错误处理
346 0
|
缓存 NoSQL 安全
Redis 7.0 Multi Part AOF的设计和实现
Redis 作为一种非常流行的内存数据库,通过将数据保存在内存中,Redis 得以拥有极高的读写性能。但是一旦进程退出,Redis 的数据就会全部丢失。 为了解决这个问题,Redis 提供了 RDB 和 AOF 两种持久化方案,将内存中的数据保存到磁盘中,避免数据丢失。本文将重点讨论AOF持久化方案,以及其存在的一些问题,并探讨在Redis 7.0 (已发布RC1) 中Multi Part AOF(下文简称为MP-AOF,本特性由阿里云数据库Tair团队贡献)设计和实现细节。
Redis 7.0 Multi Part AOF的设计和实现
|
缓存 NoSQL 安全
Redis 7.0 Multi Part AOF的设计和实现
Redis 7.0 Multi Part AOF的设计和实现
319 0
Redis 7.0 Multi Part AOF的设计和实现
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
77 6
|
11天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
13天前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构
|
6天前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
22 5