PHP redis實現微博的拉模型案例詳解

2022-09-26 05:12:09 字數 2647 閱讀 3545

上回寫了一篇推模型的內容,這回分享一篇拉模型的內容。

拉模型拉模型就是展示微博的時候,獲取自己的所有關注的人,然後從關注的人中拉取最新微博。

微博專案資料結構設計

user表設計

註冊的時候將user資料寫入redis中,key如下:

user資料的key

使用者名稱=user:uesrid:$uesrid:username

密碼=user:userid:$userid:password

還需要這樣寫乙份,因為需要靠使用者名稱來登入,這樣就可以根據使用者名稱來查詢使用者id。

user:username:userid:$userid

關注的人和粉絲設計

每個使用者在產生關注的動作後,在redis中維護兩個無序集合set,乙個是following,乙個是follower,following集合儲存的是我關注的人,follower集合儲存的是我的粉絲。注意是每個使用者都要維護這樣的兩個集合,用userid來區別。

單條微博表設計

每條微博的資訊用hash結構來儲存,根據不同的微博id來區分,每條微博有如下資訊:發布人id,發布人暱稱,發布時間,微博內容。

拉取關注者微博表 設計

每個使用者發布微博後,維護20條最新微博,並儲存到有序集合sorted set中,用不同的userid來區分。

注意:有序集合的score用微博id,集合儲存的也是微博id。

個人微博表

每個使用者維護自己的微博,儲存到鍊錶中,只儲存1000條,redis中只儲存1000條微博資料,如果想查詢更多,去資料庫中查詢。

個人已拉取表設計

每個使用者在拉取微博後,將微博儲存到已經拉取的表中,這個表是乙個鍊錶結構,最多儲存1000條微博。

發布微博

首先將微博儲存成hash結構,然後將微博儲存到拉取表,還儲存到個人微博表。

//1、儲存微博

$conn = connredis();

$postid = $conn->incr('global:postid');

$conn->hmset('post:postid:'.$postid,['userid'=>$user['userid'],'username'=>$user['username'],'time'=>time(),'content'=>$content]);

//2、每個人維護20條最新微博,儲存到有序集合中

$conn->程式設計客棧zadd('starpost:userid:'.$user['userid'],$postid,$postid);

if($conn->zcard('starpost:userid:'.$user['userid']) > 20)

//3、維護個人的1000條微博,儲存到鍊錶中

$conn->lpush('mypost:userid:'.$user['userid'],$postid);

if($conn->llen('mypost:userid:'.$user['userid']) > 1000)

展示微博

首先獲取所有關注的人,獲取上次拉取微博的位置,根據上次拉取的微博位置來拉取資料。然後給微博排序,設定新的拉取的位置,寫入到已拉取表中,獲取微博的詳細內容,最後獲取粉絲和關注數。進行展示即可。

//1、獲取拉取物件

$stars = $conn->smembers('following:'.$user['userid']);//獲取所有關注的人

$stars = $user['userid'];//需要拉取自己的微博

//2、獲取上次拉取的位置

$lastpull = $conn->get('lastpull:userid:'.$user['userid']);

if(!$lastpull)

//3、拉取微博

$latest = ;

foreach($stars as $star)

//4、給微博排序

sort($latest,sort_numeric);

//5、設定拉取的位置

if(!empty($latest))

//6、寫入到已拉取表中

foreach($latest as $l)

$conn->ltrim('receivepost:'.$user['userid'],0,999);//至多顯示1000條微博

//7、獲取微博的詳細內容

$postids = $conn->sort('receivepost:'.$user['userid'],['sort'=>'desc']);

$posts = ;

foreach($postids as $postid)

//8、獲取粉絲和關注數

$fansnum = $conn->scard('follower:'.$user['userid']);

$follownum = $conn->'following:'.$user['userid']);

q&a如何保證拉取的資料時最新的?

在拉取的時候,將最近拉取的微博id儲存到redis中,然後下次我們只需要去拉取比這次儲存的微程式設計客棧博id大的微博,就可以保證拉取的資料是之前沒有拉取的。

如何拉取所有關注者的資料?

遍歷關注者,然後拉取資料

假設拉取a關注者的微博1,4,5 b關注者2,3,但是他們的發布時間交錯,怎麼展示資料?

將所有關注者的最新微博都取出來,然後根據微博id進行排序。

autojs微博 js實現微博發布小功能

微博發布功能,可發布可刪除。樣式沒設定忽略,主要知識點及注意點 1 動態新增節點標籤。2 內容為空時不能發布。3 新發布的內容要在上面。4 內容刪除要同時刪除掉節點。5 為保持樣式輸入框要設定為不可拖拽。document box border 1px solid 000 width 600px he...

實戰新浪微博 騰訊微博的分享功能

算上也是半年前做的,今天翻出來放出來,作為日誌記錄,也許能幫助一些人。我做的大概介面是如下圖。呵呵,上面這些都是些預備工作。下面正式開發。以上就是工程上設定。下面具體 以下處理sina的相關 以下是處理sina的授權驗證函式,qq的未寫。void removeauthdata bool islogg...

爬取微博指定使用者的微博內容

使用python3爬取微博指定使用者的內容 import urllib.request import json 定義要爬取的微博大v的微博id id 5866810652 設定 ip proxy addr 192.168.1.101 定義頁面開啟函式 獲取微博主頁的containerid,爬取微博內...