iT邦幫忙

DAY 16
1

建立API為中心的輕量級網站系列 第 16

利用 redis 實現 Social Tagging 社會標籤功能

以前分享過 [RoR] 小小複雜建置 Social Tagging 社會標籤功能
是用 MySQL 做社會標籤的功能,
有點複雜,相對地用redis的集合概念,
更易了解建置。
以編號1的發文,要加上ruby及中文兩個標籤:

redis 127.0.0.1:6379> sadd post:1:tags ruby 中文
(integer) 2
redis 127.0.0.1:6379> smembers post:1:tags
1) "\xe4\xb8\xad\xe6\x96\x87"
2) "ruby"

而在印出這文章時,要把標籤連結提供出來,
就只要用 smembers 把集合內的元素列出並做連結。
同時要把文章的編號加到各籤內,
這樣要列出有此標籤的各文章篇號,
smembers 就列了出來。

redis 127.0.0.1:6379> sadd tags:ruby 1
(integer) 1
redis 127.0.0.1:6379> sadd tags:中文 1
(integer) 1
redis 127.0.0.1:6379> smembers tags:中文
1) "1"

如果又想要做個「個人化」的社會標籤,
[RoR] 小小複雜模仿 del.icio.us 的個人化的社會標籤 per user tagging
就需要再多一些key,
模擬做個類似delicious.com 的個人化的書籤網站,
先用程式語言把url給編碼:

>> require 'digest/md5'
>> Digest::MD5.hexdigest('http://maketecheasier.com/10-funny-and-useless-linux-command/2012/03/22')
 => "2b8439a1f554000ac187b7cef574c616"

利用此編碼為此網址的key

redis 127.0.0.1:6379> hmset url:2b8439a1f554000ac187b7cef574c616 url http://maketecheasier.. title "Funn.."
redis 127.0.0.1:6379> hgetall url:2b8439a1f554000ac187b7cef574c616
1) "url"
2) "http://maketecheasier.com/10-funny-and-useless-linux-command/2012/03/22"
3) "title"
4) "10 Funny And Useless Linux Command"

所以這個網頁的title與url以此key而來。
當我做了此網址書籤,
並且加上ascii-art figlet fun CLI linux標籤,
會有以下幾個key產生:
以產生ascii-art這個標籤,
並看這標籤在該網站的網址:
http://delicious.com/tag/ascii\_-\_art
雖然看似要:
sadd tags:ascii-art 2b8439a1f554000ac187b7cef574c616
但裡面是以多少人存其為書籤的數量排序,
所以key可能類似像:
zadd tags:ascii-art 1231 2b8439a1f554000ac187b7cef574c616
zincrby tags:ascii-art 1 2b8439a1f554000ac187b7cef574c616
當要查ascii-art的標籤有哪些網站,就可馬上把score的排序結果叫出。
http://delicious.com/url/2b8439a1f554000ac187b7cef574c616
怎麼記錄依序存成書籤的時間、使用者、說明、標籤
可能是:lpush comments:2b8439a1f554000ac187b7cef574c616 "{date:xxxx,user:bamanzi,tag:xxx...}" list的型態。
而個人的所有的ascii-art標籤的網站http://delicious.com/twtw/ascii\_-\_art
可能類似:sadd utag:twtw:ascii-art 2b8439a1f554000ac187b7cef574c616
但又是有以加入的時間排序,
就可能是:lpush utag:twtw:ascii-art "date:xxx,url:2b8439a1f554000ac187b7cef574c616,tag:xxx..."
而user對該url的所有tag,是以 sadd uurl:twtw:2b8439a1f554000ac187b7cef574c616 ascii-art figlet fun CLI linux
加到屬性為集合的key裡。
以上是粗略地推敲可這樣利用redis來建置,
但一些細節,並未真正實現或有些漏洞,
與 SQL 建置的 per user tags 的方式來比較,
標籤在每個資料表間的關係,太密切,
而redis的key之間的關係,太鬆散,
而需要把關係建立到不同的key裡來連結。

從redis的方案來看社會標籤,
大概就是以 集合 來處理個人對一個對象的標籤,
以 lists 來記錄 一網址被搜集的時間先後,
也記錄個人某一標籤裡不同網址的搜集先後,
用 sorted Sets 來排列、記錄一個標籤在整個站裡,
哪個url被做書籤的記錄最多。

也許一些目前用SQL的方案,
可試著用redis的處理資料的方式,
做為輔助之用。

系列文章列表


上一篇
redis 在社群網站的應用
下一篇
在 redis 的計數應用
系列文
建立API為中心的輕量級網站30

1 則留言

我要留言

立即登入留言