php redis实现文章发布系统(用户投票系统)

5年以前  |  阅读数:783 次  |  编程语言:PHP 

本文实例为大家分享了php实现文章发布系统、用户投票系统的具体代码,供大家参考,具体内容如下


    /**
      * @data 文章发布
      *    文章详情散列表中递增ID,讲文章发布者ID写入投票用户集合中,设置投票时间为一周
      *    讲文章内容写入文章散列中,讲文章写入文章评分有序集合和文章发布有序集合中
      * @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);

        //获取现在的时间
        $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
      * @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;
        //文章发布时间和投票截止日期对比
        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后,去文章详情散列表中查询该文章详情
      * @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 组集合中的文章根据评分或者时间分页排序
      *    
      * @author Lorne
      * @date 2017-03-03
      */
      public function get_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(sorted set --有序集合)和hash(哈希类型),和memcache区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

最近越来越喜欢用上redis,有情投意合者一起多多交流呀。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例