PHP简单操作Redis常用方法以及注意事项(三)---SortedSet有序集合
时间:2023-07-15 03:37:00
写在前面 :
这东西比较烦,刚开始接触的时候一脸懵逼,放下心来仔细检查,
一点一点敲代码试验会发现有序集合就是排序时分几种情况!
与集合一样,有序集合不允许成员重复,但会给每个成员一个浮点分数,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', 'value//取value对应的分数 $SSet1Sort = $redis->zRank('SSet1', 'value//取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)//按照字典删除