学学Redis
数据占用内存比对
使用对象
function Person() { this.name = null; this.description = 'Person'; }
内存:
100w条数据写
for(var i = 0; i < 1000000; i++) { temp = new Person(); temp.name = i; // client.set(i, JSON.stringify(temp)); //115.83m // client.set('PersonName'+i, temp.name); // client.set('PersonDescription'+i, temp.description); //184.72m // client.hset('PersonName', i, temp.name); // client.hset('PersonDescription', i, temp.description); //184.72m client.hmset('Person'+i,{'name':i, 'description':temp.description}); //131.1m }
转成Json方式保存剩了一些Key和Field,节省部分空间。最后一种方法也节省了很多空间,估计式因为ziplist的作用。(ziplist原理暂时还没看懂)
修改Key的长度会显著的改变占用空间大小。
时间:
10w条数据写
同样如内存一样的4种保存策略,第一、第四种方法耗时明显小于第二、第三种。
分别耗时:4300ms, 8212ms, 8837ms, 4488ms
10w条数据读,并生成model
采用第一种方法:
var count = 100000; createTime = Date.now(); for(var i = 0; i < count; i++) { client.get('Person'+i, function(err, replies) { temp = JSON.parse(replies); temp.prototype = Person.__proto__; count--; if(count == 0) { console.log(Date.now()-createTime); client.flushall(); client.quit(); } }); }
耗时:4073ms
第四种方法:
var count = 100000; createTime = Date.now(); for(var i = 0; i < count; i++) { client.get('Person'+i, function(err, replies) { temp.name = replies.name; temp.description = replies.description; count--; if(count == 0) { console.log(Date.now()-createTime); client.flushall(); client.quit(); } }); }
耗时:4152ms
总结:
第一种方法:对对象JSON序列化、反序列化使用,在空间、时间上表现优秀。
第四种方法:使用hash对对象序列化、反序列化,在空间、时间上表现稍逊JSON,但是更加灵活,更加方便查询,不过Model的代码工作量增加,但我认为式值得的。
个人更喜欢第四种方法。