Redis上踩過的一些坑-美團

y139733 8年前發布 | 318K 次閱讀 Redis NoSQL數據庫

來自: http://blog.csdn.net//chenleixing/article/details/50530419


上上周和同事(龍哥)參加了360組織的互聯網技術訓練營第三期,美團網的DBA負責人侯軍偉給大家介紹了美團網在redis上踩得一些坑,講的都是干貨和坑。

    分為5個部分:

   二、redis bgrewriteaof問題

   三、redis內存占用飆升

   四、redis內存使用優化 

   五、redis cluster遇到的一些問題 

 

 一、周期性出現connect timeout

1. 背景:
      大部分互聯網公司都會有Mysql或者Oracle的DBA,但是在Nosql方面一般不會設置專門的DBA。不過對于一些知名的互聯網公司來說,Nosql的使用量是巨大的,所以通常讓Mysql的DBA或者單獨聘請工程師來維護一些Nosql數據庫,比如:
      Redis, Hbase, Memcache(其實嚴格講不是nosql), Mongodb, Cassandra。從講座看美團網應該是有專職的Redis DBA。所以作為業務開發人員不需要自己安裝、配置、運維Redis,只需要找Redis DBA來申請就可以了。
      這里為了簡化說明:Redis DBA提供的服務叫做Redis云,業務開發人員叫做業務端(redis的使用者)
     
   2. 現象:
       業務端在使用redis云提供的redis服務后,經常出現connect timeout:
Java代碼    收藏代碼
  1. redis.clients.jedis.exceptions.JedisConnectionException  
  2. java.net.SocketException  
  3. java.net.SocketTimeoutException:connect time out  
   
   3. 分析和懷疑:
   業務端一般認為redis出現問題,就是redis云有問題,人的“正常”思維:看別人錯誤容易,發現自己難,扯多了, 出現這個有很多原因:
   (1). 網絡原因:比如是否存在跨機房、網絡割接等等。
   (2). 慢查詢,因為redis是單線程,如果有慢查詢的話,會阻塞住之后的操作。 
   (3). value值過大?比如value幾十兆,當然這種情況比較少,其實也可以看做是慢查詢的一種
   (4). aof重寫/rdb fork發生?瞬間會堵一下Redis服務器。
   (5). 其他..................
 
   4. 查詢原因
   演講者一開始懷疑是網絡問題,但是并未發現問題,觀察各種對比圖表,tcp listenOverFlow和timeout經常周期出現。(贊一下這個監控,我們監控現在還沒有這個層面的)
   有關listenOverFlow:
查看現有的連接數是否大于設置的backlog,如果大于就丟棄,并相應的參數值加1。其中backlog是由程序和系統參數net.core.somaxconn共同設置,當backlog的值大于系統設置的net.core.somaxconn時則取net.core.somaxconn的值,否則取程序設置的backlog值。這種出錯的方式也被記錄在TcpListenOverflows中(其只記錄了連接個數不足而產生溢出錯誤的次數!)。
   覺得可能和TCP相關,于是分析了Tcp三次握手:最后一次握手客戶端的請求會進入服務器端的一個隊列(可以認為是下三圖)中,如果這個隊列滿了,就會發生上面的異常。(accept)
  (1) TCP三次握手: 
  
  (2) redis客戶端與redis服務器交互的過程(本質就是TCP請求)
  (3) I/O 多路復用程序通過隊列向文件事件分派器傳送套接字的過程
   
   (4) 和redis有什么關系呢?
        由于Redis的單線程模型(對命令的處理和連接的處理都是在一個線程中),如果存在慢查詢的話,會出現上面的這種情況,造成新的accept的連接進不了隊列。
   
    如果上面的圖沒法理解的話,看看這張圖:
     
 
   5. 解決方法:
    (1) 對慢查詢進行持久化,比如定時存放到mysql之類。(redis的慢查詢只是一個list,超過list設置的最大值,會清除掉之前的數據,也就是看不到歷史)
    (2) 對慢查詢進行報警(頻率、數量、時間)等等因素
    (3) 打屁股,哈哈:
    
     (4) 其實應該做的是:對業務端進行培訓,告訴他們一下redis開發的坑,redis不是萬金油,這個和Mysql DBA要培訓Mysql使用者一樣,否則防不勝防。
      比如他執行了 monitor, keys *, flushall, drop table, update table set a=1; 這種也是防不勝防的( 當然也可以做限制,利用rename-command一個隨機數),但是提高工程師的水平才是關鍵。
     
 

 二、redis bgrewriteaof問題

一、背景

1. AOF:

    Redis的AOF機制有點類似于Mysql binlog,是Redis的提供的一種持久化方式(另一種是RDB),它會將所有的寫命令按照一定頻率(no, always, every seconds)寫入到日志文件中,當Redis停機重啟后恢復數據庫。

     

 

2. AOF重寫:

     (1) 隨著AOF文件越來越大,里面會有大部分是重復命令或者可以合并的命令(100次incr = set key 100)

     (2) 重寫的好處:減少AOF日志尺寸,減少內存占用,加快數據庫恢復時間。

    

 

 

 

二、單機多實例可能存在Swap和OOM的隱患:

    由于Redis的單線程模型,理論上每個redis實例只會用到一個CPU, 也就是說可以在一臺多核的服務器上部署多個實例(實際就是這么做的)。但是Redis的AOF重寫是通過fork出一個Redis進程來實現的,所以有經驗的Redis開發和運維人員會告訴你,在一臺服務器上要預留一半的內存(防止出現AOF重寫集中發生,出現swap和OOM)。

    

 

 

 

