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 相关文章推荐
用Php实现链结人气统计
Oct 09 PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
php 定界符格式引起的错误
May 24 PHP
php文本转图片自动换行的方法
Mar 13 PHP
PHP内置的Math函数效率测试
Dec 01 PHP
深入浅析Yii admin的权限控制
Aug 31 PHP
thinkPHP多语言切换设置方法详解
Nov 11 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
Thinkphp5框架ajax接口实现方法分析
Aug 28 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
MYSQL数据库初学者使用指南
2006/11/16 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
php依赖注入知识点详解
2019/09/23 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
JQuery之拖拽插件实现代码
2011/04/14 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
初识Javascript小结
2015/07/16 Javascript
html+js实现简单的计算器代码(加减乘除)
2016/07/12 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
Python编程实现的图片识别功能示例
2017/08/03 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
python SVM 线性分类模型的实现
2019/07/19 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
西班牙伏林航空公司:Vueling
2016/08/05 全球购物
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
Java如何调用外部Exe程序
2015/07/04 面试题
保安的辞职报告怎么写
2014/01/20 职场文书
初中作文评语大全
2014/04/23 职场文书
企业晚会策划方案
2014/05/29 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
综合办公室岗位职责
2015/04/11 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript
7个关于Python的经典基础案例
2021/11/07 Python
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL