¾|‘络åQŒç£ç›˜IOåQŒå†…å˜ï¼ŒCPU四个斚w¢å…¥æ‰‹åQŒä¸‹é¢æ¡ˆä¾‹å°±æ˜¯ä»Ž˜q™å››ä¸ªè§’度æ¥çœ‹ã€?/p>
Â
æˆ‘ä»¬çš„é¡µé¢æ¯å¤©PVåœ?0W åQŒä¸»è¦æ˜¯åˆ†å¸ƒåœ¨ä¸¤ä¸ªä¸»è¦é¡µé¢ï¼šä¸ªäh主页åQŒå±•½CÞZ¸»™åüc€‚å‡è®¾æ¯ä¸ªé¡µé¢å„自承æ‹?0%çš„PVåQŒå‡è®¾è®¿é—®æ—¶é—´é›†ä¸åœ¨ç™½å¤©8ž®æ—¶åQŒåã^å‡ä¸‹æ¥æ¯¿U’çš„è¯äh±‚数是 5.2个,考虑到高峰情况,那么我们ž®×ƒ¹˜ä»¥ç³»æ•?0, ž®±å½“100个处ç†ï¼Œæˆ‘们最大的一个请求会产生13个processor ,也就是说 最大äñ”生的¾U¿ç¨‹å›žäº‹ 13*100 = 1300。也ž®±æ˜¯è¯´é«˜å³°æ—¶åˆÖM¼šæœ?300个线½E‹éœ€è¦è¢«å¤„ç†åQŒæˆ‘们将队列讄¡½®ä¸?000åQŒå¯¹äºŽé«˜å³°æƒ…况就抛弃åQŒå› 䏸™‹¥æ˜¯äؓ了满‘³é«˜å³°æƒ…å†ëŠš„需è¦ï¼Œž®×ƒ¼šä½¿å¾—部分è¯äh±‚处在队列ä¸ï¼Œä¸èƒ½å……分的利用CPU的资æºã€?/p>
Â
在åšåŽ‹åŠ›‹¹‹è¯•时候,自èín应用内部åšäº†ž®çš„多线½E‹å¤„ç†çš„æ¡†æž¶åQŒå†…部采用的¾U¿ç¨‹æ± 是 SPRINGçš?ThreadPoolTaskExecutor 的类åQŒé€šè¿‡è‡ªèín的一个监控框架我们å‘玎ͼŒæ‰€æœ‰çš„¾U¿ç¨‹å•元执行的很快,但是在最åŽç»„装processor的时候,èŠÞp´¹äº†æ—¶é—ß_¼Œåœ¨è¿‡½E‹ä¸è§‚察CPU的利用率òq¶ä¸æ˜¯å¾ˆé«˜ã€?/p>
所以预估是在ç‰å¾…所有线½E‹æ‰§è¡Œå®Œæˆæ—¶åQŒä¹Ÿž®±æ˜¯è¯´æœ‰å¤§é‡çš„processor在线½E‹æ± çš„ç‰å¾…队列ä¸åQŒäØ“äº†éªŒè¯æ˜¯å¦ç”±äºŽè¯¥åŽŸå› é€ æˆçš„,所以åšå¦‚下‹¹‹è¯•åQ?/p>
Â
å› äØ“å‰é¢æåˆ°æ¯ç§’çš„åã^å‡è¯·æ±‚是5.2 考虑åˆîC¸€èˆ¬çš„æƒ…况åQŒå°±è®„¡½®ä¸ºåŽ‹‹¹‹çš„òq¶å‘æ•îCØ“ 3*5 = 15.
Â
‹¹‹è¯•案例一åQ?/span>
Â
15¾U¿ç¨‹Â
循环100‹Æ?/p>
¾U¿ç¨‹æ± :
 corePoolSize åQ?CPU = 4Â
 maxPoolSize  åQ?2 * corePoolSize = 8Â
 queueCapacity åQ?1000Â
Â
压测™åµé¢åQ?/xxx/22933Â
Â
---------------------------------------------- ˜q™ä¸ªæ˜¯åˆ†å‰²çº¿ ----------------------------------------------
½E›_®šæƒ…况下的¾U¿ç¨‹æ•ŽÍ¼š
[root@host_77-69 ~]# ps -eLf | grep java  | wc -lÂ
229
ä¸»è¦æ˜¯è§‚察,是å¦å……分利用了CPUæ ¸æ•°åQŒè¾¾åˆ°æˆ‘们预期的效果。现在的æœåŠ¡¾l§æ‰¿å¾ˆå¤šæ¡†æž¶æˆ–是模å—åŽï¼Œä¼šå¯åŠ¨å¾ˆå¤šä½ ä¸çŸ¥é“çš„¾U¿ç¨‹åQŒåœ¨é‚£è·‘ç€åQŒæ—¶ä¸æ—¶è·›_‡ºæ¥å¹²æ‰îC½ 下,所以一定覽{‰ç³»¾lŸè¿è¡Œç¨³å®šåŽè§‚察˜q™ä¸ªæ•°å€¹{€?/p>
---------------------------------------------- ˜q™ä¸ªæ˜¯åˆ†å‰²çº¿ ----------------------------------------------
CPU的一些信æ¯ï¼š
[root@host_77-69 ~]# vmstat -ns 3 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 2056 723528 392024 1330728 0 0 0 1 1 2 0 0 100 0 0 0 0 2056 723404 392024 1330728 0 0 0 0 467 806 0 0 100 0 0 0 0 2056 723404 392028 1330728 0 0 0 17 462 807 0 0 100 0 0 0 0 2056 723404 392028 1330728 0 0 0 0 457 814 0 0 100 0 0Â Â
ä¸»è¦æ˜¯å…³æ³?in åQ?cs ˜q™ä¸¤ä¸ªå‚æ•?/p>
inåQšæ¯¿U’èÊY䏿–‹Æ¡æ•°
cs: æ¯ç§’上下文切æ¢çš„‹Æ¡æ•°
Â
å› äØ“æ“作¾pÈ»Ÿæœ¬èín会有一些æ“作,在未压测å‰çš„æ•°å€¼åŸºæœ¬åœ¨ 460 .800 å·¦å³ã€?/p>
---------------------------------------------- ˜q™ä¸ªæ˜¯åˆ†å‰²çº¿ ----------------------------------------------
Â
[root@host_77-69 ~]# mpstat -P ALL 5 Linux 2.6.32-71.el6.x86_64 (host_77-69) 09/12/2012 _x86_64_ (4 CPU) 02:04:21 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 02:04:26 PM all 0.10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.90 02:04:26 PM 0 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.80Â Â
å…Ïx³¨soft ˜q™ä¸ªå‚æ•° ˜q™ä¸ªä»£è¡¨å½“å‰CPU在所有时间ä¸åQŒç”¨äºŽåˆ‡æ¢ä¸Šä¸‹æ‰€åŒ–时间比,若是èŠÞp´¹çš„越多,代表当å‰çš„线½E‹åˆ‡æ¢è¿‡äºŽé¢‘¾J,没有充分利用CPUåQŒå¾è®®å‡ž®‘线½E‹æ•°æˆ–æ˜¯å¢žåŠ CPUã€?/p>
user ã€?niceã€sysä¸»è¦æ˜¯è§‚察系¾lŸä¸æ˜¯å¦å˜åœ¨å¤§é‡è®¡ç®—åQŒæˆ–是æ»å¾ªçŽ¯çš„æƒ…å†µï¼Œæ¥æ¶ˆè€—大é‡çš„CPUã€?/p>
˜q™ä¸ªå‘½ä×o是对于vmstat的补充,更直观的观察CPU的上下文切æ¢åŠèÊY䏿–情况ã€?/p>
Â
---------------------------------------------- 䏋颿˜¯å†…å˜çš„åˆå§‹æƒ…况äº?----------------------------------------------
JVM自èínçš„å†…å˜æƒ…况:
Â
[root@host_77-69 ~]# jstat -gcutil `jps | grep -i main | awk '{print $1}'` 3000 1000 S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 0.00 90.91 13.56 60.25 26 0.877 2 0.802 1.679 0.00 0.00 91.17 13.56 60.25 26 0.877 2 0.802 1.679 0.00 0.00 91.27 13.56 60.25 26 0.877 2 0.802 1.679 0.00 0.00 91.28 13.56 60.25 26 0.877 2 0.802 1.679Â
fugcc‹Æ¡æ•°åŸºæœ¬ä¸å˜åQŒè€Œä¸”å„个代内å˜å˜åŒ–基本ä¸å¤§Â?/p>
Â
æ“作¾pÈ»Ÿçš„å†…å˜æƒ…况:
Â
[root@host_77-69 releases]# for i in {1..10};do free;sleep 3 ; done; total used free shared buffers cached Mem: 3925596 3223996 701600 0 392352 1330896 -/+ buffers/cache: 1500748 2424848 Swap: 4194296 2056 4192240 total used free shared buffers cached Mem: 3925596 3223996 701600 0 392352 1330896 -/+ buffers/cache: 1500748 2424848 Swap: 4194296 2056 4192240 total used free shared buffers cached Mem: 3925596 3223996 701600 0 392352 1330896 -/+ buffers/cache: 1500748 2424848 Swap: 4194296 2056 4192240Â Â
æ•°å€ég¹ŸåŸºæœ¬ä¿æŒä¸å˜åŒ?/p>
Â
---------------------------------------------- 䏋颿˜¯ç£ç›˜IOçš„åˆå§‹æƒ…况了 ----------------------------------------------Â
Â
[root@host_77-69 ~]# for i in {1..10};do iostat ; sleep 3 ; done ; Linux 2.6.32-71.el6.x86_64 (host_77-69) 09/12/2012 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.10 0.00 0.02 0.00 0.00 99.88 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.31 0.33 5.93 1751462 31740872 Linux 2.6.32-71.el6.x86_64 (host_77-69) 09/12/2012 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.10 0.00 0.02 0.00 0.00 99.88 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.31 0.33 5.93 1751462 31740960Â Â
主è¦è§‚察Â
Blk_read/s   æ¯ç§’ä¸è¯»å–çš„å—æ•°
Blk_wrtn/s   æ¯ç§’ä¸å†™çš„å—æ•?/p>
%iowait    当å‰åœ¨ç‰å¾…ç£ç›˜IO的情å†?/p>
Â
---------------------------------------------- 说了˜q™ä¹ˆå¤šç»ˆäºŽè¦å¼€å§‹äº† ----------------------------------------------Â
Â
开始压‹¹‹åŽåQŒå¾—åˆîC¸‹é¢çš„æ•°æ®åQ?/p>
Â
[root@host_77-69 ~]# vmstat -ns 3 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- 0 0 2056 698224 393212 1331344 0 0 0 3 536 867 0 0 100 0 0 3 0 2056 694796 393212 1332248 0 0 0 19 7170 7515 55 4 40 0 0 1 0 2056 694796 393212 1333132 0 0 0 4 7121 7627 50 5 45 0 0 4 0 2056 692936 393216 1334376 0 0 0 17 6478 8738 54 5 42 0 0 2 0 2056 691548 393232 1335620 0 0 0 25 6497 7663 48 4 48 0 0 5 0 2056 689936 393232 1337052 0 0 0 3 7597 7174 47 5 48 0 0 3 0 2056 688704 393232 1338496 0 0 0 12 7369 8774 49 5 45 0 0 3 0 2056 686348 393232 1341528 0 0 0 819 12298 16011 50 5 45 0 0 4 0 2056 684976 393236 1343020 0 0 0 12 6034 6951 48 4 48 0 0 3 0 2056 664268 393240 1344508 0 0 0 1 6731 9584 52 5 42 0 0 1 0 2056 659360 393240 1346284 0 0 0 12 7797 8431 54 5 41 0 0 2 0 2056 657624 393240 1347564 0 0 0 2684 6908 7656 50 5 45 0 0Â Â
在压‹¹‹çš„˜q™ä¸ª˜q‡ç¨‹ä¸ï¼ŒCPU大é‡ä¸Šä¸‹æ–‡åˆ‡æ¢åŠ¨ä½œæ˜Žæ˜‘Ö¢žåŠ äº†å¾ˆå¤šã€?/p>
Â
[root@host_77-69 ~]# mpstat -P ALL 5 04:01:32 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 04:01:37 PM all 0.15 0.00 0.10 0.00 0.00 0.05 0.00 0.00 99.70 04:01:37 PM 0 0.20 0.00 0.00 0.00 0.00 0.20 0.00 0.00 99.60 04:01:37 PM 1 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.80 04:01:37 PM 2 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.80 04:01:37 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00Â
˜q™ä¸ªæ•°æ®ä¸Šçœ‹å‡ºå…¶ä¸ä¸€ä¸ªCPUèŠÞp´¹åœ¨åˆ‡æ¢çš„æ—‰™—´æ¯”是0.2%åQŒä¹Ÿä¸æ˜¯å¾ˆé«˜ã€?/p>
Â
[root@host_77-69 ~]# ps -eLf | grep java | wc -l 229 [root@host_77-69 ~]# ps -eLf | grep java | wc -l 236 [root@host_77-69 ~]# ps -eLf | grep java | wc -l 236 [root@host_77-69 ~]# ps -eLf | grep java | wc -l 235 [root@host_77-69 ~]# ps -eLf | grep java | wc -l 229 [root@host_77-69 ~]# ps -eLf | grep java | wc -l 229Â Â
java的线½E‹æ•°å¢žåŠ åˆîCº†236åQŒä¹Ÿž®±æ˜¯è¯´å¢žåŠ äº†7个,我们最åˆè®¾¾|®æ˜¯4个,队列1000 åQŒåœ¨é˜Ÿåˆ—满了åŽï¼Œå¢žåŠ äº?个,也就是说åQŒè¿™¿U情况,扩容åˆ?个线½E‹ï¼Œž®Þpƒ½æ»¡èƒö我们的压‹¹‹æ¡ä»Óž¼Œé‚£è¯´æ˜Žcoreä¸?åQŒå˜åœ¨å¤§é‡çš„队列¿U¯åŽ‹æƒ…å†µåQŒåŒæ—Óž¼Œä¸Šé¢çš„æ•°æ®è¡¨æ˜Žï¼Œç”¨äºŽä¸Šä¸‹æ–‡åˆ‡æ¢çš„æ¯”ä¾‹ä¹Ÿä¸æ˜¯å¾ˆé«˜ï¼Œå¦‚æ¤æˆ‘们ž®±å¯ä»¥å¢žåŠ çº¿½E‹æ± çš„corePoolSize。那么下个案例就å¯ä»¥è®„¡½®ä¸?个试试看ã€?/p>
Â
[root@host_77-69 ~]# jstat -gcutil `jps | grep -i main | awk '{print $1}'` 3000 1000 S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 27.46 76.94 19.37 60.86 31 1.139 3 1.497 2.636 0.00 23.34 85.64 19.37 60.90 33 1.150 3 1.497 2.647 0.00 36.14 38.44 19.37 60.91 35 1.167 3 1.497 2.665 0.00 63.19 37.87 19.37 60.92 37 1.191 3 1.497 2.688 59.29 0.00 1.61 19.48 60.92 40 1.226 3 1.497 2.723 0.00 50.63 58.22 19.50 60.93 41 1.236 3 1.497 2.733 0.00 51.09 70.36 19.58 60.94 43 1.265 3 1.497 2.762 44.05 0.00 2.09 19.67 60.95 46 1.298 3 1.497 2.795 0.00 83.74 75.70 19.68 60.96 47 1.316 3 1.497 2.813 0.00 89.57 77.32 20.21 60.96 49 1.350 3 1.497 2.847 46.02 0.00 36.83 22.12 60.97 52 1.399 3 1.497 2.896 36.69 0.00 37.78 22.12 60.98 54 1.417 3 1.497 2.914 59.51 0.00 23.47 22.12 61.00 56 1.435 3 1.497 2.932 64.53 0.00 36.51 22.29 61.03 58 1.461 3 1.497 2.959 73.19 0.00 78.00 23.01 61.05 60 1.497 3 1.497 2.995 54.24 0.00 36.10 23.01 61.06 62 1.521 3 1.497 3.018 79.36 0.00 82.65 23.01 61.08 64 1.547 3 1.497 3.044 0.00 68.75 48.34 26.61 61.10 67 1.606 3 1.497 3.103 29.33 0.00 93.75 26.61 61.12 68 1.613 3 1.497 3.110 0.00 45.32 23.68 26.61 61.12 71 1.640 3 1.497 3.138 34.93 0.00 19.75 29.84 61.13 74 1.697 3 1.497 3.194 22.59 0.00 27.47 29.84 61.14 76 1.711 3 1.497 3.208 54.40 0.00 74.16 30.45 61.15 78 1.734 3 1.497 3.231 25.23 0.00 77.50 30.45 61.15 80 1.747 3 1.497 3.245 25.23 0.00 98.39 30.45 61.15 80 1.747 3 1.497 3.245 25.23 0.00 99.94 30.45 61.15 80 1.747 3 1.497 3.245 0.00 14.32 1.42 30.45 61.15 81 1.752 3 1.497 3.250 0.00 14.32 2.15 30.45 61.15 81 1.752 3 1.497 3.250 0.00 14.32 2.27 30.45 61.15 81 1.752 3 1.497 3.250 0.00 14.32 2.48 30.45 61.15 81 1.752 3 1.497 3.250
Â
Â
˜q™ä¸ªæ˜¯æŸ¥çœ‹JVMçš„GC情况的,数æ®è¡¨æ˜ŽåQŒåŽ‹‹¹‹æœŸé—ß_¼Œygc˜q˜æ˜¯è›®é¢‘¾Jï¼Œä½†æ˜¯æ¯æ¬¡ygcåŽè¿›å…¥old区的数æ®òq¶ä¸æ˜¯å¾ˆå¤šï¼Œè¯´æ˜Žæˆ‘们的应用大部分是æœç”Ÿå¤•æ»ï¼Œòq¶ä¸ä¼šå‘生频¾Jfgc的情况,之厞®×ƒ¸ç”¨æŠŠé‡å¿ƒæ”‘Öœ¨JVMçš„GC上ã€?/p>
Â
[root@host_77-69 releases]# for i in {1..10};do free;sleep 3 ; done; total used free shared buffers cached Mem: 3925596 3370968 554628 0 395584 1369572 -/+ buffers/cache: 1605812 2319784 Swap: 4194296 2056 4192240Â
æ“作¾pÈ»Ÿè·Ÿä¹‹å¿ƒå‰ç›¸æ¯”åQŒåŸºæœ¬æ²¡æœ‰å‘生ä“Q何的改å˜ã€?/p>
Â
avg-cpu: %user %nice %system %iowait %steal %idle 0.10 0.00 0.02 0.00 0.00 99.88 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.31 0.33 5.95 1751462 31823032 Linux 2.6.32-71.el6.x86_64 (host_77-69) 09/12/2012 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.10 0.00 0.02 0.00 0.00 99.88 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.31 0.33 5.95 1751462 31823032
Â
Â
˜q™ä¸ªæ˜¯å½“å‰åº”用对于ç£ç›˜çš„æ¶ˆè€—情况,å¯Òޝ”åˆå§‹å€û|¼ŒåŸºæœ¬æ²¡ä»€ä¹ˆå˜åŒ–,å¯ä»¥çœ‹å‡ºæˆ‘们˜q™ä¸ªåº”用没有¼‚盘IO的消耗,˜q™è¯´æ˜Žæœ¬åº”用òq¶æ²¡æœ‰å¤§é‡çš„æ“ä½œæœ¬åœ°¼‚盘IO情况ã€?/p>
˜q™ä¸ªä¹Ÿä¸æ˜¯å¯¼è‡´æˆ‘们系¾lŸæ…¢çš„åŽŸå› ï¼Œä¹Ÿå¯ä»¥æŽ’除ã€?/p>
Â
Â
xxxModuleProcessor 33 最慢的processor�3毫秒
Â
我们的processor最大的消耗是33毫秒åQŒå¤–部调ç”?.9ms åQŒä½†æ˜¯æœ€åŽçœ‹åˆ°çš„æ¶ˆè€—时间是557msåQŒä¸”上é¢çš„æƒ…况说明了åQŒå˜åœ¨å¤§é‡é˜Ÿåˆ—积压,我们的数æ®å¤„ç†processor都在½{‰å¾…队列äº?/p>
Â
䏋颿˜¯æˆ‘们通过
Avg(ms):
½W¬ä¸€‹Æ¡ï¼š 662.5 毫秒
½W¬äºŒ‹Æ¡ï¼š 680  毫秒
½W¬ä¸‰‹Æ¡ï¼š 690  毫秒
Â
通过上é¢çš„分æžï¼Œòq›_‡å“应旉™—´æ˜¯ï¼š680ms,基本å¯ä»¥¼‹®å®šé—®é¢˜åœ¨äºŽ¾U¿ç¨‹æ± corePoolSize˜q‡å°,坯D‡´äº†ä¸€å®šçš„æ•°æ®åœ¨é˜Ÿåˆ—丿U¯åŽ‹ã€?/p>
Â
Â
---------------------------------------------  ˜q™æ˜¯ä¸€æ¡ä¼Ÿå¤§çš„分割¾U? ---------------------------------------------
‹¹‹è¯•案例二:
Â
改动åQšå¢žåР䏀å€çš„corePoolSize
Â
15¾U¿ç¨‹Â
循环100‹Æ?/p>
¾U¿ç¨‹æ± :
 corePoolSize åQ? * CPU =  8Â
 maxPoolSize  åQ? * corePoolSize = 16Â
 queueCapacity åQ?1000Â
Â
压测™åµé¢åQ?/member/22933Â
Â
---------------------------------------------  我åˆå‡ºçްäº? ---------------------------------------------
Â
冿¬¡å¯åЍ½E›_®šåŽï¼š
[root@host_77-69 ~]# for i in {1..10000};do   ps -eLf | grep java  | wc -l; echo "-------" ; sleep 2 ; done;
215
-------
215
-------
215
-------
Â
java的线½E‹æ•°¾l´æŒåœ?15ä¸ªï¼Œè·Ÿä¸Šé¢æœ‰ç‚¹ä¸åŒï¼Œå½“ç„¶ä¸ç®¡äº†ï¼Œ˜q™ä¸ªä¸æ˜¯é‡ç‚¹ã€?/p>
Â
Â
[root@host_77-69 ~]# vmstat -ns 3 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- 0 0 2056 933420 395768 1341376 0 0 0 8 579 875 0 0 100 0 0 0 0 2056 933420 395768 1341376 0 0 0 3 579 860 0 0 100 0 0 0 0 2056 933420 395776 1341372 0 0 0 9 568 867 0 0 100 0 0Â
Â
åˆå§‹æƒ…况CPU˜q行都很æ£å¸¸Â
Â
Â
[root@host_77-69 ~]# mpstat -P ALL 5 Linux 2.6.32-71.el6.x86_64 (host_77-69) 09/12/2012 _x86_64_ (4 CPU) 05:43:34 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 05:43:39 PM all 0.40 0.00 0.10 0.00 0.00 0.00 0.00 0.00 99.50 05:43:39 PM 0 0.80 0.00 0.20 0.00 0.00 0.00 0.00 0.00 99.00
Â
åŸºæœ¬æ²¡æœ‰è½¯ä¸æ–?/p>
Â
压测åŽå¾—到如下数æ®ï¼š
[root@host_77-69 ~]# for i in {1..10000};do   ps -eLf | grep java  | wc -l; echo "-------" ; sleep 2 ; done;
214
-------
214
-------
214
-------
217
-------
219
-------
219
-------
。。。。。�/p>
221
-------
219
-------
。。。。。�/p>
218
-------
218
-------
214
-------
˜q™ä¸ªjava¾U¿ç¨‹æ•°çš„å˜åŒ–情况åQŒä»Ž 214-- 221 -- 214ã€?åˆå§‹åŒ–了8个,然åŽå¢žåŠ äº?个,也就是说¾U¿ç¨‹æ± 䏿€Õd…±å¯ç”¨äº?5个线½E‹ã€?/p>
------------------------------------------------------ Â
Â
[root@host_77-69 ~]# mpstat -P ALL 5 05:59:00 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 05:59:05 PM all 51.46 0.00 4.58 0.00 0.29 2.00 0.00 0.00 41.67 05:59:05 PM 0 50.98 0.00 4.71 0.00 0.98 7.25 0.00 0.00 36.08 05:59:05 PM 1 51.07 0.00 4.29 0.00 0.00 0.39 0.00 0.00 44.25 05:59:05 PM 2 50.49 0.00 4.87 0.00 0.00 0.19 0.00 0.00 44.44 05:59:05 PM 3 53.29 0.00 4.46 0.00 0.00 0.19 0.00 0.00 42.05 05:59:05 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 05:59:10 PM all 49.56 0.00 4.25 0.00 0.29 2.00 0.00 0.00 43.89 05:59:10 PM 0 46.56 0.00 3.73 0.00 1.18 7.07 0.00 0.00 41.45 05:59:10 PM 1 58.12 0.00 4.31 0.00 0.00 0.39 0.00 0.00 37.18 05:59:10 PM 2 45.72 0.00 4.67 0.00 0.00 0.39 0.00 0.00 49.22 05:59:10 PM 3 47.95 0.00 4.29 0.00 0.00 0.39 0.00 0.00 47.37 05:59:10 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 05:59:15 PM all 50.54 0.00 4.19 0.00 0.29 1.75 0.00 0.00 43.23 05:59:15 PM 0 55.36 0.00 3.70 0.00 1.17 5.85 0.00 0.00 33.92 05:59:15 PM 1 53.62 0.00 4.70 0.00 0.00 0.59 0.00 0.00 41.10 05:59:15 PM 2 46.98 0.00 4.29 0.00 0.00 0.19 0.00 0.00 48.54 05:59:15 PM 3 46.21 0.00 4.27 0.00 0.00 0.19 0.00 0.00 49.32 05:59:15 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 05:59:20 PM all 52.78 0.00 4.48 0.05 0.39 2.14 0.00 0.00 40.17 05:59:20 PM 0 52.17 0.00 3.94 0.00 1.57 7.68 0.00 0.00 34.65 05:59:20 PM 1 52.35 0.00 4.90 0.00 0.00 0.39 0.00 0.00 42.35 05:59:20 PM 2 57.09 0.00 4.85 0.00 0.00 0.19 0.00 0.00 37.86 05:59:20 PM 3 49.42 0.00 4.23 0.00 0.00 0.38 0.00 0.00 45.96 05:59:20 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 05:59:25 PM all 46.90 0.00 3.85 0.00 0.34 1.76 0.00 0.00 47.15 05:59:25 PM 0 48.34 0.00 3.70 0.00 1.56 6.43 0.00 0.00 39.96 05:59:25 PM 1 43.30 0.00 4.47 0.00 0.00 0.39 0.00 0.00 51.84 05:59:25 PM 2 50.59 0.00 3.52 0.00 0.00 0.39 0.00 0.00 45.51 05:59:25 PM 3 45.14 0.00 3.70 0.00 0.00 0.19 0.00 0.00 50.97Â Â
上é¢çš„æ•°æ®è¡¨æ˜Žï¼Œä¸æ–å CPUçš„æ¯”ä¾‹ç¡®å¤§å¤§å¢žåŠ äº†ã€‚å•æ æ€¸æ–æœ€é«˜è¾¾åˆîCº†7.25% 如æ¤å¯ÆD‡´äº†ä»€ä¹ˆç»“果呢?
Â
Min(ms) Max(ms) Avg(ms) 95Line(ms) Std(ms) TPS
161.2 Â 8877.4 731.7 Â 1000.0 Â Â 65.3 Â 1.2
Â
æƒÏx¯”较corePoolSize:4 max:8 性能å而下é™äº†ã€‚åã^å‡å“应时间从662.5é™åˆ°äº?31.7ã€?/p>
Â
最慢的processor的消耗时间是åQ?span style="white-space: pre;"> 187.9
Â
期间也猜‹¹‹å¯èƒ½æ˜¯å…¶ä¸ä¸€ä¸ªæœåŠ¡è¢«æˆ‘ä»¬åŽ‹å了,ž®±é‡å¯äº†é‚£ä¸ªæœåŠ¡åQŒå†‹Æ¡åŽ‹‹¹‹çš„¾l“æžœæ˜?/p>
Min(ms) Max(ms) Avg(ms) 95Line(ms) Std(ms) TPS
102.9 Â 9188.9 762.5 Â 1095.0 Â Â 657.8 Â 3.0
Â
òq›_‡å“应旉™—´æ˜¯ï¼š750毫秒左å³ã€?/p>
Â
也就是说åQŒåŸºæœ¬å¯ä»¥ç¡®è®¤æ˜¯ç”׃ºŽæˆ‘ä»¬å¢žåŠ äº?coreSizeå’ŒmaxSize坯D‡´æ€§èƒ½å˜æ…¢äº†ã€‚慢了近80毫秒。说明过多的CPUòq¶ä¸ä¼šåŠ å¿«æˆ‘ä»¬çš„å¤„ç†é€Ÿåº¦ã€?/span>
如椞®±æœ‰äº†ä¸‹é¢çš„æ–ÒŽ¡ˆã€?/p>
Â
‹¹‹è¯•æ–ÒŽ¡ˆä¸‰ï¼š
corePoolSize : cpuæ•°é‡ + 1  = 5Â
maxPoolSzie : 2 * corePoolSize  = 10Â
Â
我们看下具体情况å§ï¼š
Â
Â
[root@host_77-69 ~]# mpstat -P ALL 5 06:57:36 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 06:57:41 PM all 58.27 0.00 5.38 0.00 0.49 2.30 0.00 0.00 33.56 06:57:41 PM 0 61.66 0.00 4.74 0.00 1.98 8.10 0.00 0.00 23.52 06:57:41 PM 1 55.75 0.00 5.65 0.00 0.00 0.58 0.00 0.00 38.01 06:57:41 PM 2 57.81 0.00 5.47 0.00 0.00 0.20 0.00 0.00 36.52Â Â
CPU的上下文切梘q˜æ˜¯å¾ˆåŽ‰å®Ÿë€‚è¾¾åˆîCº†8.10%
[root@host_77-69 ~]# for i in {1..10000};do   ps -eLf | grep java  | wc -l; echo "-------" ; sleep 2 ; done;
214
-------
214
-------
219
-------
219
-------
217
-------
215
-------
214
Â
214--219Â
原楾U¿ç¨‹æ± coreæ˜?åQŒæˆ‘们最大是10个,¾U¿ç¨‹æ•°ç¡®å®žå¢žåŠ åˆ°äº?0个,ž®±æ˜¯è¯?0个线½E‹å¯¹åº”到4个CPU上,两者的比例æ˜?:2.25Â
Â
¾l“æžœåQ?/p>
½W¬ä¸€‹Æ¡åŽ‹‹¹‹æ˜¯åQ?48毫秒
½W¬äºŒ‹Æ¡åŽ‹‹¹‹æ˜¯åQ?22毫秒
½W¬ä¸‰‹Æ¡åŽ‹‹¹‹æ˜¯åQ?03毫秒
Â
ž®±å–ä¸é—´å€¼å§åQ?22毫秒Â
Â
性能æƒÏx¯”è¾?coreåQ? max:16çš„è¯åQŒæœ‰0.060毫秒的æå‡ã€‚说明一定cpu和进½E‹æ•°ä¿æŒåœ?:2.25的比例上åQŒæ•ˆçŽ‡ä¸Š˜q˜æ˜¯æœ‰æé«˜çš„åQŒä½†æ˜¯ä¸Šä¸‹æ–‡åˆ‡æ¢çš„还是很厉害ã€?/span>
Â
ä¸ÞZº†ä¸è®©å®ƒåˆ‡æ¢çš„˜q™ä¹ˆåމ害åQŒå°±ž®†max讄¡½®çš„å°ç‚¹å§ã€?/p>
Â
‹¹‹è¯•æ–ÒŽ¡ˆå›?/span>
¾U¿ç¨‹åQ?5Â
循环åQ?00‹Æ?/p>
corePoolSize : cpuæ•°é‡ + 1   =  5Â
maxPoolSzie : 2 * cpu   =  8
Â
08:13:13 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 08:13:18 PM all 52.45 0.00 4.60 0.00 0.10 1.27 0.00 0.00 41.58 08:13:18 PM 0 60.00 0.00 3.96 0.00 0.59 3.96 0.00 0.00 31.49 08:13:18 PM 1 50.29 0.00 5.48 0.00 0.00 0.20 0.00 0.00 44.03 08:13:18 PM 2 50.78 0.00 4.86 0.00 0.00 0.58 0.00 0.00 43.77 08:13:18 PM 3 48.83 0.00 4.28 0.00 0.00 0.19 0.00 0.00 46.69 08:13:18 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 08:13:23 PM all 50.05 0.00 4.29 0.00 0.10 1.22 0.00 0.00 44.34 08:13:23 PM 0 57.54 0.00 4.56 0.00 0.20 3.97 0.00 0.00 33.73 08:13:23 PM 1 49.81 0.00 4.28 0.00 0.00 0.39 0.00 0.00 45.53 08:13:23 PM 2 48.16 0.00 3.88 0.00 0.00 0.39 0.00 0.00 47.57 08:13:23 PM 3 45.07 0.00 4.45 0.00 0.00 0.19 0.00 0.00 50.29 08:13:23 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 08:13:28 PM all 51.34 0.00 4.69 0.00 0.10 1.27 0.00 0.00 42.60 08:13:28 PM 0 60.08 0.00 4.15 0.00 0.40 3.95 0.00 0.00 31.42 08:13:28 PM 1 47.75 0.00 6.07 0.00 0.00 0.39 0.00 0.00 45.79 08:13:28 PM 2 47.48 0.00 4.26 0.00 0.00 0.39 0.00 0.00 47.87 08:13:28 PM 3 50.19 0.00 4.28 0.00 0.00 0.39 0.00 0.00 45.14
䏿–æ—‰™—´¼‹®å®žä»?%下é™åˆîCº†4%å·¦å³ã€?/p>
[root@host_77-69 ~]# for i in {1..10000};do   ps -eLf | grep java  | wc -l; echo "-------" ; sleep 2 ; done;
215
-------
217
-------
217
-------
219
-------
219
-------
218
-------
¾U¿ç¨‹æ± 基本处于饱和状æ€ã€?/p>
Â
¾l“æžœåQ?/p>
½W¬ä¸€‹Æ¡åŽ‹‹¹‹ç»“果:629毫秒
½W¬äºŒ‹Æ¡åŽ‹‹¹‹ç»“果:618毫秒
½W¬ä¸‰‹Æ¡åŽ‹‹¹‹ç»“果:586毫秒
Â
˜q™æ¬¡CPU:¾U¿ç¨‹æ•îCØ“1:2
相比较CPU和线½E‹æ•°1.2.25的结果有½E微的æå‡ï¼Œå› 䨓CPU䏿–æ—‰™—´æ¯”下é™äº†ã€?/p>
Â
最¾lˆçš„¾l“论åQŒJVM的垃圑֛žæ”Óž¼Œæœ¬åœ°¼‚盘IOåQŒæ“作系¾lŸå†…å˜éƒ½ä¸ä¼šå¯ÒŽœ¬åº”用产生影å“åQŒå”¯ä¸€çš„å…ƒç´ å°±æ˜¯çº¿½E‹æ± 大å°çš„设¾|®ã€?span style="color: #ff0000;">目剋¹‹è¯•出æ¥çš„æœ€ä½³ç–略是åQ?/span>
corePoolSize = cpu + 1
maxPoolSize = 2 *  cpu   
Â
rediså¦ä¹ ½W”è®°3--sortSet
¾lˆäºŽåˆ°æœ€åŽä¸€ä¸ªæ•°æ®ç»“构了åQŒåŠ æ²¹ï¼åQ?/p>
整体¾l“构图:
http://dl.iteye.com/upload/picture/pic/115995/0ee3789f-33e1-35ca-ac65-cbd6b4e4e147.jpg
Â
Â
1.ZADD
è¯æ³•åQ?ZADD key score valueÂ
释义åQšæ·»åŠ æ‰§è¡Œåˆ†æ•°çš„valueåQ?score必须是double¾cÕdž‹çš„æ•°å€?/p>
实践åQ?/p>
redis 127.0.0.1:6379> zadd z1 1 aÂ
(integer) 1
redis 127.0.0.1:6379> zadd z1 2 bÂ
(integer) 1
redis 127.0.0.1:6379> zadd z1 20 bbÂ
(integer) 1
redis 127.0.0.1:6379> zadd z1 10 ff Â
(integer) 1
redis 127.0.0.1:6379> zrange z1 0 -1Â
1) "a"
2) "b"
3) "ff"
4) "bb"
Â
Â
2.ZREM
è¯æ³•:ZREM key valueÂ
释义åQšåˆ 除指定valueçš„å€?/p>
实践åQ?/p>
redis 127.0.0.1:6379> ZREM z1 b       // åˆ é™¤åQŒæŒ‡å®švalue
(integer) 1
redis 127.0.0.1:6379> zrange z1 0 -1 Â Â Â Â Â
1) "a"
2) "ff"
3) "bb"
Â
Â
3.ZCARD
è¯æ³•åQšZCARD keyÂ
释义åQšèŽ·å–é›†åˆæ€ÀL•°
实践åQ?/p>
redis 127.0.0.1:6379> zrange z1 0 -1Â
1) "a"
2) "ff"
3) "bb"
redis 127.0.0.1:6379> zcard z1Â
(integer) 3
Â
4.ZCOUNT
è¯æ³•:zcount key min max
释义åQšè®¡½Ž—åœ¨æŒ‡å®šèŒƒå›´å†…çš„å…ƒç´ æ•°ç›®
(1 6  ==== 1 < x <= 6     // 括å·ä»£è¡¨å¼€åŒºé—´
1 6 Â ==== 1 <= x <= 6
Â
Â
实践åQ?/p>
redis 127.0.0.1:6379> zrange z1 0 -1 withscoresÂ
1) "a"
2) "1"
3) "ff"
4) "10"
5) "bb"
6) "20"
redis 127.0.0.1:6379> zcount z1 5 10    // é—区é—ß_¼Œèƒ½å–å¾?0
(integer) 1
redis 127.0.0.1:6379> zcount z1 5 (10   //开区间åQŒæ— 法得åˆ?0
(integer) 0
Â
5.ZSCORE
è¯æ³•åQšZSCORE key value
释义åQšèŽ·å–æŒ‡å®škey的分æ•?/p>
实践åQ?/p>
redis 127.0.0.1:6379> zrange z1 0 -1 withscoresÂ
1) "a"
2) "1"
3) "ff"
4) "10"
5) "bb"
6) "20"
redis 127.0.0.1:6379> zscore z1 a       // 获å–a的分æ•?/p>
"1"
Â
6.ZINCRBY
è¯æ³•åQšZINCRBY key score valueÂ
释义åQšå¯¹äºŽæŒ‡å®šçš„value˜q›è¡ŒåŠ æ³•æ“作
实践åQ?/p>
redis 127.0.0.1:6379> zrange z1 0 -1 withscoresÂ
1) "a"
2) "1"
3) "ff"
4) "10"
5) "bb"
6) "20"
redis 127.0.0.1:6379> zincrby z1 10 a       // 对于a+10
"11"
redis 127.0.0.1:6379> zrange z1 0 -1 withscoresÂ
1) "ff"
2) "10"
3) "a"
4) "11"
5) "bb"
6) "20"
redis 127.0.0.1:6379> zincrby z1 -3 a      // 对于a-3
"8"
redis 127.0.0.1:6379> zrange z1 0 -1 withscoresÂ
1) "a"
2) "8"
3) "ff"
4) "10"
5) "bb"
6) "20"
Â
7.ZRANGE|ZREVRANGE
è¯æ³•åQšZRANGE|ZREVRANGE keyÂ
释义åQšæ˜¾½Cºæ‰€æœ‰åˆ—è¡?/p>
redis 127.0.0.1:6379> zrange z1 0 -1Â
1) "a"
2) "ff"
3) "bb"
redis 127.0.0.1:6379> zrevrange z1 0 -1Â
1) "bb"
2) "ff"
3) "a"
Â
8.ZRANGEBYSCORE|ZREVRANGEBYSCORE
è¯æ³•åQšZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
释义åQšèŽ·å–æŒ‡å®šèŒƒå›´å†…的数å€?/p>
实践åQ?/p>
redis 127.0.0.1:6379> zrange z1 0 -1 withscoresÂ
1) "a"
2) "8"
3) "ff"
4) "10"
5) "bb"
6) "20"
redis 127.0.0.1:6379> zrangebyscore z1 -inf +inf  // åœ¨ä¸æ¸…楚最大最ž®èŒƒå›´çš„æ—‰™—´åQŒå¯ä»¥é‡‡ç”¨è¿™ä¸?-inf +infÂ
1) "a"
2) "ff"
3) "bb"
redis 127.0.0.1:6379> zrangebyscore z1 8 10    // é—区é—?/p>
1) "a"
2) "ff"
redis 127.0.0.1:6379> zrangebyscore z1 (8 10    // 开区间
1) "ff"
Â
Â
9.ZRANK|ZREVRANK
è¯æ³•åQšzrank|zremrank  key member
释义åQšèŽ·å–æŒ‡å®šå€¼åœ¨é›†åˆä¸çš„æŽ’ååQŒä»¥åQ代表第一ä½ã€€ã€‚(™åºåºæˆ–是逆åºåQ?/p>
redis 127.0.0.1:6379> zrange z1 0 -1 withscoresÂ
1) "a"
2) "8"
3) "ff"
4) "10"
5) "bb"
6) "20"
redis 127.0.0.1:6379> zrank z1 aÂ
(integer) 0
redis 127.0.0.1:6379> zrank z1 ff     //™åºåºä½ç½®
(integer) 1Â
redis 127.0.0.1:6379> zrevrank z1 a     //逆åºä½ç½®
(integer) 2
Â
10.ZREMRANGEBYRANK
è¯æ³• :ZREMRANGEBYRANK key min maxÂ
释义åQšåˆ é™¤æŒ‡å®šä¸‹æ ‡çš„æ•°æ®
实践åQ?/p>
redis 127.0.0.1:6379> zrange z1 0 -1Â
1) "a"
2) "ff"
3) "bb"
redis 127.0.0.1:6379> zremrangebyrank z1 0 1Â
(integer) 2
redis 127.0.0.1:6379> zrange z1 0 -1Â
1) "bb"
Â
11.ZREMRANGEBYSCORE
è¯æ³• :ZREMRANGEBYSCORE key min max
释义åQšæ ¹æ®æŒ‡å®šåˆ†æ•°åˆ 除数æ?/p>
实践åQ?/p>
redis 127.0.0.1:6379> zrange z1 0 -1 withscoresÂ
1) "bb"
2) "20"
redis 127.0.0.1:6379> ZREMRANGEBYSCORE z1 -inf +inf   // åˆ é™¤æ‰€æœ‰çš„æ•°æ® ½{‰åŒäº? del z1
(integer) 1
redis 127.0.0.1:6379> zrange z1 0 -1Â
(empty list or set)
Â
12.ZINTERSTORE
è¯æ³•åQšZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
释义åQ?/p>
 计算¾l™å®šçš„一个或多个有åºé›†çš„交集åQŒå…¶ä¸ç»™å®?key 的数é‡å¿…™åÖM»¥ numkeys 傿•°æŒ‡å®šåQŒåƈž®†è¯¥äº¤é›†(¾l“æžœé›?储å˜åˆ?destination ã€?/p>
 默认情况下,¾l“æžœé›†ä¸æŸä¸ªæˆå‘˜çš?score 值是所有给定集下该æˆå‘˜ score å€ég¹‹å’?
Â
实践åQ?/p>
redis 127.0.0.1:6379> zrange s1 0 -1Â
1) "a"
2) "b"
3) "c"
redis 127.0.0.1:6379> zrange s2 0 -1Â
1) "a"
2) "c"
3) "d"
redis 127.0.0.1:6379> zinterstore s3 2 s1 s2Â
(integer) 2
redis 127.0.0.1:6379> zrange s3 0 -1Â
1) "a"
2) "c"
redis 127.0.0.1:6379>Â
Â
13.ZUNIONSTORE
è¯æ³•åQšZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
释义åQšè®¡½Ž—给定的一个或多个有åºé›†çš„òq‰™›†åQŒå…¶ä¸ç»™å®?key 的数é‡å¿…™åÖM»¥ numkeys 傿•°æŒ‡å®šåQŒåƈž®†è¯¥òq‰™›†(¾l“æžœé›?储å˜åˆ?destination ã€?/p>
默认情况下,¾l“æžœé›†ä¸æŸä¸ªæˆå‘˜çš?score 值是所有给定集下该æˆå‘˜ score å€ég¹‹ å’?ã€?/p>
Â
WEIGHTS
 使用 WEIGHTS 选项åQŒä½ å¯ä»¥ä¸?æ¯ä¸ª ¾l™å®šæœ‰åºé›?分别 æŒ‡å®šä¸€ä¸ªä¹˜æ³•å› å?multiplication factor)åQŒæ¯ä¸ªç»™å®šæœ‰åºé›†çš„æ‰€æœ‰æˆå‘˜çš„ score å€¼åœ¨ä¼ é€’ç»™èšåˆå‡½æ•°(aggregation function)之å‰éƒ½è¦å…ˆä¹˜ä»¥è¯¥æœ‰åºé›†çš„å› åã€?/p>
 如果没有指定 WEIGHTS 选项åQŒä¹˜æ³•å› å默认设¾|®äØ“ 1 ã€?/p>