三、最佳實踐

1. meta信息:作為一個redis云系統,需要記錄各個維度的數據,比如:業務組、機器、實例、應用、負責人多個維度的數據,相信每個Redis的運維人員都應該有這樣的持久化數據(例如Mysql),一般來說還有一些運維界面,為自動化和運維提供依據

    例如如下:

 

 

    

 

2. AOF的管理方式:

 (1) 自動:讓每個redis決定是否做AOF重寫操作(根據auto-aof-rewrite-percentage和auto-aof-rewrite-min-size兩個參數):

  

  

 (2) crontab: 定時任務,可能仍然會出現多個redis實例,屬于一種折中方案。

 

 (3) remote集中式:

       最終目標是一臺機器一個時刻,只有一個redis實例進行AOF重寫。

       具體做法其實很簡單,以機器為單位,輪詢每個機器的實例,如果滿足條件就運行(比如currentSize和baseSize滿足什么關系)bgrewriteaof命令。

       期間可以監控發生時間、耗時、頻率、尺寸的前后變化            

 

策略 優點 缺點
自動 無需開發

1. 有可能出現(無法預知)上面提到的Swap和OOM

2. 出了問題,處理起來其實更費時間。

AOF控制中心(remote集中式)

1. 防止上面提到Swap和OOM。

2. 能夠收集更多的數據(aof重寫的發生時間、耗時、頻率、尺寸的前后變化),更加有利于運維和定位問題(是否有些機器的實例需要拆分)。

控制中心需要開發。

 

 

一臺機器輪詢執行bgRewriteAof代碼示例:

 

