上回寫了一篇推模型的內容,這回分享一篇拉模型的內容。
拉模型拉模型就是展示微博的時候,獲取自己的所有關注的人,然後從關注的人中拉取最新微博。
微博專案資料結構設計
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,爬取微博內...