十四 Redis 论坛构建

主要功能
用户账号
创建帖子、回复帖子、 为帖子投票
为帖子分类,查看属于特定分类的帖子
将多个分类(category)归类至某个标签(tab),查看属于特定标签的帖子
每日热议帖子排行榜
基于算法的帖子推荐



创建用户账号
注册 V2EX 账号要求输入用 户名、密码和电子邮件地址,并且用户名和电子邮件地址必须是未被使用的,这和微博的账号注册要求一样。
因此,我们可以重用之前的UniqueSet类来保证用户名和电子邮件地址的唯一性,并重用之前的User类来创建论坛账号


创建帖子
一个帖子的构成部分:
分类
标题
用户的投票数量
作者
发布事件
点击量
内容
TAG


创建帖子
程序会为用户创建的每个帖子分配一个唯一的帖子 ID ,然后将帖子 ID 、发布时间、点击量、标题、作 者的 ID、内容、分类、TAG 等信息储存到格式为 bbs::topic::<id> 的散列键里面
HMSET bbs::topic::131853 id 131853
                         time 1410165226
                         click_counter 0
                         title “WordPress 4.0 \“Benny\” 正式版发布......”
                         author_id 48771
                         content “WordPress 4.0 简体中文版现已开放下载,......”
                         category “WordPress”
                         tags JSON([“WordPress”, “简体”, “benny”])




查看帖子
V2EX 使用了两种方式来展示帖子,一种是按照分 类(category)来展示,另一种是按 标签(tag)来展示
接下来我们将逐一实现这两种展示帖子的方式




储存分类帖子
为了储存同一分类的帖子,并按照帖子最后一次被回复的 时间有序地排列帖子,程序会 为每个分类创 建一个键名为 bbs::category::<name> 的有序集合,其中有序集合的元素 为帖子的 ID ,而元素的分值 则是帖子最后一次被回复的 UNIX 时间戳。
例子,将最后一次回复 时间为 1410165226 ,ID 为 131853 的帖子归到 WordPress 分类里面:
ZADD bbs::category::WordPress 1410165226 131853
因为同一分类的帖子会被有序地 储存起来,所以程序只要 对有序集合调用 ZREVRANGE 命令,就可以 按照回复 时间从新到旧的 顺序,取出属于同一分 类的多个帖子。
我们可以将这些针对分类的操作抽象为 Category 类。

Category 类 API





Category 类使用示例

>>> wordpress_category = Category(client, “WordPress”)
>>> wordpress_category.include_topic(131853)
>>> wordpress_category.is_included(131853)
True
>>> wordpress_category.count_topic()
148

TAB类 API

Tab 类使用示例
>>> tech_tab = Tab(client, “技术”)
>>> tech_tab.add_member(“程序员”)
>>> tech_tab.add_member(“node.js”)
>>> tech_tab.add_member(“Linux”)
>>> tech_tab.is_member(“程序员”)
>>> tech_tab.include_topic(“程序员”, 132312)

 

ReplyDayRank类API


>>> rank = ReplyDayRank(client)
>>> rank.incr_reply_count(10086)      # ID 为 10086 的帖子获得了新回复,为它的计数值增一
>>> rank.incr_reply_count(12345)      # ID 为 12345 的帖子获得了新回复,为它的计数值增一
>>> rank.incr_reply_count(99999)      # ID 为 99999 的帖子获得了新回复,为它的计数值增一
>>> rank.get_top(10)                  # 返回今日回复排名前十的帖子



帖子推荐系统的实现

为了实现帖子系统,我们选择了 Reddit 使用的推荐算法( reddit_algorithm.py),这个算法进行评分时考 虑的是帖子的发布时间、获得的支持票数量以及反 对票数量,这个算法用于计算评分的函数为:hot (ups, downs, date)
算法的具体解释可以在这篇博客里面找到: http://www.ruanyifeng. com/blog/2012/03/ranking_algorithm_reddit.html
推荐标签包含的帖子仍然使用有序集合来 储存,其中有序集合的元素 为帖子的 ID ,而元素的分值则是 算法为帖子计算出的评分。
当用户创建一个帖子的时候,或者有用户对帖子进行投票之后,我们就调用 how 函数来更新帖子的评 分。
我们将帖子推荐系统的相关操作抽象为 TopicRecommand 类

TopicRecommand 类 API

>>> recommand = TopicRecommand(client)
>>> recommand.update_rank(10086,10,3,1410173496)
>>> recommand.paging(1,10)
各项功能以及他们的实现方式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值