在redis中对不同集合类型进行sort操作的性能粗测
由于考虑到网站运行后期的数据量比较大,使用redis的sort指令来获取查询结果的性能问题(见文章尾部题设1),在系统设计之初就得确定好哪一种集合类型的数据进行sort操作的速度最快.
以下测试均在虚拟机中完成,虚拟机ram为384M
在这里测试的数据类型:list/set/sorted set
测试方法: 对list键lpush 100w条数据 (1~1024*1024的整数)
对set键sadd 100w条数据(1~1024*1024的整数)
对sorted set键zadd 100w条数据(value为1~1024*1024的整数,score与value相同)
使用 sort {$keyname} limit 0 10 来测试sort的大致时间
采用python脚本粗测执行时间的结果为(多次测试的结果求平均值)
list 1.52050209045 set 1.97175097466 sorted set 2.02180504799
对于结果我表示纠结,sorted set反而最慢,预计对于所有的元素都重新进行了sort操作,而没有直接采用已经排好的结果
另:在这个测试之前做了个对1000w条数据的排序,虚拟机中的redis-server直接被block不给我响应了(内存太小)..
题设1:
我们所采用的开发环境为PHP+Redis,采用phpredis扩展作为php连redis的driver
假设我们的数据如下
用一个set(或list或sorted set)储存所有的照片的id(key定位photo:set),然后想提取特定数量的照片的基本信息(采用hash数据类型,假定内容为array(‘name’=>{$photoname},’addtime’=>{$nowtime}),key定为photo:{$photoid})
假设要求获取最新100张照片的名字
如果是set或sorted set,只有一种方式
$r->sort(“photo:set”,array(‘get’=>’name’,'sort’=>’desc’,'limit’=>array(0,10)));
如果是list那就有两种方式
1)$r->sort(“photo:set”,array(‘get’=>’photo:*->name’,'sort’=>’desc’,'limit’=>array(0,10)));
2)$photos = $r->lGetRange(“photo:set”,array(‘limit’=>array(0,100))); //这条速度块
forearch($photos as $photo){ //这里就不快了,这里的pipeline批量执行未测
$r->hGet(“photo:{$}”,”name”);
}
显然list的第二种方式的处理速度比较慢,它有100次请求(第一种只有一次请求),redis的内部处理速度显然快于外部的请求速度.
在这种情况下我们要做的就是对 list的sort方式及set的sort方式进行速度对比.