效能優化之 給redis插入分桶,製造物理索引
阿新 • • 發佈:2020-12-09
藉助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(inti){ // 此方法如果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);