redis常用其他命令

        

        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();


冷暖自知一抹茶ck
请先登录后发表评论
  • 最新评论
  • 总共0条评论