Java代碼    收藏代碼
  1. package com.sohu.cache.inspect.impl;  
  2.   
  3. import com.sohu.cache.alert.impl.BaseAlertService;  
  4. import com.sohu.cache.entity.InstanceInfo;  
  5. import com.sohu.cache.inspect.InspectParamEnum;  
  6. import com.sohu.cache.inspect.Inspector;  
  7. import com.sohu.cache.util.IdempotentConfirmer;  
  8. import com.sohu.cache.util.TypeUtil;  
  9. import org.apache.commons.collections.MapUtils;  
  10. import org.apache.commons.lang.StringUtils;  
  11. import redis.clients.jedis.Jedis;  
  12.   
  13. import java.util.Collections;  
  14. import java.util.LinkedHashMap;  
  15. import java.util.List;  
  16. import java.util.Map;  
  17. import java.util.concurrent.TimeUnit;  
  18.   
  19.   
  20. public class RedisIsolationPersistenceInspector extends BaseAlertService implements Inspector {  
  21.   
  22.     public static final int REDIS_DEFAULT_TIME = 5000;  
  23.   
  24.     @Override  
  25.     public boolean inspect(Map<InspectParamEnum, Object> paramMap) {  
  26.         // 某臺機器和機器下所有redis實例  
  27.         final String host = MapUtils.getString(paramMap, InspectParamEnum.SPLIT_KEY);  
  28.         List<InstanceInfo> list = (List<InstanceInfo>) paramMap.get(InspectParamEnum.INSTANCE_LIST);  
  29.         // 遍歷所有的redis實例  
  30.         for (InstanceInfo info : list) {  
  31.             final int port = info.getPort();  
  32.             final int type = info.getType();  
  33.             int status = info.getStatus();  
  34.             // 非正常節點  
  35.             if (status != 1) {  
  36.                 continue;  
  37.             }  
  38.             if (TypeUtil.isRedisDataType(type)) {  
  39.                 Jedis jedis = new Jedis(host, port, REDIS_DEFAULT_TIME);  
  40.                 try {  
  41.                     // 從redis info中索取持久化信息  
  42.                     Map<String, String> persistenceMap = parseMap(jedis);  
  43.                     if (persistenceMap.isEmpty()) {  
  44.                         logger.error("{}:{} get persistenceMap failed", host, port);  
  45.                         continue;  
  46.                     }  
  47.                     // 如果正在進行aof就不做任何操作,理論上要等待它完畢,否則  
  48.                     if (!isAofEnabled(persistenceMap)) {  
  49.                         continue;  
  50.                     }  
  51.                     // 上一次aof重寫后的尺寸和當前aof的尺寸  
  52.                     long aofCurrentSize = MapUtils.getLongValue(persistenceMap, "aof_current_size");  
  53.                     long aofBaseSize = MapUtils.getLongValue(persistenceMap, "aof_base_size");  
  54.                     // 閥值大于60%  
  55.                     long aofThresholdSize = (long) (aofBaseSize * 1.6);  
  56.                     double percentage = getPercentage(aofCurrentSize, aofBaseSize);  
  57.                     // 大于60%且超過60M  
  58.                     if (aofCurrentSize >= aofThresholdSize && aofCurrentSize > (64 * 1024 * 1024)) {  
  59.                         // bgRewriteAof 異步操作。  
  60.                         boolean isInvoke = invokeBgRewriteAof(jedis);  
  61.                         if (!isInvoke) {  
  62.                             logger.error("{}:{} invokeBgRewriteAof failed", host, port);  
  63.                             continue;  
  64.                         } else {  
  65.                             logger.warn("{}:{} invokeBgRewriteAof started percentage={}", host, port, percentage);  
  66.                         }  
  67.                         // 等待Aof重寫成功(bgRewriteAof是異步操作)  
  68.                         while (true) {  
  69.                             try {  
  70.                                 // before wait 1s  
  71.                                 TimeUnit.SECONDS.sleep(1);  
  72.                                 Map<String, String> loopMap = parseMap(jedis);  
  73.                                 Integer aofRewriteInProgress = MapUtils.getInteger(loopMap, "aof_rewrite_in_progress"null);  
  74.                                 if (aofRewriteInProgress == null) {  
  75.                                     logger.error("loop watch:{}:{} return failed", host, port);  
  76.                                     break;  
  77.                                 } else if (aofRewriteInProgress <= 0) {  
  78.                                     // bgrewriteaof Done  
  79.                                     logger.warn("{}:{} bgrewriteaof Done lastSize:{}Mb,currentSize:{}Mb", host, port,  
  80.                                             getMb(aofCurrentSize),  
  81.                                             getMb(MapUtils.getLongValue(loopMap, "aof_current_size")));  
  82.                                     break;  
  83.                                 } else {  
  84.                                     // wait 1s  
  85.                                     TimeUnit.SECONDS.sleep(1);  
  86.                                 }  
  87.                             } catch (Exception e) {  
  88.                                 logger.error(e.getMessage(), e);  
  89.                             }  
  90.                         }  
  91.                     } else {  
  92.                         if (percentage > 50D) {  
  93.                             long currentSize = getMb(aofCurrentSize);  
  94.                             logger.info("checked {}:{} aof increase percentage:{}% currentSize:{}Mb", host, port,  
  95.                                     percentage, currentSize > 0 ? currentSize : "<1");  
  96.                         }  
  97.                     }  
  98.                 } finally {  
  99.                     jedis.close();  
  100.                 }  
  101.             }  
  102.         }  
  103.         return true;  
  104.     }  
  105.   
  106.     private long getMb(long bytes) {  
  107.         return (long) (bytes / 1024 / 1024);  
  108.     }  
  109.   
  110.     private boolean isAofEnabled(Map<String, String> infoMap) {  
  111.         Integer aofEnabled = MapUtils.getInteger(infoMap, "aof_enabled"null);  
  112.         return aofEnabled != null && aofEnabled == 1;  
  113.     }  
  114.   
  115.     private double getPercentage(long aofCurrentSize, long aofBaseSize) {  
  116.         if (aofBaseSize == 0) {  
  117.             return 0.0D;  
  118.         }  
  119.         String format = String.format("%.2f", (Double.valueOf(aofCurrentSize - aofBaseSize) * 100 / aofBaseSize));  
  120.         return Double.parseDouble(format);  
  121.     }  
  122.   
  123.     private Map<String, String> parseMap(final Jedis jedis) {  
  124.         final StringBuilder builder = new StringBuilder();  
  125.         boolean isInfo = new IdempotentConfirmer() {  
  126.             @Override  
  127.             public boolean execute() {  
  128.                 String persistenceInfo = null;  
  129.                 try {  
  130.                     persistenceInfo = jedis.info("Persistence");  
  131.                 } catch (Exception e) {  
  132.                     logger.warn(e.getMessage() + "-{}:{}", jedis.getClient().getHost(), jedis.getClient().getPort(),  
  133.                             e.getMessage());  
  134.                 }  
  135.                 boolean isOk = StringUtils.isNotBlank(persistenceInfo);  
  136.                 if (isOk) {  
  137.                     builder.append(persistenceInfo);  
  138.                 }  
  139.                 return isOk;  
  140.             }  
  141.         }.run();  
  142.         if (!isInfo) {  
  143.             logger.error("{}:{} info Persistence failed", jedis.getClient().getHost(), jedis.getClient().getPort());  
  144.             return Collections.emptyMap();  
  145.         }  
  146.         String persistenceInfo = builder.toString();  
  147.         if (StringUtils.isBlank(persistenceInfo)) {  
  148.             return Collections.emptyMap();  
  149.         }  
  150.         Map<String, String> map = new LinkedHashMap<String, String>();  
  151.         String[] array = persistenceInfo.split("\r\n");  
  152.         for (String line : array) {  
  153.             String[] cells = line.split(":");  
  154.             if (cells.length > 1) {  
  155.                 map.put(cells[0], cells[1]);  
  156.             }  
  157.         }  
  158.   
  159.         return map;  
  160.     }  
  161.   
  162.     public boolean invokeBgRewriteAof(final Jedis jedis) {  
  163.         return new IdempotentConfirmer() {  
  164.             @Override  
  165.             public boolean execute() {  
  166.                 try {  
  167.                     String response = jedis.bgrewriteaof();  
  168.                     if (response != null && response.contains("rewriting started")) {  
  169.                         return true;  
  170.                     }  
  171.                 } catch (Exception e) {  
  172.                     String message = e.getMessage();  
  173.                     if (message.contains("rewriting already")) {  
  174.                         return true;  
  175.                     }  
  176.                     logger.error(message, e);  
  177.                 }  
  178.                 return false;  
  179.             }  
  180.         }.run();  
  181.     }  
  182. }  

 

 

 

 

 

附圖一張:

 

 

 

 

 三、redis內存占用飆升

 一、現象:
    redis-cluster某個分片內存飆升,明顯比其他分片高很多,而且持續增長。并且主從的內存使用量并不一致。
 
二、分析可能原因:
 1.  redis-cluster的bug (這個應該不存在)
 2. 客戶端的hash(key)有問題,造成分配不均。(redis使用的是crc16, 不會出現這么不均的情況)
 3. 存在個別大的key-value: 例如一個包含了幾百萬數據set數據結構(這個有可能)
 4. 主從復制出現了問題。
 5. 其他原因
 
三、調查原因:
 1. 經查詢,上述1-4都不存在
 2. 觀察info信息,有一點引起了懷疑: client_longes_output_list有些異常。
3. 于是理解想到服務端和客戶端交互時,分別為每個客戶端設置了輸入緩沖區和輸出緩沖區,這部分如果很大的話也會占用Redis服務器的內存。
 
從上面的client_longest_output_list看,應該是輸出緩沖區占用內存較大,也就是有大量的數據從Redis服務器向某些客戶端輸出。
于是使用client list命令(類似于mysql processlist) redis-cli -h host -p port client list | grep -v "omem=0",來查詢輸出緩沖區不為0的客戶端連接,于是查詢到禍首monitor,于是豁然開朗.
 
monitor的模型是這樣的,它會將所有在Redis服務器執行的命令進行輸出,通常來講Redis服務器的QPS是很高的,也就是如果執行了monitor命令,Redis服務器在Monitor這個客戶端的輸出緩沖區又會有大量“存貨”,也就占用了大量Redis內存。
 
 
四、緊急處理和解決方法
進行主從切換(主從內存使用量不一致),也就是redis-cluster的fail-over操作,繼續觀察新的Master是否有異常,通過觀察未出現異常。
查找到真正的原因后,也就是monitor,關閉掉monitor命令的進程后,內存很快就降下來了。
 
五、 預防辦法:
1. 為什么會有monitor這個命令發生,我想原因有兩個:
(1). 工程師想看看究竟有哪些命令在執行,就用了monitor
(2). 工程師對于redis學習的目的,因為進行了redis的托管,工程師只要會用redis就可以了,但是作為技術人員都有學習的好奇心和欲望。
2. 預防方法:
(1) 對工程師培訓,講一講redis使用過程中的坑和禁忌
(2) 對redis云進行介紹,甚至可以讓有興趣的同學參與進來
(3) 針對client做限制,但是官方也不建議這么做,官方的默認配置中對于輸出緩沖區沒有限制。
Java代碼    收藏代碼
  1. client-output-buffer-limit normal 0 0 0  
(4) 密碼:redis的密碼功能較弱,同時多了一次IO
(5) 修改客戶端源代碼,禁止掉一些危險的命令(shutdown, flushall, monitor, keys *),當然還是可以通過redis-cli來完成
(6) 添加command-rename配置,將一些危險的命令(flushall, monitor, keys * , flushdb)做rename,如果有需要的話,找到redis的運維人員處理
Java代碼    收藏代碼
  1. rename-command FLUSHALL "隨機數"  
  2. rename-command FLUSHDB "隨機數"  
  3. rename-command KEYS "隨機數"  
 
六、模擬實驗:
1.  開啟一個空的Redis(最簡,直接redis-server)
Java代碼    收藏代碼
  1. redis-server  
    初始化內存使用量如下:
Java代碼    收藏代碼
  1. # Memory  
  2. used_memory:815072  
  3. used_memory_human:795.97K  
  4. used_memory_rss:7946240  
  5. used_memory_peak:815912  
  6. used_memory_peak_human:796.79K  
  7. used_memory_lua:36864  
  8. mem_fragmentation_ratio:9.75  
  9. mem_allocator:jemalloc-3.6.0  
    client緩沖區:
Java代碼    收藏代碼
  1. # Clients  
  2. connected_clients:1  
  3. client_longest_output_list:0  
  4. client_biggest_input_buf:0  
  5. blocked_clients:0  
 
2. 開啟一個monitor:
Java代碼    收藏代碼
  1. redis-cli -h 127.0.0.1 -p 6379 monitor  
3. 使用redis-benchmark:
Java代碼    收藏代碼
  1. redis-benchmark -h 127.0.0.1 -p 6379 -c 500 -n 200000  
4. 觀察
(1) info memory:內存一直增加,直到benchmark結束,monitor輸出完畢,但是used_memory_peak_human(歷史峰值)依然很高--觀察附件中日志
(2)info clients: client_longest_output_list: 一直在增加,直到benchmark結束,monitor輸出完畢,才變為0 --觀察附件中日志
(3)redis-cli -h host -p port client list | grep "monitor" omem一直很高,直到benchmark結束,monitor輸出完畢,才變為0 --觀察附件中日志
監控腳本:
Java代碼    收藏代碼
  1. while [ 1 == 1 ]  
  2. do  
  3. now=$(date "+%Y-%m-%d_%H:%M:%S")  
  4. echo "=========================${now}==============================="  
  5. echo " #Client-Monitor"  
  6. redis-cli -h 127.0.0.1 -p 6379 client list | grep monitor  
  7. redis-cli -h 127.0.0.1 -p 6379 info clients  
  8. redis-cli -h 127.0.0.1 -p 6379 info memory  
  9. #休息100毫秒  
  10. usleep 100000  
  11. done  
 完整的日志文件:
 
