PHP+Redis 實例【二】頁面緩存 新玩法
今天算是認識到博客園裏的審查團隊多內幕了,哈哈,貼個圖玩下。
氣死寶寶了。
進入主題!
今天就不寫什麽功能性的了,換下口味說下關於頁面級的緩存,應該怎麽做。
相信有很多小夥伴查了百度,甚至google,看了很多文章,以前我也這樣做了,但是發現,上面寫的真的不知所雲。
有兩點可以看出他們哪裏不行:
- 第一,網上有很多種寫法,只要你稍微有點redis基礎,就是懂得redis的五種數據結構的用法,就會發現很明顯的錯誤,連接口都寫錯了。
- 第二,緩存時間,你會發現很多他們寫了緩存,但是沒有緩存的過期時間,這是致命傷,沒有什麽緩存是不過期的,只是緩存的時間長短而已。你可以給10秒,也可以給10個月。看你具體的業務而定。後面會教你如何判斷時間長短。
上面就是判斷網上一些寫頁面緩存的文章好不好的依據,每個人的用法總會有點不一樣,小弟也不敢妄下定論,僅供參考。
前提分析!
還是直接上圖:
上面的圖,我分為了三個層級去做頁面緩存,其實不一定要三個層面都實現的,如果你做了頁面級的,項目初期是夠了,作為接口級,基本可以解決很多吞吐量。
對於上面的三個層級,我用了同一個方法去做。
知識準備:
- string redis數據結構(這裏我一直都找不到更好的替代品,string主要是方便我操作它的過期時間)
- expire()函數,設置鍵的生存時間。
- exists()函數,判斷鍵是否存在。(判斷的方法有很多種,ttl()獲取它的生存時間,get()函數,判斷是否有數據(不過get判斷最好不用))。
好了,廢話說完了,直接上代碼!
1 <?php 2 class Test 3 { 4 public $redis = null; 5 6 public function __construct() 7 { 8 $this->redis = new Redis(); 9 $this->redis->connect(‘127.0.0.1‘,6379); 10 $this->redis->auth(‘‘); 11 } 12 //這裏是個例子模型,按照自己的用法去套進去就行13 //以文章為例子吧 14 //頁面級,接口級都可以用 15 public function getData() 16 { 17 //判斷緩存的鍵是否還存在 18 if(!$this->redis->exists("cache:".$commentid)) 19 { 20 //緩存不存在 21 //下面的get_mysql_data()函數只是個例子,按照自己具體情況去mysql獲取數據 22 $data = $this->get_mysql_data(); 23 $json = json_encode($data,JSON_UNESCAPED_UNICODE); 24 //存入redis 25 $this->redis->set("cache:".$commentid,$json); 26 //設置過期時間5分鐘 27 $this->redis->expire("cache:".$commentid,60*60*5); 28 } 29 30 $json = $this->redis->get("cache:".$commentid); 31 $data = json_decode($json,true); 32 return $data; 33 } 34 }
對於上面的代碼有幾點提示:
- 上面只是一個例子,看你自己具體的使用去定
- 其中mysql數據獲取的哪裏,要看你自己mysql使用mysqli或者pdo等等方法獲取的,哪裏隨便你替換。
- 過期時間哪裏等下就說
- 看到30.31行,那裏為什麽重新從redis拿多一次數據呢?為什麽不直接返回mysql的$data不就行了,其實是可以的,只是為了防止redis沒有把數據緩存進去,而做的一步,還有一步報錯,我沒寫,自己添加進去吧。
下面說下怎麽設置過期時間:
這個是沒有一個統一的說法的,第一根據你的項目階段,第二是用戶流量的多少,第三是數據的冷熱程度等方面去判斷。
項目階段:其實和用戶流量有很多的關聯,舉個例子,假設你的項目在初期,但是用戶已經爆炸了,這時,設置的緩存時間可以賊短,哪怕2秒,都能幫你解決很大的吞吐量。
冷熱程度:冷指的是用戶瀏覽次數少的,熱的就很明顯啦,熱還有一種特殊的代表,數據的更新頻率,更新頻率高的應該時間約短。
特殊操作:更新部分數據時,可以考慮將對應的緩存鍵時間設為過期,這樣用戶看到的數據都是最新的,而且緩存功能依然存在,設置生存時間過期,很簡單,expire設置為0就可以了
另一種頁面緩存:
下面介紹一種不一樣的數據緩存:
突然不想寫了,因為我感覺上面的做法算是涵蓋了,算是上面的接口級的做法。我就簡單說下算了。
這裏還是以文章為例子吧,我們論壇裏最多的肯定是文章啦,那文章的熱度肯定有排序的。對於熱文章的訪問量是比較大的,然後我們就要緩存假設排名在10000名之內的文章,對於超出這個數的文章,可以不用緩存。
這裏順便預告下,下篇文章是寫關於排行榜的,日榜,周榜,年度榜該怎樣做。
歡迎交流!
PHP+Redis 實例【二】頁面緩存 新玩法