关于redis实现数据统计,以小说为例,统计小说的每天阅读人数,并支持90天内进行时间筛选小说阅读总人数排序展示,这种场景使用redis进行处理是非常合适的,具体实现会用到如下Redis集合和有序集合的方法:
- sAdd:向集合添加一个或多个成员
- zAdd:向有序集合添加一个或多个成员,或者更新已存在成员的分数
- zScore:返回有序集中,成员的分数值
- zCard:获取有序集合的成员数
- sIsMember:判断member元素是否是集合key的成员
- zRevRange:放回有序集中指定区间内的成员,通过索引,分数从高到低
- zUnionStore:计算给定的一个或多个有序集的并集,并存储在新的key中
具体实现流程如下所示:
1、接口埋点统计
$date = date('Ymd');
$userKey = 'book:read:user:' . $date . ':' . $bookId;
$isRead = RedisTool::sIsMember($readKey, $uid);
if(!$isRead) {
$peopleKey = 'book:read:people:' . $date;
$score = intval(RedisTool::zScore($peopleKey, $bookId));
$score = $score + 1;
RedisTool::zAdd($peopleKey, $bookId, $score);
RedisTool::sAdd($userKey , $uid);
}
2、后台数据展示并支持近90天内筛选累计排序
$startDate = $_GET['start_date'];
$endDate = $_GET['end_date'];
$dateArr = DateTool::dateRange($startDate , $endDate);
$readKey = [];
foreach ($dateArr as $value) {
array_push($readKey , 'book:read:people:' . $value);
}
$key = 'book:read:people:total:' . count($dateArr);
RedisTool::zUnionStore($key, $readKey);
$count = RedisTool::zCard($key);
$data = RedisTool::zRevRange($key, 0, $count, true);
至此,$data就是我们想要查询某个日期范围内,书籍阅读总人数的信息,并按照人数降序展示
|