iT邦幫忙

DAY 15
2

社群網站是一堆文章一堆人的大集合,
哪些人訂誰的文章,發個文後,
又能自動推到訂閱者的版面,
用SQL的join來做的話,
table會被掃個不停。
redis用key-value、集合、lists解決。
社群網站的特性
歸結起來就是使用者及發文這兩者的互動,
使用者:有名字、能訂別人,能被別人訂
發文:像發消息、或貼圖片。
一個使用者可以有很多文章,
一篇文章屬於一個使用者。

以redis記錄人與發文的關係
利用這樣子的key來設定使用者編號、使用者名字、
文章內容、文章屬於誰:

redis 127.0.0.1:6379> set user:1:name twtw
redis 127.0.0.1:6379> set username:twtw 1
redis 127.0.0.1:6379> set post:1:content "Hi, I5"
redis 127.0.0.1:6379> set post:1:user 1

當使用者發了文章編號 1 2 3三篇,
利用lists來記錄使用者發文的先後編號:

redis 127.0.0.1:6379> lpush user:1:posts 1
redis 127.0.0.1:6379> lpush user:1:posts 2
redis 127.0.0.1:6379> lpush user:1:posts 3
redis 127.0.0.1:6379> LRANGE user:1:posts 0 -1
1) "3"
2) "2"
3) "1"

記錄訂閱或粉絲的關係
若user1訂閱user 2 3 4

redis 127.0.0.1:6379> sadd user:1:follows 2
redis 127.0.0.1:6379> sadd user:1:follows 3
redis 127.0.0.1:6379> sadd user:1:follows 4
redis 127.0.0.1:6379> smembers user:1:follows
1) "2"
2) "3"
3) "4"

user1被 user3所訂閱:

redis 127.0.0.1:6379> sadd user:1:followed_by 3
(integer) 1

所以當user1發文post1時,
只要找 user:1:followed_by 這key裡的內容,
就把 post:1 推到所有 followed_by 裡所有user id相關的key
類似像 lpush user:3:wall 1

記錄下一個新的使用者、文章的編號
下一個使用者或發文的編號是什麼,
可以利用 incr next_user_id、 incr next_post_id,
產生新帳號是透過程式語言用這樣子的流程:

incr next_user_id  (獲得新的[uid]使用者編號)
set user:[uid]:name [username] 
set username:[username] [uid]

而產生新文章是這樣子的流程:

incr next_post_id (獲得新的[pid]文章編號)
set post:[pid]:content [content]
set post:[pid]:user [uid]
lpush user:[uid]:posts [pid] (把文章編號推到作者的發文列表)
lpush posts:global [pid] (把文章編號推到整個網站的所有貼文的列表)

所以只要透過 key 的查詢,
就能很快獲得結果,
若要用 SQL 來進行同樣的功能,
要費的心力是更多的。
系列文章列表


上一篇
redis 的 PubSub 功能
下一篇
利用 redis 實現 Social Tagging 社會標籤功能
系列文
建立API為中心的輕量級網站30

2 則留言

我要留言

立即登入留言