日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis学习(三) 使用redis构建文章投票,发布后端

發布時間:2024/9/30 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis学习(三) 使用redis构建文章投票,发布后端 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.需求?

?

?1.首先設計數據庫

?

?

?2.代碼

?Redis.php

<?php//評分是將文章的到的支持票數乘以一個常量,然后加上文章的發布時間,得出的結果就是文章的評分 const ONE_WEEKS_IN_SECONDS = 7*86400; //常量是通過一天的秒數(86400)除以文章展示一天所需的支持票數(200)的出的 const VOTE_SCORE = 432;class Redis1{private static $instance;// private function __construct(){} //私有構造,不允許newprivate function __clone(){} //私有克隆方法,不允許通過魔術方法克隆對象public function getIntance($host="127.0.0.1",$port="6379"){if (!self::$instance instanceof self){self::$instance = new Redis();self::$instance->connect($host,$port);}$myredis = self::$instance;return $myredis;}public function index(){echo "hello world";}/*** 對文章進行投票* @param $myredis* @param $user* @param $article_id* @return bool*/public function article_vote(){$redis = $this->getIntance();$article = 'article:24';$user = 8;$cutoff = time() - ONE_WEEKS_IN_SECONDS; //計算文章投票截止時間if ($redis->zScore('time:',$article) < $cutoff) //檢測是否可以對文章進行投票{return false;}$end = strpos($article,'article:');$article_id = substr($article,strlen('article:')+$end) ;//從article:id中提取文章的id//echo $article_id;die();//如果用戶是第一次為這篇文章進行投票,那么增加這篇文章的投票數量和評分$first = $redis->sadd('voted:'.$article_id,$user);echo 'first';echo $first.'<br>';if ($first){$score = $redis->zIncrBy('score:',VOTE_SCORE,$article); //集合添加 給這篇文章加分echo "score".$score;$vote = $redis->hIncrBy($article,'votes',1); //hash添加 給這篇文章閱讀人數+1echo "<br>vote".$vote;if ($score && $vote){echo "添加成功0";}else{echo "添加失敗0";}}else{echo "添加失敗1";}}/*** 文章發布功能* @param $myredis* @param $user* @param $title* @param $link* @return string*/public function post_article(){//模擬數據$user_id = 1;$title = "文章標題1";$link = "http://www.baidu.com";$redis = $this->getIntance();$article_id = $redis->incr('article:'); //生成一個新的文章id$voted = 'voted:'.$article_id;$redis->sAdd($voted,$user_id); //將發布文章的用戶添加到文章的已投票用戶名單里面,$redis->expire($voted,ONE_WEEKS_IN_SECONDS); //然后將這個名單的過期時間設置為一周$article = 'article:'.$article_id;$result = $redis->hMset($article,[ //將文章的信息存到一個散列里面'title'=>$title,'link'=>$link,'poster'=>$user_id,'time'=>time(),'votes'=>1]);echo $article;$score = $redis->zAdd('score:',time()+VOTE_SCORE,$article); //將文章添加到根據評分順序的有序集合里面$time = $redis->zAdd('time:',time(),$article); //將文章添加根據發布時間排序的有序集合和里面if ($result && $score && $time){echo $article."文章創建成功";exit();}else{echo $article_id."文章創建失敗";exit();}return $article_id;}/*** 文章獲取功能* @param $conn* @param $page* @param string $order* @return array*/public function get_articles(){//$page = $_POST['page']?$_POST['page']:1;$page = 1;$order="score:";$redis = $this->getIntance();$ARTICLE_PER_PAGE = 25;$start = ($page-1) * $ARTICLE_PER_PAGE; //設置獲取文章的起始索引和結束索引$end = $start+ $ARTICLE_PER_PAGE-1;$ids = $redis->zRange($order,$start,$end); //獲取多個文章的id//var_dump($ids);die();$articles = [];foreach ($ids as $id) //根據文章id獲取文章詳細信息{$article_data = $redis->hGetAll($id);$article_data['id'] = $id;$articles[] = $article_data;}var_dump($articles);die();return $articles;}/*** 對文章進行分組* @param $conn* @param $article_id* @param $toadd* @param $toremove*/public function add_remove_groups(){$redis = $this->getIntance();$article_id = 23;$toadd = [1,2,3];$toremove = [1];$article = 'article:'.$article_id; //構建存儲文章信息的鍵名foreach ($toadd as $group){$redis->sadd('group:'.$group,$article); //將文章添加到他所屬的群組里面}foreach ($toremove as $group){$redis->srem('group:'.$group,$article); //從群組里面移除文章}echo "分組成功";}/*** 分頁獲取文章數據* @param $conn* @param $group* @param $page* @param string $order* @return array*/public function get_group_articles(){$redis = $this->getIntance();$order="score:";$group = 1;$page =1;$key = $order.$group; //為每個群組的每種排列順序都創建一個鍵if (!$redis->exists($key)) //檢測是否有已緩存的排序結果,如果沒有的話現在就進行排序{$redis->zinterstore($key,['group:'.$group,$order]/*['aggregate'=>'max']*/); //根據評分或者發布時間對群組文章進行排序}$redis->expire($key,60); //讓redis60s之后自動刪除這個有序集合return $this->get_articles($redis,$page,$key);}}$myredis = new Redis1(); //$myredis->index(); //$myredis->post_article(); //$myredis->get_articles(); //$myredis->article_vote(); //$myredis->add_remove_groups(); $myredis->get_group_articles();

3.待解決問題

1.文章分組(交集和并集)

2.zinterstore的用法

?

?

總結

以上是生活随笔為你收集整理的redis学习(三) 使用redis构建文章投票,发布后端的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。