緩存,許多網站都會使用,尤其是應對高並發的情況下,緩存必不可少。這篇文章基於phalapi來說明快取Redis在實際中的使用,希望對大家有幫助。
前言
當我們在開發一個專案時,我們可能會遇到很多問題,例如訊息推送,發送郵件,發送簡訊,以及並發跟不上,這個時候就該輪到常用的快取出手解救我們了,我們接下來來講講緩存Redis在實際中的使用,解決實際問題.在這裡是基於redis的基本知識,和簡單看一下PhalApi的redis拓展文檔前來閱讀此小節.
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查詢等等需要很大的精力去做,在後期筆者有打算做一個通用的拓展
相關推薦:
以上是phalapi-快取的使用以及redis拓展的詳細內容。更多資訊請關注PHP中文網其他相關文章!