1. 程式人生 > 實用技巧 >效能優化之 給redis插入分桶,製造物理索引

效能優化之 給redis插入分桶,製造物理索引

藉助hbase的讀寫思路做數倉

hbase讀寫速度快(與HDFS對比)是基於兩方面:

1)使用者寫(入cache)和(cache)寫入硬碟是非同步的

2)有-root-和-meta-表,能夠快速定位表的位置 => 成為物理化的標準索引

詳見:https://www.cnblogs.com/sabertobih/p/14001268.html

現在,把mysql當作hdfs,儲存2億個資料。用redis做高速讀寫的索引表,索引是id的加鹽後雜湊分桶,

實現功能:隨機給一個id=123456,能立刻通過redis查到對應的

插入索引表

public static String tucketNo(int
i){ // 此方法如果String值特別大會出現負數 // hadoop預設的hashpartitioner中為了解決這個問題,使用與運算:(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; return (i+"").hashCode()%100000+""; // 這裡可以用abs取絕對值,否則生成200000個桶 } Jedis jedis = new Jedis("192.168.56.111",6379); Pipline pip = jedis.pipelined(); for (int i = 0; i <200000000 ; i++) { pip.sadd(tucketNo(i),i
+""); // 看進度條的 if(i%100000==0){ Thread.sleep(50); System.out.println(i); } } pip.syns(); jedis.close();

效能測試

Jedis jedis = new Jedis("192.168.56.111",6379);
int no = 123344;
long time = System.currentTimeMillis();
 // 這個桶(value是set的key)是不是存在no這個數?
System.out.println(jedis.sismember(tucketNo(no),no+"")); // 判斷是否redis某個桶中存在某個數只花費了___milliseconds System.out.println(System.currentTimeMillis()-time);