PHP Redis有序集合 排序取值操作详情(zRangeByScore,zRevRangeByScore,zRange,zRevRange,zRangeByLex,zRevRangeByLex)
在Redis有序集合章节 可以看到非常多的函数 其实他只是多了一个顺序(成员分数) 既然是有序那么取值问题一定要有排序过程
排序过程一共分为三个方式 :个人觉得他们的使用场景和优缺点
1、通过成员分数排序 : 取出多少分到多少分的成员
案例:存入学生成绩 取出成绩优异的学生(90分以上) 不及格的学生
优点:可以快速通过分数区间取出成员
缺点:取出数量不确定
2、通过索引排序:通过分数大小排序建立的索引
案例:取出成绩前十名学生
优点:可以取出固定开始位置,固定数量的成员
缺点:不能按照分数来划分了
3、通过字符排序:通过成员按照字典区间排序的顺序 取出成员(这好像跟分数没关系了)
案例:按照字母(姓氏)取出成员
优点:可以通过成员变量取出
缺点:好像不会经常使用吧
使用方法:(By*** :使用排序方法, 带有Rev表示倒序)
先插入些数据便与测试(这里用到了 redis的管道命令 就是减少数据传输时间 让redis服务一次执行多个命令)
$redisPipe = $redis->multi(Redis::PIPELINE);
$Lex = ['a','b','c','d','e','f','g','h','i','j','k','l'];
for ( $i=0; $i<100; $i++ ) {$redisPipe->zAdd('SSet10', $i, $Lex[ceil($i/10)].$i);
}
$result = $redisPipe->exec();
1、通过成员分数取值方法:
zRangeByScore zRevRangeByScore
参数(有序集合名,开始分数,结束分数,[‘withscores’=>是否带分数,'limit'=>[offect,limit]])
withscores是否返回分数 这个很重要返回格式不一样 其他排序道理相同
inf表示“无穷大”,是infinite的缩写。 +inf表示最大的分数 -inf最小分数(所以Rev倒序需要 +,-)
$SSet10Rang1 = $redis->zRangeByScore('SSet10', '-inf', '+inf', ['withscores'=>true, 'limit'=>[5,5]]);D:\workproject\www_laravel\laravel6_test>php test.php
Array
([b5] => 5[b6] => 6[b7] => 7[b8] => 8[b9] => 9
)//按分数正序取并且带分数返回(从最小值到最大值的区间 取出本区间第五个开始5条数据)$SSet10Rang1 = $redis->zRangeByScore('SSet10', '-inf', '+inf', ['withscores'=>false, 'limit'=>[5,5]]);D:\workproject\www_laravel\laravel6_test>php test.php
Array
([0] => b5[1] => b6[2] => b7[3] => b8[4] => b9
)//按分数正序取不带分数返回(从最小值到最大值的区间 取出本区间第五个开始5条数据)--这为了演示 withscores$SSet10Rang1 = $redis->zRevRangeByScore('SSet10', 99, 96, ['withscores'=>true, 'limit'=>[0,5]]);
Array
([k99] => 99[k98] => 98[k97] => 97[k96] => 96
)//按分数倒序取并且带分数返回(从99分到96分的区间 取出本区间第0个开始5条数据)--区间内只有四个 所以返回也只有四个
2、通过成员索引取值方法:
zRange zRevRange
参数(有序集合名,开始位置,结束位置,withscores(是否带分数))
这个取集合内按分数排序前或后多少个成员数据 不需要offect limit因为直接使用索引
$SSet10Rang1 = $redis->zRange('SSet10', 0, 5, true);D:\workproject\www_laravel\laravel6_test>php test.php
Array
([a0] => 0[b1] => 1[b2] => 2[b3] => 3[b4] => 4[b5] => 5
)//按分数正序的索引取并且带分数返回(取出索引0到索引5的数据)$SSet10Rang1 = $redis->zRevRange('SSet10', 0, 5, false);
Array
([0] => k99[1] => k98[2] => k97[3] => k96[4] => k95[5] => k94
)//按分数倒序的索引取不带分数返回(取出索引0到索引5的数据)
2、通过成员索引取值方法:
zRangeByLex zRevRangeByLex
参数(有序集合名,开始字符,结束字符,offset,limit)
开始结束的字符左侧需要使用开闭区间 (开区间 [闭区间 也可以使用+最大值 -最小值
(a,[b 是不包含a但比a大 并且包含b比b小的区间 并不是以这些字母开头
$SSet10Rang1 = $redis->zRangeByLex('SSet10', '+', '-', 0, 5);Array
([0] => a0[1] => b1[2] => b2[3] => b3[4] => b4
)$SSet10Rang1 = $redis->zRangeByLex('SSet10', '(a', '[c', 2, 5);Array
([0] => a0[1] => b1[2] => b2[3] => b3[4] => b4
)$SSet10Rang1 = $redis->zRevRangeByLex('SSet10', '(i', '[g', 0, 5);Array
([0] => h70[1] => h69[2] => h68[3] => h67[4] => h66
)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
