首頁  >  文章  >  後端開發  >  phalapi-快取的使用以及redis拓展

phalapi-快取的使用以及redis拓展

*文
*文原創
2017-12-23 16:28:552056瀏覽

緩存,許多網站都會使用,尤其是應對高並發的情況下,緩存必不可少。這篇文章基於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查詢等等需要很大的精力去做,在後期筆者有打算做一個通用的拓展


2. 規範化使用

其實以上的類容已經講的差不多了,為什麼還有單獨拿出一段來講一講規範呢,因為快取不像是資料庫當你需要去查看快取的時候,如果所有的資料都堆積在redis的一個庫,你會非常痛苦

但是redis支援多庫所以需要一套規範來分割,這裡分享一下我這邊是如何使用的

0~10庫作為正常業務庫,也就是推送隊列,臨時資料,每一個庫都只儲存一種業務的資料,例如微信推送就存在5庫,而郵件推送的資料就存在6庫,發送驗證碼的臨時資料儲存在3庫,一次類推,如果覺得10個庫還不夠用可以根據業務增加

10庫以上作為cache庫用來儲存每張表的結果集資料,或者是其餘的資料

所有的key的命名規範必須帶有類型+表名+條件


相關推薦:

#php檔案快取類別用法實例分析

#PHP 快取機制

#關於Redis叢集故障的分析


以上是phalapi-快取的使用以及redis拓展的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn