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不会像测试代码这么夸张,可是提高仍是有的。