Â
AGGREGATE
 使用 AGGREGATE 选项åQŒä½ å¯ä»¥æŒ‡å®šòq‰™›†çš„结果集的èšåˆæ–¹å¼ã€?/p>
Â é»˜è®¤ä½¿ç”¨çš„å‚æ•?SUM åQŒå¯ä»¥å°†æ‰€æœ‰é›†åˆä¸æŸä¸ªæˆå‘˜çš?score å€ég¹‹ å’?ä½œäØ“¾l“果集ä¸è¯¥æˆå‘˜çš„ score å€û|¼›ä½¿ç”¨å‚æ•° MIN åQŒå¯ä»¥å°†æ‰€æœ‰é›†åˆä¸æŸä¸ªæˆå‘˜çš?最ž®?score å€ég½œä¸ºç»“果集ä¸è¯¥æˆå‘˜çš?score å€û|¼›è€Œå‚æ•?MAX 则是ž®†æ‰€æœ‰é›†åˆä¸æŸä¸ªæˆå‘˜çš?最å¤?score å€ég½œä¸ºç»“果集ä¸è¯¥æˆå‘˜çš?score 倹{€?/p>
Â
实践åQ?/p>
redis 127.0.0.1:6379> zunionstore s3 2 s1 s2Â
(integer) 4
redis 127.0.0.1:6379> zrange s3 0 -1Â
1) "b"
2) "a"
3) "c"
4) "d"
redis 127.0.0.1:6379>Â
rediså¦ä¹ ½W”è®°3--set
Â
list:有åºä¸”,å…许é‡å¤æ•°æ®çš„链è¡?å˜åœ¨POP PUSH的概å¿?/p>
set: æ— éœ€åºï¼Œä¸èƒ½é‡å¤çš„集å?ä¸»è¦æ˜¯ADDÂ
sortSetåQšæœ‰åºï¼Œä¸èƒ½é‡å¤çš„集åˆÂ?/p>
Â
整体¾l“构图:
http://dl.iteye.com/upload/picture/pic/115943/f6e6971a-0216-3fe3-b89c-4ec5b53b762a.jpg
Â
Â
1.SADD 新增元ç´
è¯æ³•åQ?sadd key valueÂ
实践åQ?/p>
redis 127.0.0.1:6379> sadd s1 1
(integer) 1
redis 127.0.0.1:6379> sadd s1 2Â
(integer) 1
redis 127.0.0.1:6379> sadd s2 3Â
(integer) 1
redis 127.0.0.1:6379> sadd s1 1    // é‡å¤æ•°æ®ä¸ä¼šè¢«æ·»åŠ?/p>
(integer) 0
redis 127.0.0.1:6379>
Â
2.SREM åˆ é™¤å…ƒç´
è¯æ³•åQšsrem key valueÂ
实践åQ?/p>
redis 127.0.0.1:6379> smembers s1Â
1) "1"
2) "2"
redis 127.0.0.1:6379> srem s1 1    // åˆ é™¤s1ä¸çš„1å…ƒç´
(integer) 1
redis 127.0.0.1:6379> smembers s1Â
1) "2"
redis 127.0.0.1:6379>Â
Â
3.SMEMBERS 列出所有信æ?¾cÖM¼¼listçš?lrange
è¯æ³•åQšsmembers keyÂ
实践åQ?/p>
redis 127.0.0.1:6379> smembers s1Â
1) "2"
redis 127.0.0.1:6379>Â
Â
Â
4.SISMEMBER åˆ¤æ–æ˜¯å¦å˜åœ¨è¯¥å…ƒç´?/p>
è¯æ³•åQšsismember key valueÂ
1:å˜åœ¨è¯¥å…ƒç´?/p>
0:ä¸å˜åœ?/p>
Â
实践åQ?/p>
redis 127.0.0.1:6379> sismember s1 1  å˜åœ¨çš„å…ƒç´ è¿”å›?
(integer) 1
redis 127.0.0.1:6379> sismember s1 3  ä¸å˜åœ¨çš„å…ƒç´ ˜q”回0
(integer) 0
redis 127.0.0.1:6379>
Â
5.SCARD 计算集åˆä¸å…ƒç´ æ€ÀL•° size
è¯æ³•åQšscard keyÂ
实践åQ?/p>
redis 127.0.0.1:6379> scard s1   // ˜q”回集åˆä¸å…ƒç´ 个æ•?/p>
(integer) 2
redis 127.0.0.1:6379>Â
Â
6.SMOVE ž®†é›†åˆä¸ä¸€ä¸ªå…ƒç´ è{¿UÕdˆ°å¦ä¸€ä¸ªé›†åˆä¸
è¯æ³•: smove  source destination valueÂ
实践åQ?/p>
redis 127.0.0.1:6379> smembers s1Â
1) "1"
2) "2"
redis 127.0.0.1:6379> smembers s2
(empty list or set)
redis 127.0.0.1:6379> smove s1 s2 1   // ž®†S1ä¸çš„1¿UÕdЍåˆîCº†S2ä¸?/p>
(integer) 1
redis 127.0.0.1:6379> smembers s1Â
1) "2"
redis 127.0.0.1:6379> smembers s2
1) "1"
redis 127.0.0.1:6379>
Â
7.SPOP éšæœºå¼¹å‡ºä¸€ä¸ªå…ƒç´?/p>
è¯æ³•åQ?spop keyÂ
实践åQ?/p>
redis 127.0.0.1:6379> smembers s1Â
1) "1"
2) "2"
3) "3"
4) "4"
redis 127.0.0.1:6379> spop s1      // éšæœºå¼¹å‡ºä¸€ä¸ªå…ƒç´?/p>
"3"
redis 127.0.0.1:6379> smembers s1Â
1) "1"
2) "2"
3) "4"
redis 127.0.0.1:6379>Â
Â
8.SRANDMEMBER éšæœºèŽ·å–ä¸€ä¸ªå…ƒç´ ï¼Œä½†æ˜¯ä¸å¼¹å‡ºé›†å?˜q™ä¸ªæ˜¯è·ŸSPOP唯一的区åˆ?/p>
è¯æ³•: SRANDMEMBER
实践åQ?/p>
redis 127.0.0.1:6379> smembers s1Â
1) "1"
2) "2"
3) "4"
redis 127.0.0.1:6379> SRANDMEMBER s1  // Â éšæœºå–得一个数æ®ï¼Œä½†æ˜¯å…ƒç´ ä¸ä¼šä¸¢å¤±
"4"
redis 127.0.0.1:6379> smembers s1Â
1) "1"
2) "2"
3) "4"
redis 127.0.0.1:6379>
Â
9.SINTER å–两个集åˆçš„交集
è¯æ³•åQšSINTER key1 key2Â
实践åQ?/p>
redis 127.0.0.1:6379> smembers s2Â
1) "1"
2) "10"
redis 127.0.0.1:6379> smembers s1Â
1) "1"
2) "2"
3) "4"
redis 127.0.0.1:6379> sinter s1 s2   // 两个集åˆå…±åŒçš„å…ƒç´ æ˜¯ 1Â
1) "1"
redis 127.0.0.1:6379>
Â
10.SINTERSTORE å–两个集åˆçš„交集òq¶ä¿å˜åˆ°å¦ä¸€ä¸ªé›†åˆä¸Â
è¯æ³•åQšSINTERSTORE destination key1 key2Â
实践åQ?/p>
redis 127.0.0.1:6379> smembers s1
1) "1"
2) "2"
3) "3"
redis 127.0.0.1:6379> smembers s2
1) "1"
2) "10"
redis 127.0.0.1:6379> smembers s3         //˜q™ä¸ªæ—¶å€™S3是空çš?/p>
(empty list or set)
redis 127.0.0.1:6379> sinterstore s3  s1 s2    //å–两个的交集òq¶ä¿å˜åˆ°s3 ä¸?/p>
(integer) 1
redis 127.0.0.1:6379> smembers s3
1) "1"
redis 127.0.0.1:6379>
Â
11.SUNION  å–两个集åˆçš„òq‰™›†Â
è¯æ³•åQšSUNION key1 key2Â
实践åQ?/p>
redis 127.0.0.1:6379> smembers s1
1) "1"
2) "2"
3) "3"
redis 127.0.0.1:6379> smembers s2
1) "1"
2) "10"
redis 127.0.0.1:6379> sunion s1 s2        // å–得两个集åˆçš„åÆˆé›?/p>
1) "1"
2) "2"
3) "3"
4) "10"
redis 127.0.0.1:6379>Â
Â
12.SUNIONSTORE å–两个集åˆçš„òq‰™›†òq¶ä¿å˜åˆ°å¦ä¸€ä¸ªé›†åˆä¸Â
è¯æ³•: SUNIONSTORE destination key1 key2 Â
实践åQ?/p>
redis 127.0.0.1:6379> smembers s1
1) "1"
2) "2"
3) "3"
redis 127.0.0.1:6379> smembers s2
1) "1"
2) "10"
redis 127.0.0.1:6379> sunionstore  s4 s1 s2Â
(integer) 4
redis 127.0.0.1:6379> smembers s4
1) "1"
2) "2"
3) "3"
4) "10"
redis 127.0.0.1:6379>Â
Â
13.SDIFF å–两个集åˆçš„差集
è¯æ³•åQšSDIFF key1 key2
实践åQ?/p>
redis 127.0.0.1:6379> smembers s1
1) "1"
2) "2"
3) "3"
redis 127.0.0.1:6379> smembers s2
1) "1"
2) "10"
redis 127.0.0.1:6379> sdiff s1 s2   // 获å–的是两个之间的差é›?/p>
1) "2"
2) "3"
redis 127.0.0.1:6379>Â
Â
14.SDIFFSTORE å–两个集åˆçš„差集 òq¶ä¿å˜åˆ°½W¬ä¸‰ä¸ªé›†åˆä¸
è¯æ³•:SDIFFSTORE key1 key2 diffSet
实践åQ?/p>
redis 127.0.0.1:6379> smembers s1
1) "1"
2) "2"
3) "3"
redis 127.0.0.1:6379> smembers s2
1) "1"
2) "10"
redis 127.0.0.1:6379> sdiffstore s5  s1 s2   // ž®†å·®é›†çš„æ•°æ®ä¿å˜åˆ°s5ä¸Â?/p>
(integer) 2
redis 127.0.0.1:6379> smembers s5
1) "2"
2) "3"
Â
囄¡”»çš„太大了åQŒåªèƒ½æ”¾åœ°å€åQ?/p>
http://dl.iteye.com/upload/picture/pic/115935/8e96f42d-3a7b-3cea-85ae-997496aa9521.jpg
Â
LIST列表的æ“ä½œï¼Œå¯æƒ³è€ŒçŸ¥åQŒå¯¹äºŽåˆ—表我们需è¦çš„具备的功能列è¡?/p>
åŠ å…¥åˆ—è¡¨åQ?/p>
Â ä»Žå¤´éƒ¨åŠ å…? LPUSHÂ
Â ä»Žåº•éƒ¨åŠ å…? RPUSH
弹出列表
 从头部弹� LPOP
 从底部弹� RPOP
