thinkphp5?操作redis?實(shí)現(xiàn)文章的熱度排行和點(diǎn)贊排行的示例
使用redis hash散列 和zset有序集合實(shí)現(xiàn)文章的熱度排行和點(diǎn)贊排行 1.首先為文章建立散列,存入基本信息。 mysql簡(jiǎn)單設(shè)計(jì)

獲取所有文章,并存入redis
//所有新聞頁(yè)
public function news()
{
$redis = new Redis();
$list = News::select();
foreach ($list as &$row){
//將所有數(shù)據(jù)存到hash散列里,用于顯示簡(jiǎn)介信息
$redis->handler()->hmset('newsId-'.$row->id,array('id'=>$row->id,'title'=>$row->title,'name'=>$row->name,'create_time'=>$row->create_time));
}
return json($list);//返回給前端所有數(shù)據(jù);
}2.初始化所有文章的瀏覽數(shù)和點(diǎn)贊數(shù)
//初始化文章熱度和點(diǎn)贊數(shù)
public function startNews()
{
$redis= new Redis();
$list = News::select();
foreach ($list as &$row){
//為每個(gè)文章添加熱度
$redis->zAdd('hot','0','newsId-'.$row->id);
//為每個(gè)文章添加點(diǎn)贊數(shù)
$redis->zAdd('good','0','newsId-'.$row->id);
}
dump($redis->zRange('hot','0','-1',true));
dump($redis->zRange('good','0','-1',true));
}結(jié)果
array(5) {
["newsId1"] => float(0)
["newsId2"] => float(0)
["newsId3"] => float(0)
["newsId4"] => float(0)
["newsId5"] => float(0)
}
array(5) {
["newsId1"] => float(0)
["newsId2"] => float(0)
["newsId3"] => float(0)
["newsId4"] => float(0)
["newsId5"] => float(0)
}
3.訪問(wèn)新聞 訪問(wèn)新聞時(shí),mysql正常讀取信息返回給前端,(此處不做代碼實(shí)現(xiàn))。然后熱度排行自動(dòng)增長(zhǎng)1.
$redis = new Redis();
$param = $this->request->param();
$news_id = $param['news_id'];
$list = News::where('id',$news_id)->find();//數(shù)據(jù)庫(kù)查到的信息,返回給前端
$redis->zIncRby('hot','1','newsId-'.$news_id);//redis數(shù)據(jù)增長(zhǎng)1
return json($list);4.點(diǎn)贊新聞
public function newsGoods()
{
$redis = new Redis();
$param = $this->request->param();
$news_id = $param['news_id'];
$redis->zIncRby('good','1','newsId-'.$news_id);//redis數(shù)據(jù)增長(zhǎng)1
}這時(shí)候基本業(yè)務(wù)代碼已經(jīng)完事。然后開(kāi)始查看排行。首先測(cè)試查看一下熱度排行和點(diǎn)贊排行的文章。
dump($redis->zRange('hot','0','-1',true));//查看熱度排行
dump($redis->zRange('good','0','-1',true));//查看點(diǎn)贊排行結(jié)果
熱度
array(5) {
["newsId-3"] => float(2)
["newsId-4"] => float(4)
["newsId-1"] => float(6)
["newsId-2"] => float(9)
["newsId-5"] => float(16)
}
點(diǎn)贊
array(5) {
["newsId-1"] => float(3)
["newsId-2"] => float(8)
["newsId-3"] => float(10)
["newsId-4"] => float(14)
["newsId-5"] => float(48)
}
5.查看熱度排行榜(包括新聞簡(jiǎn)介)注:可能有一種情況發(fā)生,文章id存在于排行榜中,但是對(duì)應(yīng)文章的簡(jiǎn)介不在內(nèi)存中,那就需要去數(shù)據(jù)庫(kù)重新查此id文章的內(nèi)容(我已經(jīng)刪除了newsId-2的簡(jiǎn)介)
//訪問(wèn)熱度排行
public function newsHot()
{
$redis = new Redis();
$rank = $redis->handler()->zrevrange('hot','0','2');
foreach ( $rank as &$row ){
$id = $row;
$row = $redis->hGetAll($row);//去hash散列里取得之前存好的文章簡(jiǎn)介
if(!$row){
//緩存里沒(méi)有該信息,去數(shù)據(jù)庫(kù)查找
$id = trim($id,'newsId-');//切割字符串。獲得文章id
$row = Db::name('news')->where('id',$id)->find();
}
}
dump($rank);
}結(jié)果
array(3) {
[0] => array(4) {
["title"] => string(15) "第五個(gè)文章"
["name"] => string(7) "作者5"
["create_time"] => string(19) "2019-11-28 14:33:43"
["id"] => string(1) "5"
}
[1] => array(7) {
["id"] => int(2)
["title"] => string(15) "第二個(gè)文章"
["name"] => string(7) "作者2"
["detail"] => string(8) "詳情22"
["create_time"] => string(19) "2019-11-28 14:33:43"
["hot"] => int(0)
["good"] => int(0)
}
[2] => &array(4) {
["title"] => string(7) "文章1"
["name"] => string(6) "作者"
["create_time"] => string(19) "2019-11-28 14:33:43"
["id"] => string(1) "1"
}
}
其中第二個(gè)文章在redis內(nèi)存中不存在,重新再數(shù)據(jù)庫(kù)中查到的數(shù)據(jù)
6.查看點(diǎn)贊排行榜(包括新聞簡(jiǎn)介)
//點(diǎn)贊熱度排行
public function newsGood()
{
$redis = new Redis();
$rank = $redis->handler()->zrevrange('good','0','2');
foreach ($rank as &$row){
$id = $row;
$row = $redis->hGetAll($row);//去hash散列里取得之前存好的文章簡(jiǎn)介
if(!$row){
//緩存里沒(méi)有該信息,去數(shù)據(jù)庫(kù)查找
$id = trim($id,'newsId-');//切割字符串。獲得文章id
$row = Db::name('news')->where('id',$id)->find();
}
}
dump($rank);
}結(jié)果:
array(3) {
[0] => array(4) {
["title"] => string(15) "第五個(gè)文章"
["name"] => string(7) "作者5"
["create_time"] => string(19) "2019-11-28 14:33:43"
["id"] => string(1) "5"
}
[1] => array(4) {
["title"] => string(15) "第四個(gè)文章"
["name"] => string(7) "作者4"
["create_time"] => string(19) "2019-11-28 14:33:43"
["id"] => string(1) "4"
}
[2] => &array(4) {
["title"] => string(15) "第三個(gè)文章"
["name"] => string(7) "作者3"
["create_time"] => string(19) "2019-11-28 14:33:43"
["id"] => string(1) "3"
}}
到此這篇關(guān)于thinkphp5 操作redis 實(shí)現(xiàn)文章的熱度排行和點(diǎn)贊排行的示例的文章就介紹到這了,更多相關(guān)thinkphp5 熱度排行和點(diǎn)贊排行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Yii實(shí)現(xiàn)自動(dòng)加載類地圖的方法
這篇文章主要介紹了Yii實(shí)現(xiàn)自動(dòng)加載類地圖的方法,涉及Yii加載類的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
phpstudy2020搭建站點(diǎn)的實(shí)現(xiàn)示例
這篇文章主要介紹了phpstudy2020搭建站點(diǎn)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
php檢測(cè)圖片木馬多進(jìn)制編程實(shí)踐
有制作圖片木馬的教程,并沒(méi)有找到檢測(cè)的程序,從制作原理來(lái)分析這種木馬程序,寫(xiě)了以下這個(gè)上傳類與大家分享下,感性的朋友可以參考下2013-04-04
laravel實(shí)現(xiàn)前后臺(tái)路由分離的方法
今天小編就為大家分享一篇laravel實(shí)現(xiàn)前后臺(tái)路由分離的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
實(shí)例分析PHP將字符串轉(zhuǎn)換成數(shù)字的方法
在本篇文章里我們給大家分享的是關(guān)于PHP將字符串轉(zhuǎn)換成數(shù)字的方法和相關(guān)知識(shí)點(diǎn),有興趣的朋友們學(xué)習(xí)下。2019-01-01
PHP+Mysql+jQuery實(shí)現(xiàn)發(fā)布微博程序 php篇
這篇文章主要介紹了PHP+Mysql+jQuery實(shí)現(xiàn)發(fā)布微博程序,重要介紹后臺(tái)是如何處理前臺(tái)提交的數(shù)據(jù),并返回結(jié)果的,需要的朋友可以參考下2015-10-10
Laravel實(shí)現(xiàn)搜索的時(shí)候分頁(yè)并攜帶參數(shù)
今天小編就為大家分享一篇Laravel實(shí)現(xiàn)搜索的時(shí)候分頁(yè)并攜帶參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
PHP讀書(shū)筆記整理_結(jié)構(gòu)語(yǔ)句詳解
下面小編就為大家?guī)?lái)一篇PHP讀書(shū)筆記整理_結(jié)構(gòu)語(yǔ)句詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07

