写在前面 :
这个东西比较烦,刚开始接触时一脸懵逼,放下心来仔细查看,
一点一点敲代码试会发现有序集合就是排序的时候分了几种情况!!!
有序集合跟集合一个样不允许成员重复,但是会给每个成员分配一个浮点型的分数,redis正是通过这个分数来排序的。
排序方式如图分为三种:
(通过分数排序) 就是自己设置的分数
zRangeByScore(正序0-999)
zRevRangeByScore(倒序999-0)
(通过索引排序) 通过分数排序 按照0-9999索引
zRange(正序0-999)
zRevRange(倒序999-0)
(通过字典排序) 通过字典 a-z 这样的顺序排序
zRangeByLex(正序a-z)
zRevRangeByLex(倒序z-a)
1,PHP 操作Redis-ScoreSet有序集合
$redis->zAdd('SSet1', 0, 'value11');//value1插入集合中 定义分数为0
$redis->zAdd('SSet1', 1, 'value11');//value1插入集合中(更新分数为1)
$redis->zAdd('SSet1', 3, 'value13');
$redis->zAdd('SSet1', 4, 'value14');
$redis->zAdd('SSet1', 5, 'value15');
$redis->zAdd('SSet1', 6, 'value16');
$redis->zIncrBy('SSet1',1.2, 'value16');//给成员加分
$redis->zAdd('SSet2', 0, 'avalue21');
$redis->zAdd('SSet2', 1, 'bvalue22');
$redis->zAdd('SSet2', 3, 'cvalue23');
$redis->zAdd('SSet2', 4, 'dvalue24');
$redis->zAdd('SSet2', 5, 'dvalue25');
$redis->zAdd('SSet2', 6, 'evalue26');
$redis->zAdd('SSet3', 0, 'avalue31');
$redis->zAdd('SSet3', 0, 'bvalue32');
$redis->zAdd('SSet3', 0, 'cvalue33');
$redis->zAdd('SSet3', 0, 'dvalue34');
$redis->zAdd('SSet3', 0, 'dvalue35');
$redis->zAdd('SSet3', 0, 'evalue36');
$SSet1Sort = $redis->zScore('SSet1', 'value11');//取value对应的分数
$SSet1Sort = $redis->zRank('SSet1', 'value11');//取value对应的索引
$SSet1Cnt = $redis->zCard('SSet1');//集合内成员数
$SSet2LexCnt = $redis->zLexCount('SSet2', '[a', '(e');//字典排序 区间成员数
$SSet2LexVlaueZ = $redis->zRangeByLex('SSet2', '[a', '(e');//字典排序 区间成员
$SSet2LexVlaueF = $redis->zRevRangeByLex('SSet2', '[e', '(a');//字典排序 区间成员
//$redis->zRemRangeByLex('SSet2', '[a', '(e');//字典排序 删除区间成员
$SSet2KeyVlaueZ = $redis->zRange('SSet2', 0, 3);//索引正序排序 区间成员
$SSet2KeyVlaueF = $redis->zRevRange('SSet2', 0, 3);//索引倒序排序 区间成员
//$redis->zRemRangeByRank('SSet2', 0, 5);//索引排序 删除区间成员
$SSet2ScoreCnt = $redis->zCount('SSet2', 0, 5);//分数排序 区间成员数
$SSet2ScoreVlaueZ = $redis->zRangeByScore('SSet2', 0, 5);//分数排序 区间成员
$SSet2ScoreVlaueF = $redis->zRevRangeByScore('SSet2', 5, 0);//分数排序 区间成员
//$redis->zRemRangeByScore('SSet2', 0, 5);//分数排序 删除区间成员
$redis->zInterStore('SSet5',['SSet1','SSet2']);//多个有序集合交集生成新的有序集合
$redis->zUnionStore('SSet6',['SSet1','SSet2']);//多个有序集合并集生成新的有序集合
//$redis->zRem('SSet3', 'avalue31');//删除成员
//$redis->zRem('SSet3', 'avalue31', 'bvalue32');//删除多个成员
print $SSet1Sort . "\r\n";
print $SSet1Cnt . "\r\n";
print $SSet2LexCnt . "\r\n";
print_r($SSet2LexVlaueZ);
print_r($SSet2LexVlaueF);
print_r($SSet2KeyVlaueZ);
print_r($SSet2KeyVlaueF);
print $SSet2ScoreCnt . "\r\n";
print_r($SSet2ScoreVlaueZ);
print_r($SSet2ScoreVlaueF);
print_r($redis->zRange('SSet5', 0, -1));
print_r($redis->zRange('SSet6', 0, -1));
运行结果:
D:\workproject\www_laravel\laravel6_test>php test.php
0
5
5
Array
(
[0] => avalue21
[1] => bvalue22
[2] => cvalue23
[3] => dvalue24
[4] => dvalue25
)
Array
(
[0] => dvalue25
[1] => dvalue24
[2] => cvalue23
[3] => bvalue22
[4] => avalue21
)
Array
(
[0] => avalue21
[1] => bvalue22
[2] => cvalue23
[3] => dvalue24
)
Array
(
[0] => evalue26
[1] => dvalue25
[2] => dvalue24
[3] => cvalue23
)
5
Array
(
[0] => avalue21
[1] => bvalue22
[2] => cvalue23
[3] => dvalue24
[4] => dvalue25
)
Array
(
[0] => dvalue25
[1] => dvalue24
[2] => cvalue23
[3] => bvalue22
[4] => avalue21
)
Array
(
)
Array
(
[0] => avalue21
[1] => bvalue22
[2] => value11
[3] => cvalue23
[4] => value13
[5] => dvalue24
[6] => value14
[7] => dvalue25
[8] => value15
[9] => evalue26
[10] => value16
)
ScortSer总结一下:
关于写入:
zAdd(k,s,v)
注意:成员v唯一 如果重复zAdd覆盖分数
关于取出:
zScore(k,v)取成员分数
zRank(k,v)取成员索引
zCard(k)取集合内有多少成员
关于操作:
zInterStore(k,[k1,k2]);//多个集合差集生成新的k集合
zUnionStore(k,[k2,k1]);//多个集合并集生成新的k集合关于删除:
zRem(k,v)//把v从k中删除
zRem(k,v1,v2)//把v1,v2从k中删除
zRemRangeByScore(k,start,end)//按照分数删除
zRemRangeByRank(k,start,end)//按索引数删除
zRemRangeByLex(k,start,end)//按照字典删除