一、背景: 選擇合適的使用場景
   很多時候Redis被誤解并亂用了,造成的Redis印象:耗內存、價格成本很高:
   1. 為了“趕時髦”或者對于Mysql的“誤解”在一個并發量很低的系統使用Redis,將原來放在Mysql數據全部放在Redis中。
     ----(Redis比較適用于高并發系統,如果是一些復雜Mis系統,用Redis反而麻煩,因為單從功能講Mysql要更為強大,而且Mysql的性能其實已經足夠了。)
   2. 覺得Redis就是個KV緩存
     -----(Redis支持多數據結構,并且具有很多其他豐富的功能)
   3. 喜歡做各種對比,比如Mysql, Hbase, Redis等等
    -----(每種數據庫都有自己的使用場景,比如Hbase吧,我們系統的個性化數據有1T,此時放在Redis根本就不合適,而是將一些熱點數據放在Redis)
    總之就是在合適的場景,選擇合適的數據庫產品。
  附贈兩個名言:
Evan Weaver, 推ter, March 2009 寫道
Everything runs from memory in Web 2.0!
Tim Gray 寫道
Tape is Dead, Disk is Tape, Flash is Disk, RAM Locality is king.
(磁帶已死,磁盤是新磁帶,閃存是新磁盤,隨機存儲器局部性是為王道)
  
二、一次string轉化為hash的優化
1. 場景:
    用戶id: userId,
    用戶微博數量:weiboCount    
userId(用戶id) weiboCount(微博數)
1 2000
2

10

3

288

.... ...
1000000 1000
 
2. 實現方法:
(1) 使用Redis字符串數據結構, userId為key, weiboCount作為Value
(2) 使用Redis哈希結構,hashkey只有一個, key="allUserWeiboCount",field=userId,fieldValue= weiboCount
(3) 使用Redis哈希結構,  hashkey為多個, key=userId/100, field=userId%100, fieldValue= weiboCount
前兩種比較容易理解,第三種方案解釋一下:每個hashKey存放100個hash-kv,field=userId%100,也就是
userId hashKey field
1 0 1
2 0

2

3 0

3

... .... ...
99 0 99
100 1 0
101 1 1
.... ... ...
9999 99 99
100000 1000 0

 

3. 獲取方法:

 

Java代碼    收藏代碼
</div>

<ol class="dp-j" start="1" style="list-style:decimal;margin:0px 0px 1px;padding:2px 0px;border:1px solid #d1d7dc;color:#2b91af;line-height:1.4em;font-size:1em;background-color:#ffffff;"> 
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span style="color:black;">#獲取userId=</span><span class="number" style="color:#c000;">5003</span><span style="color:black;">用戶的微博數  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">(<span class="number" style="color:#c000;">1</span><span style="color:black;">) get </span><span class="number" style="color:#c000;">5003</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">(<span class="number" style="color:#c000;">2</span><span style="color:black;">) hget allUserWeiboCount </span><span class="number" style="color:#c000;">5003</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">(<span class="number" style="color:#c000;">3</span><span style="color:black;">) hget </span><span class="number" style="color:#c000;">50</span><span style="color:black;"> </span><span class="number" style="color:#c000;">3</span><span style="color:black;">  </span></span></li>
</ol>

</div>

 

 

4. 內存占用量對比(100萬用戶 userId:1~1000000) 

  

Java代碼    收藏代碼
</div>

<ol class="dp-j" start="1" style="list-style:decimal;margin:0px 0px 1px;padding:2px 0px;border:1px solid #d1d7dc;color:#2b91af;line-height:1.4em;font-size:1em;background-color:#ffffff;"> 
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span style="color:black;">#方法一 Memory  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory:<span class="number" style="color:#c000;">85999592</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_human:<span class="number" style="color:#c000;">82</span><span style="color:black;">.02M  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_rss:<span class="number" style="color:#c000;">96043008</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_peak:<span class="number" style="color:#c000;">85999592</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_peak_human:<span class="number" style="color:#c000;">82</span><span style="color:black;">.02M  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_lua:<span class="number" style="color:#c000;">36864</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">mem_fragmentation_ratio:<span class="number" style="color:#c000;">1.12</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">mem_allocator:jemalloc-<span class="number" style="color:#c000;">3.6</span><span style="color:black;">.</span><span class="number" style="color:#c000;">0</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">#方法二 Memory  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory:<span class="number" style="color:#c000;">101665632</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_human:<span class="number" style="color:#c000;">96</span><span style="color:black;">.96M  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_rss:<span class="number" style="color:#c000;">110702592</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_peak:<span class="number" style="color:#c000;">101665632</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_peak_human:<span class="number" style="color:#c000;">96</span><span style="color:black;">.96M  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_lua:<span class="number" style="color:#c000;">36864</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">mem_fragmentation_ratio:<span class="number" style="color:#c000;">1.09</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">mem_allocator:jemalloc-<span class="number" style="color:#c000;">3.6</span><span style="color:black;">.</span><span class="number" style="color:#c000;">0</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">#方法三 Memory  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory:<span class="number" style="color:#c000;">9574136</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_human:<span class="number" style="color:#c000;">9</span><span style="color:black;">.13M  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_rss:<span class="number" style="color:#c000;">17285120</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_peak:<span class="number" style="color:#c000;">101665632</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_peak_human:<span class="number" style="color:#c000;">96</span><span style="color:black;">.96M  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">used_memory_lua:<span class="number" style="color:#c000;">36864</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">mem_fragmentation_ratio:<span class="number" style="color:#c000;">1.81</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">mem_allocator:jemalloc-<span class="number" style="color:#c000;">3.6</span><span style="color:black;">.</span><span class="number" style="color:#c000;">0</span><span style="color:black;">  </span></span></li>
</ol>

