Redis實(shí)現(xiàn)Timeline

簡(jiǎn)書編輯器切換后只對(duì)新文章生效。。。

為了您更好的閱讀體驗(yàn),請(qǐng)看這篇:http://www.itdecent.cn/p/4cb7e8c5e0cd

exit();


























上回寫了[使用Redis實(shí)現(xiàn)關(guān)注關(guān)系][1],這次說說使用Redis實(shí)現(xiàn)Timeline。

Timeline的實(shí)現(xiàn)一般有推模式、拉模式、推拉結(jié)合這幾種。

推模式:某人發(fā)布內(nèi)容之后推送給所有粉絲,空間換時(shí)間,瓶頸在寫入;

拉模式:粉絲從自己的關(guān)注列表中讀取內(nèi)容,時(shí)間換空間,瓶頸在讀??;

推拉結(jié)合:某人發(fā)布內(nèi)容后推送給`活躍粉絲`,不活躍粉絲則使用拉取。

目前只討論推模式,考慮單個(gè)feed內(nèi)容實(shí)體存入散列(hashes)、每個(gè)用戶的timeline列表存入列表(lists)。

### 1、發(fā)布

發(fā)布者發(fā)布內(nèi)容后,生成唯一feedID,以feedID為key存入hashes。

首先從發(fā)布者的粉絲表里獲取所有粉絲,再進(jìn)行推送。

邏輯如下:

// 使用Redis INCR操作,生成唯一postID

$feedID = $redis->INCR("global:postID");

// 存入Hashes

$feedData = [

'userID' => 1,

'timestamp' => '1458680000',

'content' => '這是一條tweet',

'platform' => 'web',

];

$redis->HSET($feedID, $feedData);

// 寫入發(fā)布者自己的已發(fā)布列表

$redis->LPUSH("{$userID}:tweets", $feedID);

// 寫入發(fā)布者自己的timeline

$redis->LPUSH("{$userID}:timeline", $feedID);

// 獲取發(fā)布者粉絲列表

$follwerIDs = $redis->SMEMBERS("1:followers");

// 寫入

foreach ($follwerIDs as $followerID) {

$redis->LPUSH("{$followerID}:timeline", $feedID);

}

### 2、讀取

某用戶登陸之后,獲取timeline Lists中的值,再?gòu)腍ashes取數(shù)據(jù)進(jìn)行處理。

$feedIDs = $redis->LRANGE("{$userID}:timeline", 0, 30); //取30條數(shù)據(jù)

foreach ($feedIDs as $feedID) {

$feedData = $redis->HGETALL($feedID);

// TODO:進(jìn)一步進(jìn)行處理、整合等操作。

}

### 3、刪除

當(dāng)發(fā)布者刪除某條消息后,循環(huán)所有粉絲列表,并執(zhí)行刪除操作。

// 從發(fā)布者自己的已發(fā)布刪除掉

$redis->LREM("{$userID}:tweets", 1, $feedID);

// 從發(fā)布者自己的timeline刪除掉

$redis->LREM("{$userID}:timeline", 1, $feedID);

// 獲取發(fā)布者粉絲列表

$follwerIDs = $redis->SMEMBERS("1:followers");

// 刪除

foreach ($follwerIDs as $followerID) {

$redis->LREM("{$followerID}:timeline", 1, $feedID);

}

timeline從某種角度來說是臨時(shí)性的,如果年代久遠(yuǎn),可不必操作粉絲的timeline。

### 后記

Timeline系統(tǒng)說起來會(huì)很復(fù)雜,也不可能只靠Redis去實(shí)現(xiàn)。本文只是一個(gè)大體的思路,應(yīng)對(duì)小數(shù)據(jù)量基本足夠。

博客:http://blog.lovemydeer.com/2016/03/19/redis-timeline.html

[1]: http://blog.lovemydeer.com/2016/03/13/relation-with-redis.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容