$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
$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条数据)--区间内只有四个 所以返回也只有四个
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]
phpredis中,zrangeByscore中的limit参数对应的数组需要明确offset和count;
Redis::zrevrangeByscore(DATI_RANGE, '+inf', 0, ['withscores'=>true , 'limit'=>['offset'=>0,'count'=>5]]);
2、通过成员索引取值方法:
$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、通过字符取值方法:通过字符排序
$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
)