</div>

 

  內存使用量:

  

</div>

5. 導入數據代碼(不考慮代碼優雅性,單純為了測試,勿噴)
 
Java代碼    收藏代碼
</div>

<ol class="dp-j" start="1" style="list-style:decimal;margin:0px 0px 1px;padding:2px 0px;border:1px solid #d1d7dc;color:#2b91af;line-height:1.4em;font-size:1em;background-color:#ffffff;"> 
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="keyword" style="color:#7f055;font-weight:bold;">package</span><span style="color:black;"> com.carlosfu.redis;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="keyword" style="color:#7f055;font-weight:bold;">import</span><span style="color:black;"> java.util.ArrayList;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="keyword" style="color:#7f055;font-weight:bold;">import</span><span style="color:black;"> java.util.HashMap;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="keyword" style="color:#7f055;font-weight:bold;">import</span><span style="color:black;"> java.util.List;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="keyword" style="color:#7f055;font-weight:bold;">import</span><span style="color:black;"> java.util.Map;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="keyword" style="color:#7f055;font-weight:bold;">import</span><span style="color:black;"> java.util.Random;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="keyword" style="color:#7f055;font-weight:bold;">import</span><span style="color:black;"> org.junit.Test;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="keyword" style="color:#7f055;font-weight:bold;">import</span><span style="color:black;"> redis.clients.jedis.Jedis;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;">/**</span> </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;"> * 一次string-hash優化</span> </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;"> * @author carlosfu</span> </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;"> * @Date 2015-11-8</span> </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;"> * @Time 下午7:27:45</span> </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;"> */</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="keyword" style="color:#7f055;font-weight:bold;">public</span><span style="color:black;"> </span><span class="keyword" style="color:#7f055;font-weight:bold;">class</span><span style="color:black;"> TestRedisMemoryOptimize {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">      </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    <span class="keyword" style="color:#7f055;font-weight:bold;">private</span><span style="color:black;"> </span><span class="keyword" style="color:#7f055;font-weight:bold;">final</span><span style="color:black;"> </span><span class="keyword" style="color:#7f055;font-weight:bold;">static</span><span style="color:black;"> </span><span class="keyword" style="color:#7f055;font-weight:bold;">int</span><span style="color:black;"> TOTAL_USER_COUNT = </span><span class="number" style="color:#c000;">1000000</span><span style="color:black;">;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    <span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;">/**</span> </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;">     * 純字符串</span> </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;">     */</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    <span class="annotation" style="color:#646464;">@Test</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    <span class="keyword" style="color:#7f055;font-weight:bold;">public</span><span style="color:black;"> </span><span class="keyword" style="color:#7f055;font-weight:bold;">void</span><span style="color:black;"> testString() {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        Jedis jedis = <span class="keyword" style="color:#7f055;font-weight:bold;">null</span><span style="color:black;">;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        <span class="keyword" style="color:#7f055;font-weight:bold;">try</span><span style="color:black;"> {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            jedis = <span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> Jedis(</span><span class="string" style="color:blue;">"127.0.0.1"</span><span style="color:black;">, </span><span class="number" style="color:#c000;">6379</span><span style="color:black;">);  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            List<String> kvsList = <span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> ArrayList<String>(</span><span class="number" style="color:#c000;">200</span><span style="color:black;">);  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            <span class="keyword" style="color:#7f055;font-weight:bold;">for</span><span style="color:black;"> (</span><span class="keyword" style="color:#7f055;font-weight:bold;">int</span><span style="color:black;"> i = </span><span class="number" style="color:#c000;">1</span><span style="color:black;">; i <= TOTAL_USER_COUNT; i++) {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                String userId = String.valueOf(i);  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                kvsList.add(userId);  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                String weiboCount = String.valueOf(<span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> Random().nextInt(</span><span class="number" style="color:#c000;">100000</span><span style="color:black;">));  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                kvsList.add(weiboCount);  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                <span class="keyword" style="color:#7f055;font-weight:bold;">if</span><span style="color:black;"> (i % </span><span class="number" style="color:#c000;">2000</span><span style="color:black;"> == </span><span class="number" style="color:#c000;">0</span><span style="color:black;">) {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                    System.out.println(i);  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                    jedis.mset(kvsList.toArray(<span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> String[kvsList.size()]));  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                    kvsList = <span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> ArrayList<String>(</span><span class="number" style="color:#c000;">200</span><span style="color:black;">);  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        } <span class="keyword" style="color:#7f055;font-weight:bold;">catch</span><span style="color:black;"> (Exception e) {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            e.printStackTrace();  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        } <span class="keyword" style="color:#7f055;font-weight:bold;">finally</span><span style="color:black;"> {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            <span class="keyword" style="color:#7f055;font-weight:bold;">if</span><span style="color:black;"> (jedis != </span><span class="keyword" style="color:#7f055;font-weight:bold;">null</span><span style="color:black;">) {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                jedis.close();  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">      </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">      </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">      </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    <span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;">/**</span> </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;">     * 純hash</span> </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;">     */</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    <span class="annotation" style="color:#646464;">@Test</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    <span class="keyword" style="color:#7f055;font-weight:bold;">public</span><span style="color:black;"> </span><span class="keyword" style="color:#7f055;font-weight:bold;">void</span><span style="color:black;"> testHash() {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        String hashKey = <span class="string" style="color:blue;">"allUserWeiboCount"</span><span style="color:black;">;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">          </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        Jedis jedis = <span class="keyword" style="color:#7f055;font-weight:bold;">null</span><span style="color:black;">;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        <span class="keyword" style="color:#7f055;font-weight:bold;">try</span><span style="color:black;"> {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            jedis = <span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> Jedis(</span><span class="string" style="color:blue;">"127.0.0.1"</span><span style="color:black;">, </span><span class="number" style="color:#c000;">6379</span><span style="color:black;">);  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            Map<String,String> kvMap = <span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> HashMap<String, String>();  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            <span class="keyword" style="color:#7f055;font-weight:bold;">for</span><span style="color:black;"> (</span><span class="keyword" style="color:#7f055;font-weight:bold;">int</span><span style="color:black;"> i = </span><span class="number" style="color:#c000;">1</span><span style="color:black;">; i <= TOTAL_USER_COUNT; i++) {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                String userId = String.valueOf(i);  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                String weiboCount = String.valueOf(<span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> Random().nextInt(</span><span class="number" style="color:#c000;">100000</span><span style="color:black;">));  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                kvMap.put(userId, weiboCount);  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                <span class="keyword" style="color:#7f055;font-weight:bold;">if</span><span style="color:black;"> (i % </span><span class="number" style="color:#c000;">2000</span><span style="color:black;"> == </span><span class="number" style="color:#c000;">0</span><span style="color:black;">) {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                    System.out.println(i);  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                    jedis.hmset(hashKey, kvMap);  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                    kvMap = <span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> HashMap<String, String>();  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        } <span class="keyword" style="color:#7f055;font-weight:bold;">catch</span><span style="color:black;"> (Exception e) {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            e.printStackTrace();  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        } <span class="keyword" style="color:#7f055;font-weight:bold;">finally</span><span style="color:black;"> {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            <span class="keyword" style="color:#7f055;font-weight:bold;">if</span><span style="color:black;"> (jedis != </span><span class="keyword" style="color:#7f055;font-weight:bold;">null</span><span style="color:black;">) {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                jedis.close();  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">      </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    <span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;">/**</span> </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;">     * segment hash</span> </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;"><span class="comment" style="color:#0820;margin:0px;padding:0px;border:0px currentColor;width:auto;">     */</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    <span class="annotation" style="color:#646464;">@Test</span><span style="color:black;">  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    <span class="keyword" style="color:#7f055;font-weight:bold;">public</span><span style="color:black;"> </span><span class="keyword" style="color:#7f055;font-weight:bold;">void</span><span style="color:black;"> testSegmentHash() {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        <span class="keyword" style="color:#7f055;font-weight:bold;">int</span><span style="color:black;"> segment = </span><span class="number" style="color:#c000;">100</span><span style="color:black;">;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        Jedis jedis = <span class="keyword" style="color:#7f055;font-weight:bold;">null</span><span style="color:black;">;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        <span class="keyword" style="color:#7f055;font-weight:bold;">try</span><span style="color:black;"> {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            jedis = <span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> Jedis(</span><span class="string" style="color:blue;">"127.0.0.1"</span><span style="color:black;">, </span><span class="number" style="color:#c000;">6379</span><span style="color:black;">);  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            Map<String,String> kvMap = <span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> HashMap<String, String>();  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            <span class="keyword" style="color:#7f055;font-weight:bold;">for</span><span style="color:black;"> (</span><span class="keyword" style="color:#7f055;font-weight:bold;">int</span><span style="color:black;"> i = </span><span class="number" style="color:#c000;">1</span><span style="color:black;">; i <= TOTAL_USER_COUNT; i++) {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                String userId = String.valueOf(i % segment);  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                String weiboCount = String.valueOf(<span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> Random().nextInt(</span><span class="number" style="color:#c000;">100000</span><span style="color:black;">));  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                kvMap.put(userId, weiboCount);  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                <span class="keyword" style="color:#7f055;font-weight:bold;">if</span><span style="color:black;"> (i % segment == </span><span class="number" style="color:#c000;">0</span><span style="color:black;">) {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                    System.out.println(i);  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                    <span class="keyword" style="color:#7f055;font-weight:bold;">int</span><span style="color:black;"> hash = (i-</span><span class="number" style="color:#c000;">1</span><span style="color:black;">) / segment;  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                    jedis.hmset(String.valueOf(hash), kvMap);  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                    kvMap = <span class="keyword" style="color:#7f055;font-weight:bold;">new</span><span style="color:black;"> HashMap<String, String>();  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        } <span class="keyword" style="color:#7f055;font-weight:bold;">catch</span><span style="color:black;"> (Exception e) {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            e.printStackTrace();  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        } <span class="keyword" style="color:#7f055;font-weight:bold;">finally</span><span style="color:black;"> {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            <span class="keyword" style="color:#7f055;font-weight:bold;">if</span><span style="color:black;"> (jedis != </span><span class="keyword" style="color:#7f055;font-weight:bold;">null</span><span style="color:black;">) {  </span></span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">                jedis.close();  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">            }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">        }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">    }  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">  </span></li>
 <li style="margin:0px 0px 0px 38px;padding:0px 0px 0px 10px;line-height:18px;font-size:1em;border-left-color:#d1d7dc;border-left-width:1px;border-left-style:solid;background-color:#fafafa;"> <span style="color:black;">}  </span></li>
