/**
* @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,有情投意合者一起多多交流呀,O(∩_∩)O。

php+redis 简易的实现文章发布系统(用户投票系统)的更多相关文章

  1. django用户投票系统详解

    投票系统之详解 1.创建项目(mysite)与应用(polls) django-admin.py startproject mysite python manage.py startapp polls ...

  2. useradd---创建的新的系统用户

    useradd命令   useradd命令用于Linux中创建的新的系统用户.useradd可用来建立用户帐号.帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号.使用user ...

  3. 【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第十二节)

    好的,那么在上一节中呢,评论功能的后台已经写好了,这一节,先把这部分后台代码和前台对接一下. 1.评论功能实现 我们修改一下保存评论按钮的点击事件,用jQuery的方式获取文本框中的值,然后通过aja ...

  4. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试 系列目录 我想测试EF在一百万条数据下的显示时间! ...

  5. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(36)-文章发布系统③-kindeditor使用

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(36)-文章发布系统③-kindeditor使用 我相信目前国内富文本编辑器中KindEditor 属于前 ...

  6. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET ...

  7. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(35)-文章发布系统②-构建项目

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(35)-文章发布系统②-构建项目 注:阅读本文,需要阅读本系列的之前文章 代码生成器下载地址(文章开头处) ...

  8. 使用redis构建文章投票系统

    首先,我得说明这篇博客基本上就是<<redis in action>>第一章内容的读书笔记. 需求 首先,说明一下,我们的需求 用户可以发表文章,发表时,自己就默认的给自己的文 ...

  9. JAVAEE期末项目------文章发布系统

    项目文档和代码的GitHub地址:https://github.com/xiangbaobaojojo/- 1.项目介绍 (计科四班  蔡春燕 20150141401)和我 陈香宇(计科四班  201 ...

随机推荐

  1. 使用YUIDoc生成JS文档

    其实YUIDoc主页已经写的比较清晰了,但有一些概念和细节再点出一些注意的地方. 目前最新的YUIDoc使用nodejs进行开发安装和使用都非常的方便. 我们只需要将我们的代码加上必要的注释,便可以很 ...

  2. Yii 1.0 基础

    骨架搭建 1.下载2.windows 创建PHP环境变量,找到php.exe的目录D:\wamp\bin\php\php5.3.5,右键我的电脑,属性\高级设置,path最后添加 ;D:\wamp\b ...

  3. 勘误《iOS网络高级编程:iPhone和iPad的企业应用开发》

    VII页 , 倒数第二行, “其他” 应为 “其它” X页, 源代码有错误,说是有19章,实际一共13章 XI页,勘误表的链接也是错误的  .是该书的<Beginning ASP.NET 4.5 ...

  4. CSS中设置margin:0 auto; 水平居中无效的原因分析

    很多初学制作网页的朋友,可能会遇到的一个常见问题,就是在CSS中加了margin:0 auto;却没有效果,不能居中的问题,margin:0 auto;的意思就是:上下边界为0,左右根据宽度自适应,其 ...

  5. PHP 文件上传全攻略

    PHP文件上传功能一般都是大家使用事先封装好的函数,要用的时候直接使用已封装的函数就完了,但有时候不能使用封装函数,还真不大能记住PHP的上传相关的东西,在此做个总结,以备后用.   1.表单部分 允 ...

  6. 在VMWare虚拟机中安装Ubuntu 16.04.1 LTS

    一.需要的准备 安装好VMWare虚拟机(傻瓜式安装,一直next就可以,请支持正版),将Ubuntu的系统镜像下载好,目前最新的LTS版本为16.04.1. 我把虚拟机和Ubuntu镜像传到了百度云 ...

  7. easyui帮助文档地址

    http://www.jeasyui.com/documentation/index.php# http://www.jeasyui.net/tutorial/22.html http://www.j ...

  8. Struct 和 Union 的详细区别

    Union: 共用体 Struct:结构体 两者的区别: 1:共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放一个被选中的成员, 而结构体则存放所有的成员变量. 2: ...

  9. C++编程练习(6)----“实现简单的队列的链式存储结构“

    队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出.简称链队列. 实现代码如下: /* LinkQueue.h 头文件 */ #include<iostream> #defi ...

  10. Windows下搭建HTTP/HTTPS服务器及测试过程

    1 安装Apache http://www.apachehaus.com/cgi-bin/download.plx 选择合适的版本下载 本次下载的是 Apache 2.4.x VC14 Apache版 ...