本文共 1283 字,大约阅读时间需要 4 分钟。
产品描述:
1、开发一款高性能的24小时新闻推荐系统。后台操作: 管理后台,编辑可以手动推送文章到24小时推荐列表(以下简称推荐列表),文章审核通过后,满足一定规则的文章进入推荐列表(比如高于指定等级的用户等,不是本文讨论的重点,请自行查阅相关资料)。
前台展示: 用户如果没有登录的时候,是默认展示编辑推荐(获取系统精选文章)。当用户登录时,则展示用户关注的博主的文章和用户关注的领域(或者标签)的文章。
为了满足高性能的需求,我们采用 Redis 作为存储的数据库。 下面是流程示意图:2、文章列表的实现概述:
我们使用有序集合(zset)来存储文章id和文章权重(文章发表的时间戳), 使用 hash 存储文章字段。用户关注的博主和兴趣领域标签分别都是集合存储,可以方便的使用集合操作来实现关联操作。 下图是存储数据示意图: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]]);}
参考:
转载地址:http://dnuzz.baihongyu.com/