【redis有序集合操作】

【zcount:统计有序集合分数区间内的成员数量】
zadd user_login 1 one
zadd user_login 3 two
zadd user_login 4 three
zadd user_login 5 four

ZCOUNT 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
zcount user_login 1 4 => 3 (1<=score<=4)
zcount user_login 1 (4 => 2 (1<=score<4)
zcount user_login (1 (4 => 1 (1<score<4)

如果单纯统计整个有序集合的成员个数,使用ZCARD
zcard user_login //4

【zunionstore :合并若干个有序集合为新的有序集合】
ZUNIONSTORE 用于合并有序集合,例如把单个月内每天的有序集合key合并为一个总的key,再对这个月的key进行统计。
#将user_login和user_login_2两个集合合并为新的有序集合all_login。user_login和user_login_2的score分别乘以1和2,最后两个数组相同成员的分数相加(sum)。如果aggregate=max,则取两个数组中分数最大的成员。

zunionstore all_login 2 user_login user_login_2 weights 1 2 aggregate sum

#如果不加weights和aggregate参数,weights默认是传1,aggregate默认是传sum。

zunionstore all_login 2 user_login user_login_2

#单独指定aggregate=max

zunionstore all_login_max 2 user_login user_login_2 aggregate max

#查看合并后的有序集合

zrange all_login 0 -1 withscores

实战

在这里插入图片描述
在这里插入图片描述

zunionstore 可以不带weights和aggregate,weights默认是传1,aggregate默认是传sum。

在这里插入图片描述

或者不指定weights,指定aggregate=max.

在这里插入图片描述
【有序集合设置排行榜】
新增成员
zadd kyl_rank 30 xsd
删除成员
zrem kyl_rank cwx
为某个成员增加分数
zincrby kyl_rank 55 xsd

获取所有数据,从小到大排序
zrange kyl_rank 0 -1 withscores
获取所有数据,从大到小排序
zrevrange kyl_rank 0 -1 withscores
获取分数前三名
zrevrange kyl_rank 0 2 withscores

获取某个成员的分数
zscore kyl_rank swl
获取某个成员的排名
zrevrank kyl_rank cwx (第一名为0)
zrank正序 zrevrank倒序

实战

在这里插入图片描述
获取排名前三的成员
在这里插入图片描述

PHP统计日活和周活的代码实战

 /**
     * 统计日活、周活
     * 每天都会生成一个记录登录用户id的有序集合(UserLogin_20221230),有序集合的存储格式:[用户id => 设备类型(1安卓、2苹果)]
     */
    public function getActiveUserTest()
    {
        $redis = get_redis('redis_conf');//正式环境
        $key = 'UserLogin_'.date('Ymd');
        //获取当日的日活用户
        $actUserCount = $redis->zCard($key);
        //获取当日的日活设备
        $actADCount = $redis->zCount($key,'1','(2');//统计score在[1,2)区间(即score=1)的成员数量。这里是统计使用安卓设备的用户数量。
        $actIOSCount = $redis->zCount($key,'2','(3');//统计score在[2,3)区间 (即score=2)的成员数量。这里是统计使用苹果设备的用户数量。
      
        //获取当周的日期列表
        $week = date('N');//代表今天是星期几 1~7 => 周一~周日
        //$sunday = date('Ymd' ,strtotime( '-' . ($week-1) .' days', time()));//获取本周周一的日期
        $weekDayList = array();
        for ($i =1;$i<=7;$i++) {
            //获取本周的所有日期
            $weekDayList[] = date('Ymd' ,strtotime( '-' . ($week-$i) .' days', time()));
        }
        //合并当周的所有天数的有序集合
        $union_key = 'union_key_test';
        $redis->zUnionStore($union_key,$weekDayList,null,'MAX');
        //统计周活
        $actUserCount_week = $redis->zCard($union_key);
        $actADCount_week = $redis->zCount($union_key,'1','(2');
        $actIOSCount_week = $redis->zCount($key,'2','(3');
        $redis->del($union_key);//删除掉这个临时合并的有序集合
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值