php redis实现文章发布系统(用户投票系统)
本文实例为大家分享了php实现文章发布系统、用户投票系统的具体代码,供大家参考,具体内容如下
/**
*@data文章发布
*文章详情散列表中递增ID,讲文章发布者ID写入投票用户集合中,设置投票时间为一周
*讲文章内容写入文章散列中,讲文章写入文章评分有序集合和文章发布有序集合中
*@authorLorne
*@date2017-03-03
*/
publicfunctionpost_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);
//获取现在的时间
$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);
//将文章添加到根据时间排序有序集合和根据评分排序有序结合中
$this->redis->zadd("score:",1,$article,$key);
$this->redis->zadd("time:",$now,$article,$key);
$redis->exec($key);
}
/**
*@data用户投票
*获取文章的ID,用户ID,判断该篇文章是否已经过了投票时间,再判断用户是否已经投过票
*写入文章对应投票用户表中(voted:文章ID),对应的文章评分加,文章详情内容中的votes统计加1
*@authorLorne
*@date2017-03-03
*/
publicfunctionarticle_vote(){
$ONE_WEEK_IN_SECONDS=7*86400;
$article="article:3";
$user="user:7777";
$redis=$this->redis;
$key="queue";
$cutoff=time()-$ONE_WEEK_IN_SECONDS;
//文章发布时间和投票截止日期对比
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("您已经投过票了!");exit;
}
}
/**
*@data文章列表分页
*对文章评分有序集合或者时间发布有序集合做分页处理,获取文章ID后,去文章详情散列表中查询该文章详情
*@authorLorne
*@date2017-03-03
*/
publicfunctionget_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($idsas$key=>$val){
$data=$redis->hgetall($val,$db);
$data['id']=$val;
$articles[]=$data;
}
return$articles;
}
/**
*@data文章添加组和移除组
*讲该文章加入不同的分组中,或者从个分组中移除该篇文章
*@authorLorne
*@date2017-03-03
*/
publicfunctionadd_remove_group($article_id,$to_add=[],$to_remove=[]){
$redis=$this->redis;
$db="queue";
$article="article:".$article_id;
foreach($to_addas$key=>$val){
$redis->sadd('group:'.$val,$article,$db);
}
foreach($to_removeas$key=>$val){
$redis->srem('grouo:'.$val,$article,$db);
}
}
/**
*@data组集合中的文章根据评分或者时间分页排序
*
*@authorLorne
*@date2017-03-03
*/
publicfunctionget_grouop_articles($orders="time:"){
$redis=$this->redis;
$db="queue";
$group='开发';
$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,简易的实现文章发布系统,用户投票,文章分组,分页排序。
redis是一个高性能的key-value存储系统,最为常见的5大类型:string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型),和memcache区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
最近越来越喜欢用上redis,有情投意合者一起多多交流呀。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。