php+redis 简易的实现文章发布系统(用户投票系统)
/**
* @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 简易的实现文章发布系统(用户投票系统)的更多相关文章
- django用户投票系统详解
投票系统之详解 1.创建项目(mysite)与应用(polls) django-admin.py startproject mysite python manage.py startapp polls ...
- useradd---创建的新的系统用户
useradd命令 useradd命令用于Linux中创建的新的系统用户.useradd可用来建立用户帐号.帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号.使用user ...
- 【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第十二节)
好的,那么在上一节中呢,评论功能的后台已经写好了,这一节,先把这部分后台代码和前台对接一下. 1.评论功能实现 我们修改一下保存评论按钮的点击事件,用jQuery的方式获取文本框中的值,然后通过aja ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试 系列目录 我想测试EF在一百万条数据下的显示时间! ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(36)-文章发布系统③-kindeditor使用
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(36)-文章发布系统③-kindeditor使用 我相信目前国内富文本编辑器中KindEditor 属于前 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(35)-文章发布系统②-构建项目
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(35)-文章发布系统②-构建项目 注:阅读本文,需要阅读本系列的之前文章 代码生成器下载地址(文章开头处) ...
- 使用redis构建文章投票系统
首先,我得说明这篇博客基本上就是<<redis in action>>第一章内容的读书笔记. 需求 首先,说明一下,我们的需求 用户可以发表文章,发表时,自己就默认的给自己的文 ...
- JAVAEE期末项目------文章发布系统
项目文档和代码的GitHub地址:https://github.com/xiangbaobaojojo/- 1.项目介绍 (计科四班 蔡春燕 20150141401)和我 陈香宇(计科四班 201 ...
随机推荐
- zepto js 源码 解读
/* Zepto v1.0-1-ga3cab6c - polyfill zepto detect event ajax form fx - zeptojs.com/license */ ;(funct ...
- PHP SOCKET 编程
对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 什么是TCP/IP.UDP? Socket在哪里呢? Socket是什么呢? 你 ...
- session锁问题
碰到个问题,在使用了session时(如用户登录),如果当前请求时间过长,再执行其他请求都不会有响应,查找了网上资料发现,这个是session锁的问题 目前我们的程序基本流程如下: (1)加载Sess ...
- iOS 开发 之 编程知识点
iOS 创建和设置pch iOS 之 时间格式与字符串转换 iOS 之 二维码生成与扫描(LBXScan) iOS 之 定时器 iOS 之 通知 iOS 之 NSString 去除前后空格和回车键 i ...
- layer弹窗插件实战用法小结1—— layer.alert()
http://layer.layui.com 第一节:layer.alert()弹窗的用法 1.解压layer-v2.2.zip压缩包 2.拷贝layer文件夹到实战项目目录 3.注意:layer.j ...
- Java jsp 示例
<!DOCTYPE html> <!-- [ published at 2015-11-13 12:30:50 ] --> <html> <head> ...
- Canvas arcTo绘制圆弧
arcTo(x1,y1,x2,y2,r); 当前点x0,y0;圆弧与(x0,y0-x1,y1)相切,与(x1,y1-x2,y2)相切: <!DOCTYPE html> <html l ...
- [PCB设计] 4、BAT脚本处理AD生成的GERBER文件为生产文件
1.生产资料概述 为了资料保密和传输方便,交给PCB厂商打样的资料一般以Gerber和钻孔文件为主,换句话说,只要有前面说的两种文件,就能制作出你想要的PCB了. 一般来说,交给PCB厂商的Gerbe ...
- 部署AlwaysOn第一步:搭建Windows服务器故障转移集群
在Windows Server 2012 R2 DataCenter 环境中搭建集群之前,首先要对Windows服务器故障转移集群(Windows Server Failover Cluster,简称 ...
- POJ2796(单调栈)
Feel Good Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 12987 Accepted: 3639 Case T ...