redis的opsForHash帶來的內存空間優化

  • 把大量value爲string的普通key-value抽象爲分組的小hash的field-value,建議field總個數<1000,value的長度<512字節,value越小,越省空間(最好50字節之內)

key = username0000 value =strs html

...redis

key = username9999 value =strs 數據結構

  • 以上可重構爲10組hash key,每組1000個field

key = username0 field = 000 value = str ... field =999 value =str 測試

...優化

key = username9 field = 000 value = str ... field =999 value =str .net

  • 對於只含可計算的field的Hash:
    • 也可以使用分組hash:以下,每100個用戶ID共享一個hash key
      • key=userId/100, field1=userId%100, field1Value=str, field2=userId%100, field2Value=str, ...
      • 即:userId爲1~100的全部用戶的userId-value鍵值對都存儲在key=0的field-value中,而101~200則存在key=1中,......

https://blog.csdn.net/yunhaibin/article/details/8999429htm

https://www.cnblogs.com/susufufu/p/7875210.htmlblog

開始測試。進入redis-cli.exe,輸入info獲取信息,看到初始化後的 used_memory_human:676.65K內存

實行一段程序,模擬添加String數據string

public void setLotsKV() {
    RedisManager redisManager = new RedisManager();
    System.out.println("開始設置");
    for (int i = 0; i < 50000; i++) {
        String k = "k" + i;
        String v = "v" + i;
        redisManager.jedis.set(k, v);
    }
    System.out.println("設置完成");
}

而後清空數據,重啓redis,再添加模擬添加hash數據

public void setLotsHashKV() {
    RedisManager redisManager = new RedisManager();
    System.out.println("開始設置");
    HashMap<String, String> hashMap = new HashMap<>();
    for (int i = 0; i < 50000; i++) {
        String k = i + "";
        String v = i + "";
        hashMap.put(k, v);
    }
    redisManager.jedis.hmset("k", hashMap);
    System.out.println("設置完成");
}

什麼!!!說好的hash結構省內存呢。你騙我!!!!並無的想要的結果。若是不作任何處理,hash會比string消耗更多的內存。

換一種思路, 推測若是簡單的kv ,hash在kv上的優化所得內存,尚未本身數據結構消耗的大。那麼,把k 和 v變複雜再測試一下。

新的模擬String

public void setLotsKV() {
    RedisManager redisManager = new RedisManager();
    System.out.println("開始設置");
    for (int i = 0; i < 50000; i++) {
        String k = "abcdefghijklmnopqrstuvwxyzK" + i;
        String v = "abcdefghijklmnopqrstuvwxyzV" + i;
        redisManager.jedis.set(k, v);
    }
    System.out.println("設置完成");
}

public void setLotsHashKV() {
    RedisManager redisManager = new RedisManager();
    System.out.println("開始設置");
    HashMap<String, String> hashMap = new HashMap<>();
    for (int i = 0; i < 50000; i++) {
        String k = "K" + i;
        String v = "V" + i;
        hashMap.put(k, v);
    }
    redisManager.jedis.hmset("abcdefghijklmnopqrstuvwxyz", hashMap);
    System.out.println("設置完成");
}

新的賴皮思路下,5.99M比8.03M 節省了25%+。實際上KV不會像測試代碼這麼誇張,可是提高仍是有的。

相關文章
相關標籤/搜索