天天看點

Yii架構分布式緩存的實作方案

聲明:本文閱讀對象最好是對Yii和分布式緩存有一定了解的人群,否則了解和掌握上有一些困難,建議閱讀之前做好以上兩點基礎準備。

YiiFramework簡稱Yii,讀作易,代表簡單(easy)、高效(efficient)、可擴充(extensible),Yii将面向對象思想以及代碼的重用性發揮到了極緻,尤其是在緩存的支援上,Yii是最有效率的PHP架構之一。

Yii的緩存支援封裝在架構核心的caching檔案夾下面,如下圖是Yii支援的緩存存儲媒體。

Yii架構分布式緩存的實作方案

如果要做跨Session和請求的分布式緩存,可以選用CFileCache,如果要做跨WebServer的分布式緩存,就必須用CMemCache或CRedisCache緩存。

1.跨Session和請求分布式緩存處理方案(隻有一台Web伺服器、利用緩存依賴實作緩存實時更新)

Yii緩存支援需要在項目的主配置檔案添加相應的配置支援。

Yii中不管緩存媒體是磁盤、資料庫還是記憶體,指派和取值都是統一的,這樣的話,當我們有更換緩存媒體的時候就可以改一下主配置檔案,程式代碼一點都不用動,這也是Yii将代碼重用性發揮到極緻的一個很好展現。

      A.緩存的指派:

下面舉一個具體調用案例:

      上面是一個常用的案例,我們将'product'作為key,$products數組當做value,過期時間為30秒(若永不過期此處填0),同時依賴全局緩存變量'version'這個值。

設定緩存依賴後,當'version'的值發生變化後,緩存過期,30秒後緩存過期,這兩個條件有一個成立,緩存都過期。

      B.緩存值的擷取

跨Session和請求分布式緩存的實作方案Demo:

讀取線程代碼:

寫線程代碼:

上面的業務邏輯如下圖:

Yii架構分布式緩存的實作方案

讀線程每次擷取緩存的時候都會驗證一下緩存依賴是否值發生變化,如果緩存依賴值變化了就擷取不到緩存,擷取不到緩存就會去資料庫查詢結果,查詢到結果後,重新設定緩存;如果緩存依賴值沒有發生變化,直接擷取緩存,不再連接配接資料庫并将值傳回給浏覽器,這樣讀線程完成了任務。

寫線程直接操作資料庫,将資料更新到資料庫,然後他隻需要更新Denp緩存依賴就可以傳回浏覽器了,當然,寫線程也可以直接清除對應的緩存,這樣寫線程完成任務。

當你想更新緩存媒體的時候,如Memcached做分布式緩存媒體,前提是web伺服器安裝php的memcached擴充,在web程式内隻需要在主配置檔案中做如下修改:

2.跨Web伺服器分布式緩存處理方案

跨Web伺服器的分布式緩存就得借助于Memcached或Redis了,如下圖:

Yii架構分布式緩存的實作方案

浏覽器将讀/寫請求交給反向代理Nginx或者F5硬體,再由Nginx将請求分發給各自的Web伺服器,各自Web伺服器共享緩存伺服器。

上圖是利用Cache Server來實作的分布式緩存實時更新,處理流程:

1号讀線程開始請求緩存,請求不到,讀取資料庫,設定緩存,将查詢結果傳回給浏覽器;2号讀線程,請求緩存,請求到緩存,将結果傳回給浏覽器;寫線程直接操作資料庫,删除緩存,傳回浏覽器;1号讀線程讀不到緩存,讀取資料庫,設定緩存,将查詢結果傳回給浏覽器。

讀線程代碼:

如果你想用Redis或Memcached做緩存,最好用Linux做緩存伺服器,連接配接Web伺服器就不做限制了,但是有一點,如果你想用Redis做緩存,或者Web伺服器安裝php對Redis的擴充,或者去Yii官網下載下傳Yii對Redis的支援擴充,否則Yii不是不能利用Redis做緩存的,也可以在這裡下載下傳,這是我下好的。

<a target="_blank" href="http://pan.baidu.com/s/1bnaYwmr">RedisCache</a>

下載下傳解壓放在extensions目錄,在主配置檔案裡做如下修改:

最後補充一下,為什麼加這個keyPrefix配置,因為,如果你想用telnet通過key擷取memcached或者Redis中的緩存value,是擷取不到的,因為Yii架構給key會加上預設字首,如果你在這裡配置了,Yii架構就不會再對key進行處理了,這樣你就可以通過telnet擷取到緩存資料了。

好了,就到這裡了。