ホームページ  >  記事  >  バックエンド開発  >  php redisによる記事公開システム(ユーザー投票システム)の導入事例を詳しく紹介

php redisによる記事公開システム(ユーザー投票システム)の導入事例を詳しく紹介

黄舟
黄舟オリジナル
2017-03-06 09:30:071696ブラウズ

この記事では、主に php redis で実装された記事公開システムとユーザー投票システムについて詳しく紹介します。興味のある方は参考にしてください。

この記事の例は、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(&#39;time:&#39;,$article,$key) < $cutoff){
      var_dump("该文章已过投票时间!");exit;
    }
    $article_id = explode(&#39;:&#39;,$article)[&#39;1&#39;];
    if($redis->sadd(&#39;voted:&#39;.$article_id,$user,$key)){
      $redis -> zincrby(&#39;score:&#39;,$article,1,$key);
      $redis -> hincrby($article,&#39;votes&#39;,1,$key);
    }else{
      var_dump("您已经投过票了!");exit;
    }
  }

/**
  * @data 文章列表分页
  *    对文章评分有序集合或者时间发布有序集合做分页处理,获取文章ID后,去文章详情散列表中查询该文章详情
  * @author Lorne
  * @date 2017-03-03
  */
  public function get_articles($page =1,$orders =&#39;&#39;){
    $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[&#39;id&#39;] = $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(&#39;group:&#39;.$val,$article,$db);
    }
    foreach($to_remove as $key=>$val){
      $redis -> srem(&#39;grouo:&#39;.$val,$article,$db);
    }
  }

/**
  * @data 组集合中的文章根据评分或者时间分页排序
  *    
  * @author Lorne
  * @date 2017-03-03
  */
  public function get_grouop_articles($orders = "time:"){
    $redis = $this -> redis;
    $db = "queue";
    $group = &#39;开发&#39;;
    $key = $orders.$group;
    if($redis -> exists($key,$db)){
      $argument = 2;
      $data = $redis -> zinterstore($key,$argument,[&#39;group:&#39;.$group,$orders],$db);
      //$this -> expire($key,60,$db);
    }
    return $this->get_articles(2,$key);
  }

使用中php+redis、シンプルな記事公開システム、ユーザー投票、記事のグループ化、およびページングの並べ替えを実装します。

Redis は、高性能のキーと値のストレージ システムです。最も一般的な 5 つのタイプは、string (文字列)、list (リンク リスト)、set (セット)、zset (sorted set - Ordered Set)、および hash ( ハッシュ タイプ) です。 )、memcache との違いは、redis が更新されたデータを定期的にディスクに書き込むか、変更操作を追加のレコード ファイルに書き込むこと、そしてこれに基づいてマスターとスレーブ (マスターとスレーブ) の同期が実現されることです。

最近、redisを使うことが増えてきているので、興味のある方はぜひコミュニケーションをとってください。

上記は php、redis、および記事の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。