php redis實(shí)現(xiàn)文章發(fā)布系統(tǒng)(用戶投票系統(tǒng))
本文實(shí)例為大家分享了php實(shí)現(xiàn)文章發(fā)布系統(tǒng)、用戶投票系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
/** * @data 文章發(fā)布 * 文章詳情散列表中遞增ID,講文章發(fā)布者ID寫(xiě)入投票用戶集合中,設(shè)置投票時(shí)間為一周 * 講文章內(nèi)容寫(xiě)入文章散列中,講文章寫(xiě)入文章評(píng)分有序集合和文章發(fā)布有序集合中 * @author Lorne * @date 2017-03-03 */ public function post_article($user){ $VOTE_SCORE = 24; $redis = $this -> redis; $key= "queue"; $ONE_WEEK_IN_SECONDS= 7*86400; $redis -> multi($key); //生成新的文章id $article_id = $redis -> incr("article:",$key); //文章已投票用戶名單 $voted = "voted:".$article_id; $this->redis->sadd($voted,$user,$key); //設(shè)置過(guò)期時(shí)間(為1周) $this->redis->expipre($voted,$ONE_WEEK_IN_SECONDS,$key); //獲取現(xiàn)在的時(shí)間 $now =time(); $article = "article:".$article_id; $data = ['title'=>'測(cè)試1','link'=>'www.hahaha.com','poster'=>$user,'tine'=>$now,'votes'=>1]; //$data = json_encode($data); $redis -> hmset($article,$data,$key); //將文章添加到根據(jù)時(shí)間排序有序集合和根據(jù)評(píng)分排序有序結(jié)合中 $this -> redis -> zadd("score:",1,$article,$key); $this -> redis -> zadd("time:",$now,$article,$key); $redis -> exec($key); }
/** * @data 用戶投票 * 獲取文章的ID,用戶ID,判斷該篇文章是否已經(jīng)過(guò)了投票時(shí)間,再判斷用戶是否已經(jīng)投過(guò)票 * 寫(xiě)入文章對(duì)應(yīng)投票用戶表中(voted:文章ID),對(duì)應(yīng)的文章評(píng)分加,文章詳情內(nèi)容中的votes統(tǒng)計(jì)加1 * @author Lorne * @date 2017-03-03 */ public function article_vote(){ $ONE_WEEK_IN_SECONDS= 7*86400; $article = "article:3"; $user = "user:7777"; $redis = $this -> redis; $key= "queue"; $cutoff = time() - $ONE_WEEK_IN_SECONDS; //文章發(fā)布時(shí)間和投票截止日期對(duì)比 if($redis->zscore('time:',$article,$key) < $cutoff){ var_dump("該文章已過(guò)投票時(shí)間!");exit; } $article_id = explode(':',$article)['1']; if($redis->sadd('voted:'.$article_id,$user,$key)){ $redis -> zincrby('score:',$article,1,$key); $redis -> hincrby($article,'votes',1,$key); }else{ var_dump("您已經(jīng)投過(guò)票了!");exit; } }
/** * @data 文章列表分頁(yè) * 對(duì)文章評(píng)分有序集合或者時(shí)間發(fā)布有序集合做分頁(yè)處理,獲取文章ID后,去文章詳情散列表中查詢?cè)撐恼略斍? * @author Lorne * @date 2017-03-03 */ public function get_articles($page =1,$orders =''){ $redis = $this->redis; $db = "queue"; //$orders = "time:"; $per_page = 3; $start = ($page-1)*$per_page; $end = $start + $per_page -1; $ids = $redis -> zrevrange($orders,$start,$end,$db); foreach($ids as $key=>$val){ $data = $redis -> hgetall($val,$db); $data['id'] = $val; $articles[] = $data; } return $articles; }
/** * @data 文章添加組和移除組 * 講該文章加入不同的分組中,或者從個(gè)分組中移除該篇文章 * @author Lorne * @date 2017-03-03 */ public function add_remove_group($article_id,$to_add = [],$to_remove = []){ $redis = $this->redis; $db = "queue"; $article = "article:".$article_id; foreach($to_add as $key=>$val){ $redis -> sadd('group:'.$val,$article,$db); } foreach($to_remove as $key=>$val){ $redis -> srem('grouo:'.$val,$article,$db); } }
/** * @data 組集合中的文章根據(jù)評(píng)分或者時(shí)間分頁(yè)排序 * * @author Lorne * @date 2017-03-03 */ public function get_grouop_articles($orders = "time:"){ $redis = $this -> redis; $db = "queue"; $group = '開(kāi)發(fā)'; $key = $orders.$group; if($redis -> exists($key,$db)){ $argument = 2; $data = $redis -> zinterstore($key,$argument,['group:'.$group,$orders],$db); //$this -> expire($key,60,$db); } return $this->get_articles(2,$key); }
采用php+redis,簡(jiǎn)易的實(shí)現(xiàn)文章發(fā)布系統(tǒng),用戶投票,文章分組,分頁(yè)排序。
redis是一個(gè)高性能的key-value存儲(chǔ)系統(tǒng),最為常見(jiàn)的5大類型:string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型),和memcache區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤或者把修改操作寫(xiě)入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。
最近越來(lái)越喜歡用上redis,有情投意合者一起多多交流呀。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Codeigniter整合Tank Auth權(quán)限類庫(kù)詳解
相交其他CodeIgniter的類庫(kù),tank_auth,配置簡(jiǎn)單,使用也簡(jiǎn)單,并且作者也一直在更新。這篇文章主要介紹了Codeigniter整合Tank Auth權(quán)限類庫(kù)詳解,需要的朋友可以參考下2014-06-06PHP中new static()與new self()的比較
在寫(xiě)代碼時(shí)發(fā)現(xiàn) new static(),覺(jué)得實(shí)例化的地方不是應(yīng)該是 new self()嗎?怎么回事?通過(guò)查閱相關(guān)資料才知道具體情況,下面小編整理下方便日后查找2016-08-08php自動(dòng)加載autoload機(jī)制示例分享
這篇文章主要介紹了php自動(dòng)加載autoload機(jī)制示例,文件結(jié)構(gòu)如下,2種方式實(shí)現(xiàn)自動(dòng)加載,需要的朋友可以參考下2014-02-02php+ajax發(fā)起流程和審核流程(以請(qǐng)假為例)
這篇文章主要介紹了php+ajax發(fā)起流程和審核流程(以請(qǐng)假為例) ,需要的朋友可以參考下2017-06-06php提取身份證號(hào)碼中的生日日期以及驗(yàn)證是否為成年人的函數(shù)
本篇文章使用php技術(shù)提取身份證號(hào)碼中的生日日期來(lái)判斷是否是未成年人的一個(gè)函數(shù)。下面小編把代碼分享給大家,供大家參考2015-09-09ThinkPHP模板循環(huán)輸出Volist標(biāo)簽用法實(shí)例詳解
這篇文章主要介紹了ThinkPHP模板循環(huán)輸出Volist標(biāo)簽用法,結(jié)合實(shí)例形式詳細(xì)分析了Volist標(biāo)簽的功能,使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-03-03php桌面中心(二) 數(shù)據(jù)庫(kù)寫(xiě)入
php桌面中心(二) 數(shù)據(jù)庫(kù)寫(xiě)入...2007-03-03