SortedSet(有序集合)
排行榜使用:
1.## 添加用户到有序集,
## 当key不存在,或 member不是key的成员时,ZINCRBY key increment member等同于ZADD key increment member
## score 值可以是整数值或双精度浮点数。
$redis->zIncrBy($rankKey, $num, $uid);
2.## 获取榜单分值
$score = $cache->zScore($rank_key, $uid);
3.## 删除榜单指定元素【榜单存在数据,进行删除操作】
if ($redis->zScore($rank_key, $uid) !== false) {
$redis->zRem($rank_key, $uid);
}
4.## 获取榜单【获取榜单指定区间元素】
$rankList = $redis->zRevRange($rank_key, $start, $end, true);
5.## 获取榜单成员数
$rankNum = $redis->zCard($rank_key);
6.## 获取榜单成员排名,不在榜单返回false
$rank_index = $redis->zRevRank($rank_key, $data_id);
$rank_index = ($rank_index === false) ? false : ($rank_index + 1);
7.## 获取倒序排名
$rank_id = $cache->zRevRank($rank_key, $uid);
$new_rank_id = $rank_id + 1;//计算真实排名
$result['rank'] = $new_rank_id > 50 ? '50+' : $new_rank_id;
##领先落后,$limit 和多少做比较
function getRankData($limit-1,)
{
//....
if ($rank_id > $limit){
$result['rank_type'] = 2;//1领先,2落后
$result['rank_contrast_id'] = $limit + 1;
$rank_list = $cache->zRevRange($rank_key, $limit, $limit, true);
$next_score = empty(current($rank_list)) ? 0 : current($rank_list);
$result['rank_score'] = ($next_score - $score) > 0 ? ($next_score-$score) : '0';
}
else{
$result['rank_type'] = 1;
$result['rank_contrast_id'] = $rank_id + 2;
$rank_list = $cache->zRevRange($rank_key, $new_rank_id, $new_rank_id, true);
$next_score = empty(current($rank_list)) ? 0 : current($rank_list);
$result['rank_score'] = ($score - $next_score) > 0 ? ($score-$next_score) : '0';
}
}
8. ## Redis有序集合 排序取值操作详情(zRangeByScore,zRevRangeByScore,zRange,zRevRange,zRangeByLex,zRevRangeByLex)
1)、# 通过成员分数取值方法: zRangeByScore、zRevRangeByScore
# 参数(有序集合名,开始分数,结束分数,[‘withscores’=>是否带分数,'limit'=>[offect,limit]])
withscores是否返回分数 这个很重要返回格式不一样 其他排序道理相同
inf表示“无穷大”,是infinite的缩写。 +inf表示最大的分数 -inf最小分数(所以Rev倒序需要 +,-)
$redis->zRangeByScore('SSet10', '-inf', '+inf', ['withscores'=>true, 'limit'=>[5,5]]);
Array
(
[b5] => 5
[b6] => 6
[b7] => 7
[b8] => 8
[b9] => 9
)//按分数正序取并且带分数返回(从最小值到最大值的区间 取出本区间第五个开始5条数据)
$redis->zRangeByScore('SSet10', '-inf', '+inf', ['withscores'=>false, 'limit'=>[5,5]]);
Array
(
[0] => b5
[1] => b6
[2] => b7
[3] => b8
[4] => b9
)//按分数正序取不带分数返回(从最小值到最大值的区间 取出本区间第五个开始5条数据)--这为了演示 withscores
$redis->zRevRangeByScore('SSet10', 99, 96, ['withscores'=>true, 'limit'=>[0,5]]);
Array
(
[k99] => 99
[k98] => 98
[k97] => 97
[k96] => 96
)//按分数倒序取并且带分数返回(从99分到96分的区间 取出本区间第0个开始5条数据)--区间内只有四个 所以返回也只有四个
2)、#通过成员索引取值方法: zRange、zRevRange
# 参数(有序集合名,开始位置,结束位置,withscores(是否带分数))
这个取集合内按分数排序前或后多少个成员数据 不需要offect limit因为直接使用索引
$redis->zRange('SSet10', 0, 5, true);
Array
(
[a0] => 0
[b1] => 1
[b2] => 2
[b3] => 3
[b4] => 4
[b5] => 5
)//按分数正序的索引取并且带分数返回(取出索引0到索引5的数据)
$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小的区间 并不是以这些字母开头
$redis->zRangeByLex('SSet10', '+', '-', 0, 5);
Array
(
[0] => a0
[1] => b1
[2] => b2
[3] => b3
[4] => b4
)
$redis->zRangeByLex('SSet10', '(a', '[c', 2, 5);
Array
(
[0] => a0
[1] => b1
[2] => b2
[3] => b3
[4] => b4
)
$redis->zRevRangeByLex('SSet10', '(i', '[g', 0, 5);
Array
(
[0] => h70
[1] => h69
[2] => h68
[3] => h67
[4] => h66
)Set(集合)
排行榜使用:
1. ## 是否是淘汰用户,判断 member 元素是否集合 key 的成员。
$redis->sIsMember($user_list_key, $uid)
2. ## 添加用户到淘汰列表
$redis->sAdd($user_list_key, $uid);
if ($redis->ttl($user_list_key) == -1) {
$redis->expire($user_list_key, $this->redis_len);
}Hash(哈希表)
排行榜使用:
1. ## 做任务 , ## 如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。 $total_money = $redis->hIncrBy($hash_key, 'money', $price); 2. ## 做任务 , ## 会先将域 field 的值设为 0 ,然后再执行加法操作 ## 为哈希表 key 中的域 field 加上浮点数增量 increment $total_money = $redis->hIncrByFloat($hash_key, 'money', $price);
管道 ( 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();本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn