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

上回寫(xiě)了使用Redis實(shí)現(xiàn)關(guān)注關(guān)系,這次說(shuō)說(shuō)使用Redis實(shí)現(xiàn)Timeline。
Timeline的實(shí)現(xiàn)一般有推模式、拉模式、推拉結(jié)合這幾種。
推模式:某人發(fā)布內(nèi)容之后推送給所有粉絲,空間換時(shí)間,瓶頸在寫(xiě)入;
拉模式:粉絲從自己的關(guān)注列表中讀取內(nèi)容,時(shí)間換空間,瓶頸在讀?。?br> 推拉結(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);

// 寫(xiě)入發(fā)布者自己的已發(fā)布列表
$redis->LPUSH("{$userID}:tweets", $feedID);

// 寫(xiě)入發(fā)布者自己的timeline
$redis->LPUSH("{$userID}:timeline", $feedID);

// 獲取發(fā)布者粉絲列表
$follwerIDs = $redis->SMEMBERS("1:followers");

// 寫(xiě)入
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從某種角度來(lái)說(shuō)是臨時(shí)性的,如果年代久遠(yuǎn),可不必操作粉絲的timeline。

后記

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

博客:http://blog.lovemydeer.com/2016/03/19/redis-timeline.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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 簡(jiǎn)書(shū)編輯器切換后只對(duì)新文章生效。。。 為了您更好的閱讀體驗(yàn),請(qǐng)看這篇:http://www.itdecent.cn...
    瘋子好好活閱讀 1,344評(píng)論 0 4
  • 概念 Redis是一個(gè)開(kāi)源的使用C語(yǔ)言編寫(xiě)、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value內(nèi)存數(shù)據(jù)庫(kù),...
    jiangmo閱讀 723評(píng)論 0 3
  • 轉(zhuǎn)載地址:http://gnucto.blog.51cto.com/3391516/998509 Redis與Me...
    Ddaidai閱讀 21,550評(píng)論 0 82
  • 今天是五一小長(zhǎng)假的最后一天,明天又要開(kāi)始上班了,這三天我過(guò)得在家渾渾噩噩,一天不起床,大家都跟朋友,同學(xué)同事,或者...
    熹微林閱讀 295評(píng)論 0 2
  • 今天把《王者速讀法》用導(dǎo)圖做了出來(lái)。是更清晰了,但是具體實(shí)踐由于書(shū)的類(lèi)型,內(nèi)容過(guò)于豐富,導(dǎo)致目的太多。如果只關(guān)注時(shí)...
    why國(guó)人閱讀 350評(píng)論 0 0

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