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 相关文章推荐
用cookies来跟踪识别用户
Oct 09 PHP
微盾PHP脚本加密专家php解密算法
Sep 13 PHP
php摘要生成函数(无乱码)
Feb 04 PHP
php发送post请求函数分享
Mar 06 PHP
PHP对文件进行加锁、解锁实例
Jan 23 PHP
PHP加密解密类实例分析
Apr 20 PHP
php计算title标题相似比的方法
Jul 29 PHP
PHP文件上传处理案例分析
Oct 15 PHP
PHP实现对数组分页处理实例详解
Feb 07 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
Apr 18 PHP
PHP fclose函数用法总结
Feb 15 PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 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
require(),include(),require_once()和include_once()的异同
2007/01/02 PHP
php开发文档 会员收费1期
2012/08/14 PHP
php输入数据统一类实例
2015/02/23 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
javascript 简练的几个函数
2009/08/29 Javascript
jquery 简单导航实现代码
2009/09/11 Javascript
Javascript 类与静态类的实现
2010/04/01 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
react中的ajax封装实例详解
2017/10/17 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
React-Router如何进行页面权限管理的方法
2017/12/06 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
Python实现的简单算术游戏实例
2015/05/26 Python
python 缺失值处理的方法(Imputation)
2019/07/02 Python
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
预备党员党校学习自我评价分享
2013/11/12 职场文书
模特大赛策划方案
2014/05/28 职场文书
医药销售自荐书
2014/05/29 职场文书
学生评语集锦
2015/01/04 职场文书
网络管理员岗位职责
2015/02/12 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers