#phalapi-進階篇7(使用緩存以及用redis拓展解決實際問題)

##前言##
***先在這里感謝phalapi框架創始人@dogstar,為我們提供了這樣一個優秀的開源框架.***
當我們在開發一個項目時,我們可能會遇到很多問題,比如消息推送,發送郵件,發送短信,以及并發跟不上,這個時候就該輪到常用的緩存出手解救我們了,我們接下來來講講緩存Redis在實際中的使用,解決實際問題.在這里是基于redis的基本知識,和簡單看一下PhalApi的redis拓展文檔在前來閱讀此小節.
附上:
喵了個咪的博客:[w-blog.cn](w-blog.cn)
官網地址:[http://www.phalapi.net/](http://www.phalapi.net/ "PhalApi官網")
開源中國Git地址:[http://git.oschina.net/dogstar/PhalApi/tree/release](http://git.oschina.net/dogstar/PhalApi/tree/release "開源中國Git地址")
開源中國擴展Git地址:[http://git.oschina.net/dogstar/PhalApi-Library](http://git.oschina.net/dogstar/PhalApi-Library"開源中國擴展Git地址")
##1. 能解決什么問題##
當我們使用一門技術的時候,我們當然是為了解決問題才去使用它的,那么我們使用緩存技術Redis能解決什么具體的問題呢?
##1.1 緩存結果集##
這里給一個例子大家看一下就會明白緩存結果集是什么意思
//從緩存redis的clubcache庫中查詢club表where條件是city,city值是$city
$cache = DI()->redis->get_Time('club'.'city'.$city,'clubcache');
//如果查詢到了就直接返回緩存的結果
if($cache){
return $cache;
}
//如果不存在從數據庫里面獲取結果然后存入redis緩存key的條件和取值時一樣,最后一個參數為過期時間
$rs = $this->getORM()->select('*')->where('city',$city)->fetchAll();
DI()->redis->set_Time('club'.'city'.$city,$rs,'clubcache',600);
上面做的事情就是把結果保存600秒,600秒內的再次查詢會獲取一樣的結果
##1.2 隊列處理##
Redis運用到時間中有一個比較關鍵的作用就是他的隊列
我們先過一下幾個特殊的redis函數
//寫入隊列左邊
set_lPush
//寫入隊列左邊 如果value已經存在,則不添加
set_lPushx
//寫入隊列右邊
set_rPush
//寫入隊列右邊 如果value已經存在,則不添加
set_rPushx
//讀取隊列左邊
get_lPop
//讀取隊列右邊
get_rPop
//讀取隊列左邊 如果沒有讀取到阻塞一定時間
get_blPop
//讀取隊列右邊 如果沒有讀取到阻塞一定時間
get_brPop
比如我們在做消息推送,發送郵件,發送短信這類業務的時候,我們需要請求第三方接口,請求的速度是第三方來決定的,比如微信一個推送接口就是200ms,如果放到我們的API業務里面就會出現一個巨大的問題,用戶訪問速度極度下降,解決這類問題的方案就是隊列流程如下
當我們接收到用戶的推送請求時
↓
把推送請求加入到隊列API里面不做任何操作(比如加入到左邊)
↓
在后臺有一個PHP腳本運行一直在讀取隊列(讀取右邊就是后進后出,如果讀取左邊就是先進先出)
↓
然后執行響應的推送邏輯
一般我們的腳本是一個死循環,或者shell定時請求,我們會采用讀取不到數據是阻塞來解決去不到值循環過快的問題
##1.3 臨時數據存儲##
臨時數據就不需要太多的說明了,舉個例子就夠了
比如我們獲取驗證碼,我們需要把驗證碼存到庫中嗎,我覺得是沒有必要的,而且數據庫并不好做過期的操作只能我們自己判斷
那么我們使用redis把驗證碼存入redis 然后給一個過期時間就很好的解決這個問題了
##1.4 數據庫##
把redis作為數據庫用算是比較深入的使用了,這里聊下思想
大家之后service可以分布式,但是對于大部分數據庫的分布式并不容易,所以導致了很多系統到后面拼接堆積在數據庫,當然可以使用緩存存儲結果集,但是這種解決方便治標不治本,在和童鞋們探討的時候得出了一個解決方便,就是把redis作為第一數據庫mysql作為元數據庫
做了這種操作之后服務器會自動把熱數據同步到redis,把冷數據存放到mysql,當使用到冷數據了在存放到redis,用戶大部分的操作基本是基于redis進行的操作
當作這樣實現的成本比較高要實現redis 數據同步 封裝使用 where查詢 等等需要很大的精力去做,在后期筆者有打算做一個通用的拓展
##2. 規范化使用##
其實以上的類容已經講的差不多了,為什么還有單獨拿出一段來講一講規范呢,因為緩存不像是數據庫當你需要去查看緩存的時候,如果所有的數據都堆積在redis的一個庫,你會非常痛苦
但是redis支持多庫所以需要一套規范來劃分,這里分享一下我這邊是如何使用的
0~10庫 作為正常業務庫,也就是推送隊列,臨時數據,每一個庫都只存儲一種業務的數據,比如微信推送就存在5庫,而郵件推送的數據就存在6庫,發送驗證碼的臨時數據存儲在3庫,一次類推,如果覺得10個庫還不夠用可以根據業務增加
10庫以上作為cache庫用來存儲每張表的結果集數據,或者是其余的數據
所有的key的命名規范必須帶有類型+表名+條件
##3. 總結##
看了本小節之后相信大家都對緩存在時間開發中起到了什么樣的作用有了個了解,這一小節的完成,我們的進階篇也步入尾聲了,下一篇是對于進階篇的總結了,也多謝大家一路的陪伴!
注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!
**官網QQ交流群:421032344 歡迎大家的加入!**
####[上一章](/wikis/%5b7.12%5d-phalapi-%e8%bf%9b%e9%98%b6%e7%af%876(%e8%a7%a3%e5%86%b3%e5%a4%a7%e9%87%8f%e6%95%b0%e6%8d%ae%e5%ad%98%e5%82%a8%e6%95%b0%e6%8d%ae%e5%ba%93%e5%88%86%e8%a1%a8%e5%88%86%e5%ba%93%e6%8b%93%e5%b1%95).html) [文檔首頁](/wikis/) [下一章](/wikis/%5b7.14%5d-phalapi-%e8%bf%9b%e9%98%b6%e7%af%878(PhalApi%e8%83%bd%e5%b8%a6%e6%9d%a5%e4%bb%80%e4%b9%88%e5%92%8c%e8%bf%9b%e9%98%b6%e7%af%87%e6%80%bb%e7%bb%93).html)
- 空白目錄
- [7.1]-phalapi-入門篇1(簡單介紹以及環境搭建)
- [7.2]-phalapi-入門篇2(把它玩起來)
- [7.3]-phalapi-入門篇3(請求和返回)
- [7.4]-phalapi-入門篇4(國際化高可用和自動生成文檔)
- [7.5]-phalapi-入門篇5(數據庫操作和Model層)
- [7.6]-phalapi-入門篇6(小技巧和淺談API適用范圍以及入門篇總結)
- [7.7]-phalapi-進階篇1(三層結構Api,Domain,和Model)
- [7.8]-phalapi-進階篇2(DI依賴注入和單例模式)
- [7.9]-phalapi-進階篇3(自動加載和攔截器)
- [7.10]-phalapi-進階篇4(notorm進階以及事務操作)
- [7.11]-phalapi-進階篇5(數據庫讀寫分離)
- [7.12]-phalapi-進階篇6(解決大量數據存儲數據庫分表分庫拓展)
- [7.13]-phalapi-進階篇7(使用緩存以及用redis拓展解決實際問題)
- [7.14]-phalapi-進階篇8(PhalApi能帶來什么和進階篇總結)