論壇構建
介紹如何使用 Redis 去構建一個論壇 主要功能 使用者帳號 建立文章、回複文章、為文章投票 為文章分類,查看屬於特定分類的文章 將多個分類(category)歸類至某個標籤(tab),查看屬於特定標籤的文章 每日熱議文章熱門排行榜 基於演算法的文章推薦 一個文章的構成部分: 分類 標題 使用者的投票數量 作者 發布時間 點擊量 內容 TAG 根據分類展示文章
分類頁面會根據文章最後一次被回複的時間來排序文章。 Category 類
| API |
作用 |
實現原理 |
| Category(client, name) |
設定用戶端以及分類的名字。 |
|
| include_topic(topic_id) |
將給定的文章添加到當前分類中。 |
ZADD |
| is_included(topic_id) |
檢查給定的文章是否屬於當前分類。 |
使用 ZSCORE 檢查有序集合中,topic_id 對應的分值是否存在,如果不存在,那麼文章不屬於該分類。 |
| count_topic() |
返回當前分類包含的貼文量。 |
ZCARD |
| paging(n, count) |
按 count 個文章為一頁,返回該分類第 n 頁的文章。 |
ZREVRANGE |
根據標籤展示文章
一個標籤可以包含多個分類,而屬於被包含分類的文章會出現在標籤的列表裡面。 實現標籤功能需要兩個步驟: 記錄標籤和分類之間的關係。
舉個例子,程式要記住,”程式員”、”Linux”、”node.js”這些分類都屬於”技術”標籤。 記錄標籤屬下的文章,當使用者點擊某個標籤時,展示該標籤屬下的各個文章。
舉個例子,文章 132312 屬於”程式員”分類,而該分類又屬於”技術”標籤,所以程式應該在使用者點擊”技術”頁面時,展示出文章 132312 。 Tag 類
| API |
作用 |
實現原理 |
| Tag(client, tag_name) |
設定用戶端和標籤的名字。 |
|
| add_member(category_name) |
將給定的分類添加到當前標籤裡面。 |
SADD |
| is_member(category_name) |
檢查給定的分類是否屬於當前標籤。 |
SISMEMBER |
| get_all_member() |
返回當前標籤包含的所有分類。 |
SMEMBERS |
| count_member() |
返回標籤包含的分類數量。 |
SCARD |
| include_topic(category_name, topic_id) |
將給定分類的文章添加到當前標籤的貼文清單裡面。 |
ZADD |
| paging(n, count) |
返回標籤包含的文章。 |
ZREVRANGE |
| count_topic() |
返回標籤目前包含的貼文量。 |
ZCARD |
回複文章
使用者可以對文章進行回複。每條回複會至少會包含作者、回複時間和回複內容這些資訊。並且每個文章都需要一個列表來儲存所有回複。這和我們之前為了實現微博評論而建立的 Comment 類和 CommentList 類的需求基本相同,所以只要對這兩個類進行一些簡單的修改,就可以重用它們了。 每日熱議文章排行
每日熱議文章熱門排行榜展示了每天回複數量最多的文章, 這個熱門排行榜每天更新一次。
為了實現這個熱門排行榜,程式需要使用一個鍵名為 bbs::reply_day_rank 的有序集合,其中有序集合的元素為文章的 ID ,而元素的分值則是文章在當前被回複的數量。
每當 ID 為 N 的文章新增一條回複時,程式就執行以下命令來增加文章在熱門排行榜中的回複數量:
ZINCRBY bbs::reply_day_rank N 1
並且程式會為 bbs:reply_day_rank 設定存留時間,讓它在一天之後自動到期,並自動建立新榜單。
這可以通過修改並重用之前介紹過的 DayRank 類來實現。 ReplyDayRank 類
| API |
作用 |
實現原理 |
| ReplyDayRank(client) |
設定用戶端。 |
|
| incr_reply_count(topic_id) |
為給定文章的回複計數值增一。 |
ZINCRBY |
| get_top(n) |
返回熱門排行榜中排名前 N 的文章。 |
ZREVRANGE |
文章推薦系統
演算法對文章進行評分時,考慮的因素可能有:使用者的貢獻值、發布時間、使用者的投票數、使用者的回複數量,等等。
實現推薦系統的方法: 選擇一個推薦演算法,用於計算文章的評分。 計算各個文章的評分,並以有序的方式展示它們。
TopicRecommand 類
| API |
作用 |
實現原理 |
| TopicRecommand(client) |
設定用戶端。 |
|
| update_rank(topic_id, upvote,downvote, post_time) |
更新文章的推薦評分。 |
ZADD |
| paging(n, count) |
返回演算法推薦的第 n 頁的文章。 |
ZREVRANGE |