【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);//删除掉这个临时合并的有序集合
}