</ol>

</div>

  </div>

 

</div>

三、結果對比
 redis核心對象 數據類型 + 編碼方式 + ptr  分段hash也不會造成drift
方案 優點 缺點
string

直觀、容易理解

  1. 內存占用較大
  2. key值分散、不變于計算整體
hash

直觀、容易理解、整合整體

  1. 內存占用大
  2. 一個key占用過大內存,如果是redis-cluster會出 現data drift

 

segment-hash

內存占用量小,雖然理解不夠直觀,但是總體上是最優的。

理解不夠直觀。

 
四、結論:
   在使用Redis時,要選擇合理的數據結構解決實際問題,那樣既可以提高效率又可以節省內存。所以此次優化方案三為最佳。
 
附圖一張:redis其實是一把瑞士軍刀:
 
 

 
</div>

  

由于演講時間有限,有關Redis-Cluster,演講者沒做太多介紹,簡單的介紹了一些Redis-Cluster概念作用和遇到的兩個問題,我們在Redis-Cluster也有很多運維經驗,將來的文章會介紹。

 

但是講演者反復強調,不要聽信網上對于Redis-Cluster的毀謗(實踐出真知),對于這一點我很贊同,我們從Redis-Cluster beta版 RC1~4 到現在的3.0-release均沒有遇到什么大問題(線上維護600個實例)。

 

