基于 Redis + PHP 实现 24小时新闻推荐系统

产品描述:
1、开发一款高性能的24小时新闻推荐系统。

后台操作: 管理后台,编辑可以手动推送文章到24小时推荐列表(以下简称推荐列表),文章审核通过后,满足一定规则的文章进入推荐列表(比如高于指定等级的用户等,不是本文讨论的重点,请自行查阅相关资料)。

前台展示: 用户如果没有登录的时候,是默认展示编辑推荐(获取系统精选文章)。当用户登录时,则展示用户关注的博主的文章和用户关注的领域(或者标签)的文章。
为了满足高性能的需求,我们采用 Redis 作为存储的数据库。
下面是流程示意图:
基于 Redis + PHP 实现 24小时新闻推荐系统_第1张图片
文章存储和读取示意图

2、文章列表的实现概述:
我们使用有序集合(zset)来存储文章id和文章权重(文章发表的时间戳), 使用 hash 存储文章字段。用户关注的博主和兴趣领域标签分别都是集合存储,可以方便的使用集合操作来实现关联操作。
下图是存储数据示意图:
基于 Redis + PHP 实现 24小时新闻推荐系统_第2张图片
24小时热文存储示意图
如何获取用户关注博主的文章列表的集合操作示意图:
基于 Redis + PHP 实现 24小时新闻推荐系统_第3张图片
感兴趣的博主文章列表集合操作

3、下面是伪代码的实现:

// 添加文章
add_article($article){
		$article_fields = [
			'article_id'  => $article['article_id'],
			'create_time' => strtotime($article['create_time']),
			'title'       => $article['title'],
			'user_id'     => $article['user_id'],
			'nickname' => $article['nickname'],
			'logo'        => $article['logo'],
			'cover'       => $article['cover'],
			'category' => $article['category'],
		];
		$this->redis->multi();
		$this->redis->hmset( 'article:' . $article['article_id'], $article_fields );
		$res = $this->redis->zadd('article:list', strtotime($article['create_time']), $article['article_id']);
		$this->redis->exec();
}

// 读取文章列表
get_articles_by_score($create_time_star, $create_time_end){
		return $this->redis->zRevRangeByScore('article:list', "$create_time_star" , "$create_time_end", ['withscores' => true, 'limit' => [0, $this->pagesize]]);
}

参考:
https://redis.io/

你可能感兴趣的:(redis)