phpredis之zrangeByScore怎么使用

491326240582d99a33a3666967d4d0d5.jpeg

在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条数据)--区间内只有四个 所以返回也只有四个

phpredis之zrangeByScore

laravel 目前默认推荐使用的 phpredis 扩展,汇总一下 zrangeByscore 的用法:

$redis->zrangebyscore('key',$min,$max);
// 查询通过scroe范围拿成员值,返回有序集key中,指定区间内的成员(分值升序:从小到大排)

// 分值降序使用:zrevrangebyscore('key',$min,$max);

1.$min,$max 这些都是常用的参数,但是遇到特殊情况不知道 $min 和 $max 值大小的时候,就需要使用极限代替(+inf、-inf,正负无极)。

2. 截取前 100 名,需要第 4 个参数:

$redis->zrangebyscore('key',$min,$max,['withscores'=>true , 'limit'=>['offset'=>0,'count'=>5])

第四个参数是个数组,需要注意 limit 的格式,有的参考是

$redis->zrangebyscore('key',$min,$max,['withscores'=>true , 'limit'=>[0,5])

但使用中报错,查看跟踪一下 laravel 中 phpredis 源码发现是这样使用的,所以正确的参数格式为:

‘limit’=>[‘offset’=>0,’count’=>5]

dcf2d65edf5dceb7885dd7058279b5c6.jpeg

phpredis中,zrangeByscore中的limit参数对应的数组需要明确offset和count;

Redis::zrevrangeByscore(DATI_RANGE, '+inf', 0, ['withscores'=>true , 'limit'=>['offset'=>0,'count'=>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的数据)

3、通过字符取值方法:通过字符排序

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
)

de5150cc332e99b576e03551f7c3406e.jpeg

猜你喜欢

转载自blog.csdn.net/lxw1844912514/article/details/130299570