PHP简单操作Redis常用方法以及注意事项(三)---SortedSet有序集合

8 篇文章 1 订阅

写在前面 :

这个东西比较烦,刚开始接触时一脸懵逼,放下心来仔细查看,

一点一点敲代码试会发现有序集合就是排序的时候分了几种情况!!!

有序集合跟集合一个样不允许成员重复,但是会给每个成员分配一个浮点型的分数,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)//按照字典删除

关于排序问题 在这里

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值