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


Posted in PHP onMarch 04, 2017

本文实例为大家分享了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 相关文章推荐
递归列出所有文件和目录
Oct 09 PHP
php 远程关机操作的代码
Dec 05 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
Sep 05 PHP
解析ajax事件的调用顺序
Jun 17 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
May 15 PHP
Yii结合CKEditor实现图片上传功能
Jun 13 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
Oct 31 PHP
php脚本运行时的超时机制详解
Feb 17 PHP
PHP session 会话处理函数
Jun 06 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
Apr 26 PHP
PHP执行linux命令6个函数代码实例
Nov 24 PHP
PHP获取当前执行php文件名的代码
Mar 02 #PHP
PHP两种实现无级递归分类的方法
Mar 02 #PHP
PHP 二级子目录(后台目录)设置二级域名
Mar 02 #PHP
php安装dblib扩展,连接mssql的具体步骤
Mar 02 #PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
Mar 02 #PHP
数组任意位置插入元素,删除特定元素的实例
Mar 02 #PHP
根据key删除数组中指定的元素实现方法
Mar 02 #PHP
You might like
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
PHP递归算法的简单实例
2019/02/28 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
jQuery实现鼠标点击弹出渐变层的方法
2015/07/09 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
vue使用recorder.js实现录音功能
2019/11/22 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
python模块之time模块(实例讲解)
2017/09/13 Python
opencv实现简单人脸识别
2021/02/19 Python
django创建超级用户过程解析
2019/09/18 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
管理部部长岗位职责
2013/12/05 职场文书
工程部经理岗位职责
2013/12/08 职场文书
遗嘱公证书标准样本
2014/04/08 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
见习报告怎么写
2014/10/31 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
Vue操作Storage本地化存储
2022/04/29 Vue.js