key = username0000 value =strs html
...redis
key = username9999 value =strs 數據結構
key = username0 field = 000 value = str ... field =999 value =str 測試
...優化
key = username9 field = 000 value = str ... field =999 value =str .net
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不會像測試代碼這麼誇張,可是提高仍是有的。