一、Redis-Cluster

有關Redis-Cluster的詳細介紹有很多這里就不多說了,可以參考:

1. redis-cluster研究和使用

2. Redis Cluster 3.0.5集群實踐

3. 本博客的一些Redis-Cluster的介紹(未更新完畢)

4. Redis設計與實現那本書(作者:黃建宏):非常的推薦看這本書。

總之Redis-Cluster是一個無中心的分布式Redis存儲架構,解決了Redis高可用、可擴展等問題。

 

 

 

 

二、兩個問題:

 

1. Redis-Cluster主從節點不要在同一個機器部署

   (1) 以我們的經驗看redis實例本身基本不會掛掉,通常是機器出了問題(斷電、機器故障)、甚至是機架、機柜出了問題,造成Redis掛掉。

   (2) 如果Redis-Cluster的主從都在一個機器上,那么如果這臺機器掛了,主從全部掛掉,高可用就無法實現。(如果full converage=true,也就意味著整個集群掛掉)

   (3) 通常來講一對主從所在機器:不跨機房、要跨機架、可以在一個機柜。

 

2. Redis-Cluster誤判節點fail進行切換

   (1) Redis-Cluster是無中心的架構,判斷節點失敗是通過仲裁的方式來進行(gossip和raft),也就是大部分節點認為一個節點掛掉了,就會做fail判定。

   (2) 如果某個節點在執行比較重的操作(flushall, slaveof等等)(可能短時間redis客戶端連接會阻塞(redis單線程))或者由于網絡原因,造成其他節點認為它掛掉了,會做fail判定。

   (3) Redis-Cluster提供了cluster-node-timeout這個參數(默認15秒),作為fail依據(如果超過15秒還是沒反應,就認為是掛掉了),具體可以參考這篇文章:Redis-Cluster的FailOver失敗案例分析

        以我們的經驗看15秒完全夠用。

   

 

三、未來要介紹的問題:

 

1. Redis-Cluster客戶端實現Mget操作。

2. Redis-Cluster--Too many Cluster redirections異常

3. Redis-Cluster無底洞問題解析。

4. 兩個Redis-Cluster集群,meet操作問題后的惡果。

5. Redis-Cluster配置之full converage問題。

6. Redis-Cluster故障轉移測試

7. Redis-Cluster常用運維技巧。

8. Redis-Cluster一鍵開通。

9. Redis-Cluster客戶端jedis詳解。

 

四、附贈一些不錯的資料:

  1.  Redis-Cluster的FailOver失敗案例分析
  2.  Redis Cluster 遷移遇到的各種坑及解決方案
  3.  Redis Cluster架構優化
  4.  Redis常見集群方案、Codis實踐及與Twemproxy比較
  5.  Redis Cluster架構優化
  6. 【運維實踐】魚與熊掌:使用redis-cluster需要注意些什么?
  7.  Docker及和Redis Cluster的化學反應(上)By 芒果TV
  8.  Docker及和Redis Cluster的化學反應(下)By 芒果TV
  9.  Redis cluster使用經驗——網易有道
  10.  Redis Cluster淺析和Bada對比
  11.  互聯網Redis應用場景探討
  12.  Redis集群技術及Codis實踐
  13.  談推ter的百TB級Redis緩存實踐
  14.  Hadoop、Spark、HBase與Redis的適用性討論
  15. Codis作者黃東旭細說分布式Redis架構設計和踩過的那些坑們

 

 

以上轉自:http://carlosfu.iteye.com/blog/2254154

 本文由用戶 y139733 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!