截å–å列è¡?  LRANGE
计算列表的长�LLEN
Â
Â
实践åQ?/p>
redis 127.0.0.1:6379> rpush l2 1   // ä»Žåº•éƒ¨æ·»åŠ ä¸€ä¸ªå…ƒç´?/p>
(integer) 1
redis 127.0.0.1:6379> rpush l2 2Â
(integer) 2
redis 127.0.0.1:6379> lrange l2 0 -1 // å±•ç¤ºæ‰€æœ‰çš„å…ƒç´ Â -1 代表所æœ?/p>
1) "1"
2) "2"
redis 127.0.0.1:6379> lpush l2 3Â
(integer) 3
redis 127.0.0.1:6379> lrange l2 0 -1Â
1) "3"
2) "1"
3) "2"
redis 127.0.0.1:6379> lpop l2    // 从头部弹å‡ÞZ¸€ä¸ªå…ƒç´?/p>
"3"
redis 127.0.0.1:6379> rpop l2    // 从尾部弹å‡ÞZ¸€ä¸ªå…ƒç´?/p>
"2"
redis 127.0.0.1:6379> llen l2    // 计算队列的长�/p>
(integer) 1
Â
扩展
1.1 LPUSHX  当且队列å˜åœ¨çš„æƒ…况下 在头部æ’入数æ®Â?/p>
Â
LPUSHX key value
Â
实践åQ?/p>
redis 127.0.0.1:6379> LLEN empty1 Â Â Â Â Â Â
(integer) 0
redis 127.0.0.1:6379> lpushx empty1 hh   // ž®†æ•°æ®æŽ¨å…¥ä¸€ä¸ªç©ºçš„队列,¾l“æžœå¤ÞpÓ|
(integer) 0
redis 127.0.0.1:6379> lpush l3 hhÂ
(integer) 1
redis 127.0.0.1:6379> lpushx l3 hh2    // ž®†æ•°æ®æŽ¨å…¥ä¸€ä¸ªå˜åœ¨çš„队列头部åQŒæˆåŠ?/p>
(integer) 2
redis 127.0.0.1:6379> lrange l3 0 -1Â
1) "hh2"
2) "hh"
Â
1.2 RPUSHX 当且队列å˜åœ¨çš„æƒ…况下 在尾部æ’入数æ? 基本åŒLPUSHX
redis 127.0.0.1:6379> rpushx empty1 hh3   // ž®è¯•ž®†æ•°æ®æŽ¨å…¥ä¸å˜åœ¨é˜Ÿåˆ—的尾部,å¤ÞpÓ|ã€?/p>
(integer) 0
redis 127.0.0.1:6379> rpushx l3 hh3     // ž®†æ•°æ®æŽ¨å…¥å˜åœ¨é˜Ÿåˆ—çš„ž®‘Ö·´åQŒæˆåŠŸã€?/p>
(integer) 3
redis 127.0.0.1:6379> lrange l3 0 -1
1) "hh2"
2) "hh"
3) "hh3"
Â
1.3 BLPOP 对于LPOP的扩å±?åQŒé˜»å¡žå¼çš„èŽ·å–æ•°æ?/p>
BLPOP key [key ...] timeout
Â
它是 LPOP 命ä×o的阻塞版本,当给定列表内没有ä»ÖM½•å…ƒç´ å¯ä¾›å¼¹å‡ºçš„æ—¶å€™ï¼Œ˜qžæŽ¥ž®†è¢« BLPOP 命ä×oé˜Õd¡žåQŒç›´åˆ°ç‰å¾…超时或å‘现å¯å¼¹å‡ºå…ƒç´ 䨓æ¢ã€?/p>
当给定多ä¸?key 傿•°æ—Óž¼ŒæŒ‰å‚æ•?key 的先åŽé¡ºåºä¾‹Æ¡æ£€æŸ¥å„个列表,弹出½W¬ä¸€ä¸ªéž½Iºåˆ—è¡¨çš„å¤´å…ƒç´ ã€?/p>
Â
å‡è®¾çŽ°åœ¨æœ‰ä¸‰ä¸ªé˜Ÿåˆ?job 为空 åQ?command  request ä¸äØ“½I?ã€‚é‚£ä¹ˆå°±å¼€å§‹è½®è®æ‰€æœ‰çš„key åQŒè‹¥æ˜¯ç©ºåQŒåˆ™è·Œ™¿‡ 。执行顺åºäØ“ job ==> command ==> request
Â
实践åQ?/p>
redis 127.0.0.1:6379> del jobÂ
(integer) 0
redis 127.0.0.1:6379> lpush command hhÂ
(integer) 1
redis 127.0.0.1:6379> lpush request kkÂ
(integer) 1
redis 127.0.0.1:6379> blpop job command kkÂ
(error) ERR timeout is not an integer or out of range
redis 127.0.0.1:6379> blpop job command kk  100Â
1) "command"
2) "hh"
redis 127.0.0.1:6379>
Â
查看其是如何é˜Õd¡žçš?/p>
在第一个图片ä¸åQŒä¸Šé¢é‚£ä¸ªç»ˆç«¯ä¸€ç›´é˜»å¡žç€ã€?/p>
Â
在第二个¾lˆç«¯ä¸è¾“入数æ®åŽåQŒä¸Šé¢ç»ˆç«¯å–å¾—æ•°æ®åƈ˜q”回ã€?
Â
1.4 BRPOP 对于rpop的扩展,原ç†åŸºæœ¬åŒBLPOP
Â
2.LREM
è¯æ³•åQšLREM key count value
释义åQšæ ¹æ®å‚æ•?count çš„å€û|¼Œ¿U»é™¤åˆ—表ä¸ä¸Žå‚æ•° value 相ç‰çš„å…ƒç´ ã€?/p>
count 的值å¯ä»¥æ˜¯ä»¥ä¸‹å‡ ç§åQ?/p>
 count > 0 : 从表头开始å‘表尾æœçƒ¦åQŒç§»é™¤ä¸Ž value 相ç‰çš„å…ƒç´ ï¼Œæ•°é‡ä¸?count ã€?/p>
 count < 0 : 从表ž®‘Ö¼€å§‹å‘表头æœçƒ¦åQŒç§»é™¤ä¸Ž value 相ç‰çš„å…ƒç´ ï¼Œæ•°é‡ä¸?count çš„ç»å¯¹å€¹{€?/p>
 count = 0 : ¿U»é™¤è¡¨ä¸æ‰€æœ‰ä¸Ž value 相ç‰çš„倹{€?/p>
Â
实践åQ?/p>
redis 127.0.0.1:6379> lpush l1 helloÂ
(integer) 1
redis 127.0.0.1:6379> lpush l1 worldÂ
(integer) 2
redis 127.0.0.1:6379> lpush l1 helloÂ
(integer) 3
redis 127.0.0.1:6379> lpush l1 worldÂ
(integer) 4
redis 127.0.0.1:6379> lpush l1 helloÂ
(integer) 5
redis 127.0.0.1:6379> lrange l1 0 -1Â
1) "hello"
2) "world"
3) "hello"
4) "world"
5) "hello"
redis 127.0.0.1:6379>            // æ•°æ®å‡†å¤‡å®Œæˆ
Â
redis 127.0.0.1:6379> lrem l1 2 hello    // 从头部开始扫æï¼Œ¿U»é™¤äº†ä¸¤ä¸ªhelloÂ
(integer) 2
redis 127.0.0.1:6379> lrem l1 -1 hello   // 从尾部开始扫æï¼Œ¿U»é™¤äº†ä¸€ä¸ªhello
(integer) 1
redis 127.0.0.1:6379> lrange l1 0 -1    // 现在åªå‰©ä¸?worldäº?/p>
1) "world"
2) "world"
redis 127.0.0.1:6379> lrem l1 0 world   // ¿U»é™¤é˜Ÿä¸æ‰€æœ‰çš„worldÂ
(integer) 2
redis 127.0.0.1:6379> lrange l1 0 -1    // å·²ç»è¢«æ¸…½IÞZº†ã€?/p>
(empty list or set)
redis 127.0.0.1:6379>Â
Â
3.LSET
è¯æ³•åQšLSET key index value
释义åQšå°†åˆ—表 key ä¸‹æ ‡ä¸?index çš„å…ƒç´ çš„å€ÆD®¾¾|®äØ“ value ã€?/p>
实践åQ?/p>
redis 127.0.0.1:6379> lpush l1 helloÂ
(integer) 1
redis 127.0.0.1:6379> lpush l1 worldÂ
(integer) 2
redis 127.0.0.1:6379> lset l1 1  ---    // ä¸‹æ ‡ä¸?的数æ®è¢«æ›¿æ¢æˆ?--- äº?/p>
OK
redis 127.0.0.1:6379> lrange l1 0 -1
1) "world"
2) "---"
redis 127.0.0.1:6379> lset l1 3 hh    // ‘…å‡ºä¸‹æ ‡˜q›è¡Œè®„¡½®çš„è¯åQŒæŠ¥é”?/p>
(error) ERR index out of range
redis 127.0.0.1:6379> exist l2Â
(error) ERR unknown command 'exist'
redis 127.0.0.1:6379> exists l2      // 对ä¸å˜åœ¨çš„队列进行设¾|®çš„è¯ï¼ŒæŠ¥é”™
(integer) 0
redis 127.0.0.1:6379> lset l2 0 hhÂ
(error) ERR no such key
redis 127.0.0.1:6379>Â
Â
Â
4 LTRIM
è¯æ³•åQšLTRIM key start stop
释义åQšå¯¹ä¸€ä¸ªåˆ—表进行修å‰?trim)åQŒå°±æ˜¯è¯´åQŒè®©åˆ—表åªä¿ç•™æŒ‡å®šåŒºé—´å†…çš„å…ƒç´ ï¼Œä¸åœ¨æŒ‡å®šåŒºé—´ä¹‹å†…çš„å…ƒç´ éƒ½ž®†è¢«åˆ 除ã€?/p>
 ‘…å‡ºèŒƒå›´çš„ä¸‹æ ‡å€ég¸ä¼šå¼•起错误ã€?/p>
 如果 start ä¸‹æ ‡æ¯”åˆ—è¡¨çš„æœ€å¤§ä¸‹æ ?end ( LLEN list å‡åŽ» 1 )˜q˜è¦å¤§ï¼Œæˆ–è€?start > stop åQ?LTRIM ˜q”回一个空列表(å› äØ“ LTRIM 已绞®†æ•´ä¸ªåˆ—表清½I?ã€?/p>
 如果 stop ä¸‹æ ‡æ¯?end ä¸‹æ ‡˜q˜è¦å¤§ï¼ŒRedisž®?stop çš„å€ÆD®¾¾|®äØ“ endÂ
Â
实践åQ?/p>
redis 127.0.0.1:6379> lrange l1 0 -1   // æ–°å¾ä¸€ä¸ªé˜Ÿåˆ—Â?/p>
1) "h"
2) "e"
3) "l"
4) "l"
5) "o"
redis 127.0.0.1:6379> ltrim l1 0 3   // åªæˆªå–å‰å››ä¸ªÂ
OK
redis 127.0.0.1:6379> lrange l1 0 -1
1) "h"
2) "e"
3) "l"
4) "l"
redis 127.0.0.1:6379> ltrim l1 0 10   // stopä¸‹æ ‡å¤§äºŽé˜Ÿåˆ—é•¿åº¦ åˆ?stop=队列长度
OK
redis 127.0.0.1:6379> lrange l1 0 -1
1) "h"
2) "e"
3) "l"
4) "l"
redis 127.0.0.1:6379> lset l1 10 20  // start stop 都大�队列长度 �start < stop 清空队列
(empty list or set)
redis 127.0.0.1:6379> ltrim l1 3 1   // start  < stop 清空队列
OK
redis 127.0.0.1:6379> lrange l1 10 20Â
(empty list or set)
Â
5.LINDEX
è¯æ³•åQšLINDEX key index
释义åQšè¿”回列è¡?key ä¸ï¼Œä¸‹æ ‡ä¸?index çš„å…ƒç´ ã€?/p>
Â ä¸‹æ ‡(index)傿•° start å’?stop 都以 0 为底åQŒä¹Ÿž®±æ˜¯è¯ß_¼Œä»?0 è¡¨ç¤ºåˆ—è¡¨çš„ç¬¬ä¸€ä¸ªå…ƒç´ ï¼Œä»?1 è¡¨ç¤ºåˆ—è¡¨çš„ç¬¬äºŒä¸ªå…ƒç´ åQŒä»¥æ¤ç±»æŽ¨ã€?/p>
Â ä½ ä¹Ÿå¯ä»¥ä½¿ç”¨è´Ÿæ•°ä¸‹æ ‡åQŒä»¥ -1 表示列表的最åŽä¸€ä¸ªå…ƒç´ , -2 表示列表的倒数½W¬äºŒä¸ªå…ƒç´ ,以椾cÀLލã€?/p>
Â
实践åQ?/p>
redis 127.0.0.1:6379> lpush l1 1Â
(integer) 1
redis 127.0.0.1:6379> lpush l1 2
(integer) 2
redis 127.0.0.1:6379> lpush l1 3
(integer) 3
redis 127.0.0.1:6379> lindex l1 0       // å–ä¸‹æ ‡äØ“0的数æ?/p>
"3"
redis 127.0.0.1:6379> lrange l1 0 -1Â
1) "3"
2) "2"
3) "1"
redis 127.0.0.1:6379> lindex l1 -1      // å–æœ€åŽä¸€ä¸ªæ•°æ?/p>
"1"
redis 127.0.0.1:6379>Â
Â
6. LINSERT  ¾cÖM¼¼äºŽLSET,一个是æ ÒŽ®ä¸‹æ ‡æ¥æ’入,一个是æ ÒŽ®pivotæ¥æ’入数æ®ã€?/p>
è¯æ³•åQšLINSERT key BEFORE|AFTER pivot value
释义åQšå°†å€?value æ’入到列è¡?key 当ä¸åQŒä½äºŽå€?pivot 之剿ˆ–之åŽã€?/p>
 å½?pivot ä¸å˜åœ¨äºŽåˆ—表 key æ—Óž¼Œä¸æ‰§è¡Œä“Q何æ“作ã€?/p>
 å½?key ä¸å˜åœ¨æ—¶åQ?key 被视为空列表åQŒä¸æ‰§è¡Œä»ÖM½•æ“作ã€?/p>
 如果 key 䏿˜¯åˆ—表¾cÕdž‹åQŒè¿”回一个错误ã€?/p>
Â
实践åQ?/p>
redis 127.0.0.1:6379> lrange l1 0 -1Â
1) "redis"
2) "hello"
3) "world"
4) "hello"
redis 127.0.0.1:6379> linsert l1 after hello after-insert      // 在第一个找到的helloåŽé¢æ’入了一个数æ®Â?/p>
(integer) 5
redis 127.0.0.1:6379> lrange l1 0 -1Â
1) "redis"
2) "hello"
3) "after-insert"
4) "world"
5) "hello"
redis 127.0.0.1:6379> linsert l1 before hello before-insert    // 在第一个找到的helloå‰é¢æ’入了一个数æ®Â?/p>
(integer) 6
redis 127.0.0.1:6379> lrange l1 0 -1Â
1) "redis"
2) "before-insert"
3) "hello"
4) "after-insert"
5) "world"
6) "hello"
redis 127.0.0.1:6379> linsert l1 before hoho before-insert    // 对于 pivot ä¸å˜åœ¨çš„列表åQŒæ’入失è´?/p>
(integer) -1
redis 127.0.0.1:6379> lrange l1 0 -1Â
1) "redis"
2) "before-insert"
3) "hello"
4) "after-insert"
5) "world"
6) "hello"
redis 127.0.0.1:6379> linsert l2 before hoho before-insert    // æ’入一个空列表åQŒç›´æŽ¥æŠ¥é”?/p>
(integer) 0
Â
7. RPOPLPUSHÂ
è¯æ³•åQšRPOPLPUSH source destination
释义åQ?/p>
命ä×o RPOPLPUSH åœ¨ä¸€ä¸ªåŽŸåæ—¶é—´å†…åQŒæ‰§è¡Œä»¥ä¸‹ä¸¤ä¸ªåŠ¨ä½œï¼š
 ž®†åˆ—è¡?source ä¸çš„æœ€åŽä¸€ä¸ªå…ƒç´?ž®‘Ö…ƒç´?弹出åQŒåƈ˜q”回¾l™å®¢æˆïL«¯ã€?/p>
 ž®?source å¼¹å‡ºçš„å…ƒç´ æ’入到列表 destination åQŒä½œä¸?destination åˆ—è¡¨çš„çš„å¤´å…ƒç´ ã€?/p>
