php redis實現(xiàn)文章發(fā)布系統(tǒng)(用戶投票系統(tǒng))
本文實例為大家分享了php實現(xiàn)文章發(fā)布系統(tǒng)、用戶投票系統(tǒng)的具體代碼,供大家參考,具體內容如下
/**
* @data 文章發(fā)布
* 文章詳情散列表中遞增ID,講文章發(fā)布者ID寫入投票用戶集合中,設置投票時間為一周
* 講文章內容寫入文章散列中,講文章寫入文章評分有序集合和文章發(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);
//設置過期時間(為1周)
$this->redis->expipre($voted,$ONE_WEEK_IN_SECONDS,$key);
//獲取現(xiàn)在的時間
$now =time();
$article = "article:".$article_id;
$data = ['title'=>'測試1','link'=>'www.hahaha.com','poster'=>$user,'tine'=>$now,'votes'=>1];
//$data = json_encode($data);
$redis -> hmset($article,$data,$key);
//將文章添加到根據(jù)時間排序有序集合和根據(jù)評分排序有序結合中
$this -> redis -> zadd("score:",1,$article,$key);
$this -> redis -> zadd("time:",$now,$article,$key);
$redis -> exec($key);
}
/**
* @data 用戶投票
* 獲取文章的ID,用戶ID,判斷該篇文章是否已經(jīng)過了投票時間,再判斷用戶是否已經(jīng)投過票
* 寫入文章對應投票用戶表中(voted:文章ID),對應的文章評分加,文章詳情內容中的votes統(tǒng)計加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ā)布時間和投票截止日期對比
if($redis->zscore('time:',$article,$key) < $cutoff){
var_dump("該文章已過投票時間!");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)投過票了!");exit;
}
}
/**
* @data 文章列表分頁
* 對文章評分有序集合或者時間發(fā)布有序集合做分頁處理,獲取文章ID后,去文章詳情散列表中查詢該文章詳情
* @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 文章添加組和移除組
* 講該文章加入不同的分組中,或者從個分組中移除該篇文章
* @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ù)評分或者時間分頁排序
*
* @author Lorne
* @date 2017-03-03
*/
public function get_grouop_articles($orders = "time:"){
$redis = $this -> redis;
$db = "queue";
$group = '開發(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,簡易的實現(xiàn)文章發(fā)布系統(tǒng),用戶投票,文章分組,分頁排序。
redis是一個高性能的key-value存儲系統(tǒng),最為常見的5大類型:string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型),和memcache區(qū)別的是redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現(xiàn)了master-slave(主從)同步。
最近越來越喜歡用上redis,有情投意合者一起多多交流呀。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
PHP中new static()與new self()的比較
在寫代碼時發(fā)現(xiàn) new static(),覺得實例化的地方不是應該是 new self()嗎?怎么回事?通過查閱相關資料才知道具體情況,下面小編整理下方便日后查找2016-08-08
php提取身份證號碼中的生日日期以及驗證是否為成年人的函數(shù)
本篇文章使用php技術提取身份證號碼中的生日日期來判斷是否是未成年人的一個函數(shù)。下面小編把代碼分享給大家,供大家參考2015-09-09
ThinkPHP模板循環(huán)輸出Volist標簽用法實例詳解
這篇文章主要介紹了ThinkPHP模板循環(huán)輸出Volist標簽用法,結合實例形式詳細分析了Volist標簽的功能,使用方法與相關注意事項,需要的朋友可以參考下2016-03-03

