ホームページ  >  記事  >  バックエンド開発  >  PHP + Redis は、Sina Weibo_PHP チュートリアルに似たフィード システムを作成します

PHP + Redis は、Sina Weibo_PHP チュートリアルに似たフィード システムを作成します

WBOY
WBOYオリジナル
2016-07-13 10:05:30889ブラウズ

php + Redisは新浪微博のフィードシステムに似て書かれています

最近、Weibo のようなフィード システムのアウトソーシングを引き継ぎました。クライアントはiosとandroid、サーバーはphp、データベースはredisを使用します。サーバー部分とデータベース部分の機能を共有!みんなが助けてくれることを願っています。
Redis の概要については、この Baidu 百科事典をご覧ください。
1 つ目は、アカウント番号、ニックネーム、署名、会社、アバターなどの基本的なユーザー情報です。redis のハッシュ構造 (マップのキーと値のペアに似たデータ構造) は次のとおりです。実行中ですが、引き続き hgetAll コマンドを使用します。そのため、ネットワーク リクエストは 1 つだけになります)。プレーヤーのファン、フォロワー、投稿などの基本情報のみを保存するために他のデータ構造を使用することに注意してください。
パブリック関数 updateUInfo($name,$sign,$head,$from)
{
$redisCli = 新しい Redis(ServerConfig::$redisAddr);
$redisCli->hSet("user:$this->uid",'sign',$sign);
$redisCli->hSet("user:$this->uid","name",$name);
$redisCli->hSet("user:$this->uid","head",$head);
$redisCli->hSet("user:$this->uid","from",$from);
$redisCli->set("アカウント:$name:uid",$this->uid);
}
コア 1: フォローとファン システム!各ユーザーは自分自身の注目とファン システムを維持する必要があります。これらは、redis コレクション タイプ (Java の hashSet および stl の set に相当し、コレクション内の要素は一意です) を使用して、それぞれ user:$uid:followings と user:$uid:followers の 2 つのフィールドで表されます。
ユーザーの話を聞く(mutliはredisが提供するトランザクションなので、誰かの話を聞いているのに躊躇してしまう、他の人のファンから漏れてしまうなどの現象を回避できます)
パブリック関数 addFollowing($tid)
{
$redisCli = 新しい Redis(ServerConfig::$redisAddr);
if($redisCli->sismember("user:$this->uid:followings",$tid) == 1)
{
戻る;
}
$redisCli->multi();
$redisCli->sAdd("user:$this->uid:followings",$tid);
$redisCli->sAdd("user:$tid:followers",$this->uid);
$redisCli->exec();
}
ユーザーの話を聞くのをキャンセルする:
パブリック関数removeFollowings($tid)
{
$redisCli = 新しい Redis(ServerConfig::$redisAddr);
if($redisCli->sismember("user:$this->uid:followings",$tid) == 0)
{
戻る;
}
$redisCli->multi();
$redisCli->sRem("user:$this->uid:followings",$tid);
$redisCli->sRem("user:$tid:followers",$this->uid);
$redisCli->exec();
}
コア 2: 投稿の更新について話しましょう:
1 つ目は、投稿の基本データ構造です。これは、Redis のハッシュ構造を使用した、上記のユーザーの基本データ構造と同じです。
クラスの投稿{
//ここにコードを入力してください
プライベート $postId = 0;
プライベート $timeStamp = 0;
プライベート $uid = 0;
プライベート$content = "";
プライベート $subPosts = array();
プライベート $originPostId = -1;
プライベート $tags = array();
パブリック関数 __construct($id,$time,$content,$postId) {
$this->uid = $id;
$this->timeStamp = $time;
$this->content = $content;
$this->postId = $postId;
}
パブリック関数 setOriginPostId($postId)
{
$this->originPostId = $postId;
}
パブリック関数 getPostId()
{
$this->postId;
を返す
}
パブリック関数 getTimeStamp()
{
$this->timeStemp; を返す
}
パブリック関数 getUid()
{
$this->uid; を返す
}
パブリック関数 getContent()
{
$this->content;
を返す
}
パブリック関数 getWebTitle()
{
$this->webTitle;
を返す
}
パブリック関数pushPostId($postId)
{
$this->subPosts[] = $postId;
}
パブリック関数 saveToDb()
{
$redisCli = 新しい Redis(ServerConfig::$redisAddr);
$redisCli->hSet("post:$this->postId","uid",$this->uid);
$redisCli->hSet("post:$this->postId","time",$this->timeStamp);
$redisCli->hSet("post:$this->postId","content",$this->content); 
$redisCli->hSet("post:$this->postId","originPostId",$this->originPostId);
$redisCli->set("post:$this->webTitle:$this->postId",$this->postId);
foreach($this->tags as $tag)
{
$redisCli->sAdd("post:$this->postId:tags",$tag);
}
foreach($this->subPosts as $postId)
{
$redisCli->lPush("post:$this->postId:subPost",$postId);
}
}
}
当用户発行一帖子の時候、他のすべての粉丝必须看得他の帖子才可!推論:ユーザーが新しいジョークを発行するたびに、他のすべてのジョークの ID が自動的に通知されます。他の粉砕は最新のコンテンツの時刻を要求するため、すべての関係者が最新のノートを取得し、その後時間順に取得する必要があります。拉致方法は、普通のユーザーが推すようなものですが、大明星が数千万の粉塵を持っていて、一冊の雑誌を配布するとき、必要な粉塵が拉致される方法で取得されます!
用户発行一新帖子の操作:
公開関数投稿($title,$content,$tags)
{
$redisCli = 新しい Redis(ServerConfig::$redisAddr);
$postId = postUtil::generateNewPostId();
$redisCli->Set("user:$this->uid:postTime",time());
$redisCli->lPush("user:$this->uid:news",$post->getPostId());
$followers = $redisCli->sMembers("user:$this->uid:followers");
foreach($フォロワーを$フォロワーとして)
{
$redisCli->lPush("user:$follower:news",$post->getPostId());
}
}
すべての投稿 ID をファン (「user:$uid:news」) にプッシュします。ここではシーケンシャル キュー構造が使用されています。基本的には時間順に並んでいます(最新の投稿が常に左側にあります)!投稿のすべてのコンテンツをこのフィールドに入力するわけではありませんが、値には投稿の ID が格納され、ユーザーが新しい情報を要求すると、投稿のコンテンツを自分で取得します。
人気のユーザー/人気の投稿、Redis は順序付きコレクション タイプを提供しているので、この順序付きコレクション タイプを使用して人気のある人気ユーザー ランキングや人気投稿ランキングを行うことができます。たとえば、ファンの数に基づいてユーザーをランク付けしたり、人気のあるユーザーの上位 20 人を取得したり、読まれた投稿の数に基づいて人気の投稿をランク付けしたりできます。
こんな簡単な給餌システムが完成しました!しかし、大きくなりたい場合は、まだ多くのシステムを実行する必要があります。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/963616.html技術記事 php + Redis で書かれたフィード システムは Sina Weibo に似ています。最近、Weibo に似たフィード システムのアウトソーシングを引き継ぎました。クライアントはiOSとAndroid、サーバーはphpを使用し、データベースは...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。