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