举个例ååQŒä½ 有两个列è¡?source å’?destination åQ?source 列表有元ç´?a, b, c åQ?destination 列表有元ç´?x, y, z åQŒæ‰§è¡?RPOPLPUSH source destination 之åŽåQ?source 列表包å«å…ƒç´ a, b åQ?destination 列表包å«å…ƒç´ c, x, y, z åQŒåƈ且元ç´?c 会被˜q”回¾l™å®¢æˆïL«¯ã€?/p>
 如果 source ä¸å˜åœ¨ï¼Œå€?nil 被返回,òq¶ä¸”䏿‰§è¡Œå…¶ä»–动作ã€?/p>
 如果 source å’?destination 相åŒåQŒåˆ™åˆ—表ä¸çš„è¡¨å°¾å…ƒç´ è¢«ç§»åŠ¨åˆ°è¡¨å¤´åQŒåƈ˜q”å›žè¯¥å…ƒç´ ï¼Œå¯ä»¥æŠŠè¿™¿U特ŒDŠæƒ…况视作列表的旋è{(rotation)æ“作ã€?/p>
Â
实践åQ?/p>
redis 127.0.0.1:6379> lrange l1 0 -1Â
1) "c"
2) "b"
3) "a"
redis 127.0.0.1:6379> lrange l2 0 -1
1) "3"
2) "2"
3) "1"
redis 127.0.0.1:6379> rpoplpush l1 l2   //ž®†l1ž®ùNƒ¨çš„æ•°æ®å¼¹å‡ø™¿›å…¥l2的头éƒ?òq¶å°†˜q™ä¸ªå¼¹å‡ºçš„æ•°æ®è¿”å›?/p>
"a"
redis 127.0.0.1:6379> lrange l1 0 -1Â
1) "c"
2) "b"
redis 127.0.0.1:6379> lrange l2 0 -1Â
1) "a"
2) "3"
3) "2"
4) "1"
redis 127.0.0.1:6379>
Â
8. BRPOPLPUSHÂ
è¯æ³•åQšBRPOPLPUSH source destination timeout
释义åQšBRPOPLPUSH æ˜?RPOPLPUSH 的阻塞版本,当给定列è¡?source ä¸äØ“½Iºæ—¶åQ?BRPOPLPUSH 的表现和 RPOPLPUSH ä¸€æ —÷€?/p>
  当列è¡?source 为空æ—Óž¼Œ BRPOPLPUSH 命ä×ož®†é˜»å¡žè¿žæŽ¥ï¼Œç›´åˆ°½{‰å¾…‘…æ—¶åQŒæˆ–有å¦ä¸€ä¸ªå®¢æˆïL«¯å¯?source 执行 LPUSH æˆ?RPUSH 命ä×o为æ¢ã€?/p>
  ‘…æ—¶å‚æ•° timeout 接å—一个以¿U’䨓å•ä½çš„æ•°å—作为倹{€‚è¶…æ—¶å‚æ•°è®¾ä¸?0 表示é˜Õd¡žæ—‰™—´å¯ä»¥æ— 陿œŸåšgé•?block indefinitely) ã€?/p>
Â
实践åQ?/p>
我们讄¡½®½{‰è¶…æ—¶æ—¶é—´äØ“1000Â
Â
在å¦ä¸€ä¸ªå®¢æˆïL«¯æ·ÕdŠ æ•°æ®åŽï¼Œž®Þp{¿UÖMº†æ•°æ®
Â
Â
Â
NOSQLçš„å¦ä¹ 笔讎ͼš
1.最基本的命�/p>
ç›æ€¿¡æ‰€æœ‰çš„NOSQL都会æä¾›äº†å‘½ä»¤ï¼šGET SET DELÂ
--------------------------------------
redis 127.0.0.1:6379> set ee 10Â
OK
redis 127.0.0.1:6379> get eeÂ
"10"
redis 127.0.0.1:6379> del ee        // ˜q”回å€?1:代表æ£ç¡® 0åQšä»£è¡¨é”™è¯?/p>
(integer) 1
redis 127.0.0.1:6379> get ee Â
(nil)
redis 127.0.0.1:6379>
--------------------------------------
Â
del key1 key2 key3  //å¯åˆ 除多个key
Â
Â
扩展åQ?/p>
1.1 SETNX:讄¡½®ä¸€ä¸ªå€û|¼Œå¦‚æžœä¸å˜åœ¨çš„è¯?å·²ç»å˜åœ¨åˆ™ä¸æ–°å¢ž.对于SET的扩展ã€?/p>
--------------------------------------
redis 127.0.0.1:6379> set ee 10Â
OK
redis 127.0.0.1:6379> setnx ee 20Â
(integer) 0
redis 127.0.0.1:6379> get ee       // å› äØ“ä¹‹å‰å˜åœ¨ee  所以eeçš„å€¼åÆˆæ²¡æœ‰å‘生å˜åŒ–ã€?/p>
"10"
redis 127.0.0.1:6379> setnx aa 20     //  aa 之å‰ä¸å˜åœ¨ï¼Œæ‰€ä»¥è®¾¾|®æˆåŠŸï¼
(integer) 1
redis 127.0.0.1:6379> get aaÂ
"20"
redis 127.0.0.1:6379>Â
--------------------------------------
Â
1.2 SETEX 讄¡½®˜q‡æœŸæ—‰™—´åQŒå¯¹äºŽSET的扩展。若是已¾lå˜åœ¨ï¼Œä¼šè¦†ç›–原æ¥çš„倹{€?/p>
è¯æ³•:
SETEX key seconds value
Â
è¦æ±‚版本åQ?gt;= 2.0.0
Â
实践åQ?/p>
--------------------------------------
redis 127.0.0.1:6379> setex ee 10 20Â
OK
redis 127.0.0.1:6379> get eeÂ
"20"
redis 127.0.0.1:6379> ttl eeÂ
(integer) 4
redis 127.0.0.1:6379> ttl eeÂ
(integer) 2
redis 127.0.0.1:6379> ttl eeÂ
(integer) -1
redis 127.0.0.1:6379> get eeÂ
(nil)
redis 127.0.0.1:6379>Â
--------------------------------------
Â
é™åˆ¶åQ?/p>
½{‰åŒäºŽä¸€ä¸‹è¯å¥ï¼Œä¸è¿‡æ˜¯ä¸€ä¸ªåŽŸåæ€§çš„æ“ä½œåQŒå¾ˆé€‚åˆåšç¼“å˜ä‹É用ã€?/p>
SET key value
EXPIRE key seconds  # 讄¡½®ç”Ÿå˜æ—‰™—´
Â
1.3 PSETEX  对于 SETEX的冋ơ扩展,唯一的区别是以毫¿U’䨓å•ä½åQŒä¸æ˜¯ä»¥¿U’䨓å•ä½
è¯æ³•åQ?/p>
PSETEX key milliseconds value
Â
è¦æ±‚版本åQ?gt;= 2.6.0
实践åQ?/p>
--------------------------------------
redis 127.0.0.1:6379> setex ee 10 20Â
OK
redis 127.0.0.1:6379> get eeÂ
"20"
redis 127.0.0.1:6379> ttl eeÂ
(integer) 4
redis 127.0.0.1:6379> ttl eeÂ
(integer) 2
redis 127.0.0.1:6379> ttl eeÂ
(integer) -1
redis 127.0.0.1:6379> get eeÂ
(nil)
redis 127.0.0.1:6379>Â
--------------------------------------
Â
1.4 MGET , MSET
获å–多个值或是设¾|®å¤šä¸ªå€¹{€?/p>
Â
MSET åQšæ›¿æ¢æ—§å€û|¼ŒåŽŸåæ“ä½œã€?/p>
Â
实践åQ?/p>
--------------------------------------
redis 127.0.0.1:6379> mset key1 haha key2 heheÂ
OK
redis 127.0.0.1:6379> mget key1 key2Â
1) "haha"
2) "hehe"
redis 127.0.0.1:6379>Â
--------------------------------------
Â
1.5 MSETNX åQšè®¾¾|®å¤šä¸ªkey value,仅当keyå˜åœ¨æ—?Â
MSETNX key value [key value ...]Â
既然有setnx ž®×ƒ¼šæœ?˜q™ä¸ªå‘½ä×o
Â
实践åQ?/p>
--------------------------------------
redis 127.0.0.1:6379> msetnx key1 hehe key3 hoho        //å› äØ“˜q™æ˜¯ä¸€ä¸ªåŽŸåçš„æ“作åQŒæ‰€ä»¥key1å·²ç»å˜åœ¨åQŒæ‰€ä»¥æ•´ä½“失败了åQ?/p>
(integer) 0
redis 127.0.0.1:6379> mget key1 key2 key3           // 找ä¸åˆ°æ‰€è¦çš„key3
1) "haha"
2) "hehe"
3) (nil)
redis 127.0.0.1:6379>Â
--------------------------------------
Â
1.6 GETSET
GETSET key value 讄¡½®ä¸€ä¸ªkeyçš„valueåQŒåƈ获å–讄¡½®å‰çš„å€?。相当于é‡ç½®åŠŸèƒ½ã€?/p>
Â
Â
实践åQ?/p>
--------------------------------------
redis 127.0.0.1:6379> incrby count 10Â
(integer) 10
redis 127.0.0.1:6379> getset count "5"   // ˜q™ä¸ªæ—¶å€™è¿”回的æ˜?0åQŒä¸æ˜?
"10"
redis 127.0.0.1:6379> get countÂ
"5"
redis 127.0.0.1:6379>Â
--------------------------------------
有时我们需è¦èŽ·å–计数器的å€û|¼Œòq¶ä¸”自动ž®†å…¶é‡ç½®ä¸?
Â
1.7 GETRANGE 获å–å˜å‚¨åœ¨ä¸€ä¸ªå…³é”®çš„一个åå—符ä¸?/p>
Â
实践åQ?/p>
--------------------------------------
redis 127.0.0.1:6379> set longworld "hello world!"
OK
redis 127.0.0.1:6379> getrange  longworld 0 5Â
"hello "
redis 127.0.0.1:6379> getrange longworld -6 -1Â
"world!"
redis 127.0.0.1:6379>Â
redis 127.0.0.1:6379> getrange longworld 5 100   // ‘…出范围的数æ®åªå–最åŽä½
" world!"
--------------------------------------
Â
1.8 SETRANGE ¾cÖM¼¼äºŽGETRANGE 覆盖在指定的åç§»é‡å¼€å§‹çš„关键å—符串的一部分
Â
实践åQ?/p>
--------------------------------------
redis 127.0.0.1:6379> setrange longworld 6 "redis"
(integer) 12
redis 127.0.0.1:6379> get longworldÂ
"hello redis!"
redis 127.0.0.1:6379>Â
--------------------------------------
Â
1.9 STRLEN  计算长度
è¯æ³•åQ?/p>
STRLEN keyÂ
Â
实践åQ?/p>
--------------------------------------
redis 127.0.0.1:6379> strlen longworldÂ
(integer) 12
--------------------------------------
Â
1.10 append ˜q½åŠ æ•°æ® åQŒsetrange是截å–å—½W?/p>
è¯æ³•åQ?/p>
append key str
Â
实践åQ?/p>
--------------------------------------
redis 127.0.0.1:6379> append longworld "!!!"
(integer) 15
redis 127.0.0.1:6379> get longworldÂ
"hello redis!!!!"
--------------------------------------
Â
Â
3.INCR :对于一个数值åšé€’增åQŒæ¥ä¼æ˜¯1ã€?/p>
é™åˆ¶åQ?/p>
åªå…è®¸å¯¹äºŽæ•°å€¼ç±»åž‹åšæ“作åQŒè‹¥æ˜¯å—½W¦ä¸²¾cÕdž‹åˆ™æŠ¥é”™ã€?/p>
Â
是妾U¿ç¨‹å®‰å…¨åQšæ˜¯çš„ï¼Œæ˜¯ä¸€ä¸ªåŽŸåæ“ä½œï¼Œä¸ç”¨æ‹…心多线½E‹åƈå‘修改åŒä¸€ä¸ªå€¼å¾—问题ã€?/p>
å³ä¸ä¼šå‡ºçŽîC¸€ä¸‹æƒ…况:
--------------------------------------
  Client A reads count as 10.
  Client B reads count as 10.
  Client A increments 10 and sets count to 11.
  Client B increments 10 and sets count to 11.
--------------------------------------
Â
è‹¥æ˜¯å¸Œæœ›é€’å¢žçš„é¢‘çŽ‡ä¸æ˜?呢,那么使用INCRBYÂ
--------------------------------------
redis 127.0.0.1:6379> set ee 10Â
OK
redis 127.0.0.1:6379> incrby ee 2   // ½W¬ä¸‰ä¸ªå‚数是æ¥é¢‘
(integer) 12
redis 127.0.0.1:6379> get eeÂ
"12"
--------------------------------------
Â
扩展åQ?/p>
INCR &&INCRBY 对应的命令是 DECR åQŒDECRBY
Â
4.如何讄¡½®ä¸€ä¸ªkey的过期时间呢åQ?/p>
½Ž€å•,通过 EXPIREæ¥è®¾¾|®ï¼Œé€šè¿‡TTL命ä×o查看ã€?/p>
--------------------------------------
redis 127.0.0.1:6379> set ee 10
OK
redis 127.0.0.1:6379> expire ee 10      // 讄¡½®˜q‡æœŸæ—‰™—´ä¸?0¿U?/p>
(integer) 1
redis 127.0.0.1:6379> ttl ee
(integer) 8
redis 127.0.0.1:6379> ttl ee
(integer) 3
redis 127.0.0.1:6379> ttl ee         // 已绘q‡æœŸäº†ã€?/p>
(integer) -1
redis 127.0.0.1:6379> get ee         // å·²ç»å–ä¸åˆ°å€égº† Â
(nil)
redis 127.0.0.1:6379> Â Â Â Â Â Â Â Â Â
--------------------------------------
Â
若是ä¸è®¾¾|®expire åQŒåªæ˜¯set 一个值åŽåQŒå†é€šè¿‡ttl 查看 ˜q”回¾l“æžœæ˜?-1 åQŒä»£è¡¨æ°¸˜qœä¸˜q‡æœŸã€?/p>
--------------------------------------
redis 127.0.0.1:6379> set ee 10Â
OK
redis 127.0.0.1:6379> ttl eeÂ
(integer) -1
redis 127.0.0.1:6379> get eeÂ
"10"
--------------------------------------
Â
一个整体结构图åQ?/p>
囑֤ªå¤?˜q˜æ˜¯è‡ªå·±è´´åœ°å€å§ï¼š
http://dl.iteye.com/upload/picture/pic/115893/840bfd7b-765e-3884-8253-0c7b3ec9db4c.jpg
Â
Â
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
如椞®±å·²¾l安装完æˆäº†åQŒå½“然也å¯ä»¥é‡‡ç”¨make testæ¥çœ‹çœ‹å®‰è£…æ˜¯å¦æ£¼‹®ã€?/p>
Â
基本常用命ä×oåQ?/p>
redis-server åQšè¿è¡Œä¸€ä¸ªredisserver
redis-cli :redis命ä×oè¡Œç‰ˆæœ¬çš„å®¢æˆ·ç«¯ï¼ŒåŒæœ¬åœ°æˆ–是远½E‹redisæœåŠ¡˜q›è¡Œäº¤äº’
redis-benchmark : ‹‚€æŸ¥redisæœåŠ¡æ€§èƒ½çš„å‘½ä»?/p>
redis-check-aof and redis-check-dump are useful in the rare event of corrupted data files.
Â
若是在make的时候没有将redis-serveråQŒredis-cli拯‚´åˆ?usr/local/bin目录下,那么手工拯‚´ä¸‹ã€?/p>
Â
sudo cp redis-server /usr/local/bin/
sudo cp redis-cli /usr/local/bin/
Â
2.å¯åЍredis
inter12@inter12-VirtualBox:~$ redis-server
[2233] 27 Jun 09:23:04 # Warning: no config file specified, using the default config. In order to specify a config file use 'redis-server /path/to/redis.conf'
[2233] 27 Jun 09:23:04 * Server started, Redis version 2.4.15
[2233] 27 Jun 09:23:04 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
[2233] 27 Jun 09:23:04 * DB loaded from disk: 0 seconds
[2233] 27 Jun 09:23:04 * The server is now ready to accept connections on port 6379
[2233] 27 Jun 09:23:04 - DB 0: 1 keys (0 volatile) in 4 slots HT.
[2233] 27 Jun 09:23:04 - 0 clients connected (0 slaves), 717624 bytes in use
Â
ä¸å¸¦ä»ÖM½•傿•°çš„æƒ…况,采用的是默认的酾|®æ–‡ä»¶ã€‚这个åªé€‚用于开å‘环境,生æˆçŽ¯å¢ƒéœ€è¦è‡ªå·±åˆ¶å®šä¸€ä¸ªé…¾|®æ–‡ä»¶ã€‚具体命令是åQ?redis-server /etc/redis.confÂ
Â
3.‹‚€æŸ¥redisæ˜¯å¦æ£å¸¸å·¥ä½œ
inter12@inter12-VirtualBox:~$ redis-cli ping
PONG
Â
˜q”回PONGž®×ƒ»£è¡¨æ˜¯OKçš„ã€?/p>
Â
4.redis的常用命�/strong>
redis 127.0.0.1:6379> set haha 'zhaoming'
OK
redis 127.0.0.1:6379> get haha
"zhaoming"
Â
所有完整的命ä×oå¯è§:
http://redis.readthedocs.org/en/latest/
Â
˜q˜æœ‰æ‰€æœ‰å¯ç”¨å®¢æˆïL«¯åQ?/p>
http://redis.io/clients
Â
5.redisçš„æŒä¹…化
å› äØ“æ˜¯å†…å˜åž‹çš„NOSQLåQŒæœ‰ä¸¤ç§æ–¹å¼ã€?.使用save命ä×oåQŒä¼šž®†æ•°æ®åˆ·æ–°åˆ°æ–‡äšgä¸ã€?.采用redis-cli shutdown 会将内å˜ä¸æ•°æ®åˆ·æ–°åˆ°æ–‡äšgä¸?/p>
更详¾l†çš„å¯è§åQ?/p>
http://redis.io/topics/persistence
Â
6.æ£ç¡®çš„部¾|²redis
1.采用界é¢éƒ¨çÖv
2.在linux上,采用一个åˆå§‹åŒ–脚本部çÖv(更推èè¿™¿U?
Â
如何采用½W¬äºŒ¿U进行部¾|²å‘¢ã€?/p>
s1)建立é…置文äšgåŠæ•°æ®æ–‡ä»¶ç›®å½?/p>
mkdir /etc/redisÂ
mkdir /var/redisÂ
Â
s2)ž®†åˆå§‹åŒ–脚本攑ֈ°/etc/init.d目录ä¸?òq¶å¾è®®æ ¹æ®ç«¯å£å·˜q›è¡Œæ–‡äšg命å
cp /home/inter12/install/soft/redis/redis-stable/utils/redis_init_script /etc/init.d/redis_6379
¾~–辑 /etc/init.d/redis_6379 åQŒç¡®ä¿ç«¯å£æ˜¯ä½ 想讄¡½®çš„ã€?/p>
Â
s3)拯‚´redis.confåˆ?/etc/redis目录ä¸?/p>
sudo cp /home/inter12/install/soft/redis/redis-stable/redis.conf /etc/redis/6379.conf
Â
s4)åœ?var/redis目录下å¾ç«‹ä¸€ä¸ªredis实例对应的目å½?/p>
mkdir /var/redis/6379Â
Â
s5)修改é…置文äšg
讄¡½®daemonize 为yes(默认是no)
讄¡½®pidfile åˆ?/var/run/redis_6379.pid(å¯ä»¥æ”¹å˜ç«¯å£)
讄¡½®æ—¥å¿—¾U§åˆ«loglevel
讄¡½®logfile åˆ?/var/log/redis_6379.log
讄¡½® dir åˆ?/var/redis/6379 (˜q™ä¸ªæ˜¯æœ€é‡è¦çš?
Â
s6)æœ€åŽæ·»åŠ åˆå§‹åŒ–é…置文äšg到所有è¿è¡Œçñ”别下
sudo update-rc.d redis_6379 defaults  // 告诉¾pÈ»Ÿå¯åŠ¨æ—¶å€™ï¼Œè‡ªåŠ¨æ‰§è¡Œredis_6379˜q™ä¸ªè„šæœ¬ã€?/p>
Â
如椞®±æžå®šäº†æ‰€æœ‰é…¾|®ä¿®æ”¹å·¥ä½œï¼Œž®±å¯ä»¥å¦‚æ¤å¯åŠ¨äº†åQ?/p>
/etc/init.d/redis_6379 start
Â
通过以下方弼‹®ä¿˜q行æˆåŠŸåQ?/p>
通过 redis-cli ž®è¯•˜qžæŽ¥
˜q行 redis-cli åQŒç„¶å?save ‹‚€æŸ¥æ˜¯å¦ç”Ÿæˆä¸€ä¸ªæ•°æ®æ–‡ä»¶åˆ° /var/redis/6379/目录下ã€?(应该能找åˆîC¸€ä¸?dump.rdbæ–‡äšg).
‹‚€æŸ¥æ˜¯å¦åœ¨ /var/redis/6379/ç›®å½•ä¸‹ç”Ÿæˆæ–‡ä»?/p>
é‡å¯åŽï¼Œå†æ¬¡‹‚€æŸ¥ä»¥ä¸Šæ¥éª¤ã€?/p>
已有 0 人å‘表留a€åQŒçŒ›å‡?>>˜q™é‡Œ<<-å‚与讨论
ITeye推è
åˆ†äØ“ server  + clientÂ
Â
server的安装:
Â
1.æ·ÕdŠ Â deb http://www.rabbitmq.com/debian/ testing main åˆ?/etc/apt/sources.list
Â
2.apt-get update.
Â
3.sudo apt-get install rabbitmq-server
˜q™ä¸ªæ¥éª¤ä¼šè‡ªåЍå¯åŠ¨Â rabbitmq-server æœåŠ¡ã€?/p>
Â
常用命ä×oåQ?/p>
Â
rabbitmqctl -hÂ
rabbitmqctl statusÂ
rabbitmqctl stop
rabbitmqctl start_app
Â
Â
客户端安装:
maven:
<dependency>
 <groupId>com.rabbitmq</groupId>
 <artifactId>amqp-client</artifactId>
 <version>2.8.4</version>
</dependency>
Â
或是下è²é“¾æŽ¥åQ?/p>
wget http://www.rabbitmq.com/releases/rabbitmq-java-client/v2.8.4/rabbitmq-java-client-bin-2.8.4.tar.gz
Â
客户端编ç ?--å‘é€è€…:
Â
package com.jieting.mq.rabbit.send; import java.io.IOException; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; public class MessageSend { private static final String QUENE_NAME = "hello"; public static void main(String[] args) throws IOException { ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost("localhost"); Connection newConnection = connectionFactory.newConnection(); Channel createChannel = newConnection.createChannel(); createChannel.queueDeclare(QUENE_NAME, true, false, false, null); String message = "hello rabbitmq world!"; createChannel.basicPublish("", QUENE_NAME, null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); createChannel.close(); newConnection.close(); } }
Â
消费者代ç :
Â
package com.jieting.mq.rabbit.receive; import java.io.IOException; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.ConsumerCancelledException; import com.rabbitmq.client.QueueingConsumer; import com.rabbitmq.client.ShutdownSignalException; public class MessageReceive { private static final String QUENE_NAME = "hello"; public static void main(String[] args) throws IOException, ShutdownSignalException, ConsumerCancelledException, InterruptedException { ConnectionFactory connectionFactory = new ConnectionFactory(); Connection newConnection = connectionFactory.newConnection(); Channel createChannel = newConnection.createChannel(); createChannel.queueDeclare(QUENE_NAME, true, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); QueueingConsumer queueingConsumer = new QueueingConsumer(createChannel); createChannel.basicConsume(QUENE_NAME, true, queueingConsumer); while (true) { QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery(); String message = new String(delivery.getBody()); System.out.println(" [x] Received '" + message + "'"); } } }
Â
以上资料都å¯ä»?ä¸€ä¸‹åœ°å€æ‰‘Öˆ°åQ?/p>
http://www.rabbitmq.com/java-client.html
http://www.rabbitmq.com/getstarted.html
Â