Redis实现数据统计并支持时间范围内进行筛选排序

关于redis实现数据统计,以小说为例,统计小说的每天阅读人数,并支持90天内进行时间筛选小说阅读总人数排序展示,这种场景使用redis进行处理是非常合适的,具体实现会用到如下Redis集合和有序集合的方法:

  1. sAdd:向集合添加一个或多个成员
  2. zAdd:向有序集合添加一个或多个成员,或者更新已存在成员的分数
  3. zScore:返回有序集中,成员的分数值
  4. zCard:获取有序集合的成员数
  5. sIsMember:判断member元素是否是集合key的成员
  6. zRevRange:放回有序集中指定区间内的成员,通过索引,分数从高到低
  7. zUnionStore:计算给定的一个或多个有序集的并集,并存储在新的key中

具体实现流程如下所示:

1、接口埋点统计


// 判断当前用户是否存在
$date 	 = date('Ymd');
$userKey = 'book:read:user:' . $date . ':' . $bookId;
$isRead  = RedisTool::sIsMember($readKey, $uid);

// 用户当天第一次阅读
if(!$isRead) {
    // 当天书籍阅读人数加1
    $peopleKey = 'book:read:people:' . $date;
    $score = intval(RedisTool::zScore($peopleKey, $bookId));
    $score = $score + 1;
    RedisTool::zAdd($peopleKey, $bookId, $score);

    // 存储用户ID
    RedisTool::sAdd($userKey , $uid);
}

2、后台数据展示并支持近90天内筛选累计排序

// 获取筛选范围日期
$startDate = $_GET['start_date'];
$endDate   = $_GET['end_date'];

// 获取日期范围内的日期
$dateArr = DateTool::dateRange($startDate , $endDate);

// 获取日期范围内阅读人数key
$readKey = [];
foreach ($dateArr as $value) {
    array_push($readKey , 'book:read:people:' . $value);
}

// 根据日期范围的readKey生成新的key,通过并集获取所有的数据
$key = 'book:read:people:total:' . count($dateArr);
RedisTool::zUnionStore($key, $readKey);

// 获取搜索统计的数据长度/统计数据
$count = RedisTool::zCard($key);
$data  = RedisTool::zRevRange($key, 0, $count, true);

至此,$data就是我们想要查询某个日期范围内,书籍阅读总人数的信息,并按照人数降序展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值