PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,入门门槛较低,易于学习,使用广泛,主要适用于 web 开发领域。PHP 的文件后缀名为 php。
这篇文章主要为大家详细介绍了 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,有情投意合者一起多多交流呀。
来源: http://www.phperz.com/article/17/0806/340421.html