聲明:本文閱讀對象最好是對Yii和分布式緩存有一定了解的人群,否則了解和掌握上有一些困難,建議閱讀之前做好以上兩點基礎準備。
YiiFramework簡稱Yii,讀作易,代表簡單(easy)、高效(efficient)、可擴充(extensible),Yii将面向對象思想以及代碼的重用性發揮到了極緻,尤其是在緩存的支援上,Yii是最有效率的PHP架構之一。
Yii的緩存支援封裝在架構核心的caching檔案夾下面,如下圖是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:
讀取線程代碼:
寫線程代碼:
上面的業務邏輯如下圖:
讀線程每次擷取緩存的時候都會驗證一下緩存依賴是否值發生變化,如果緩存依賴值變化了就擷取不到緩存,擷取不到緩存就會去資料庫查詢結果,查詢到結果後,重新設定緩存;如果緩存依賴值沒有發生變化,直接擷取緩存,不再連接配接資料庫并将值傳回給浏覽器,這樣讀線程完成了任務。
寫線程直接操作資料庫,将資料更新到資料庫,然後他隻需要更新Denp緩存依賴就可以傳回浏覽器了,當然,寫線程也可以直接清除對應的緩存,這樣寫線程完成任務。
當你想更新緩存媒體的時候,如Memcached做分布式緩存媒體,前提是web伺服器安裝php的memcached擴充,在web程式内隻需要在主配置檔案中做如下修改:
2.跨Web伺服器分布式緩存處理方案
跨Web伺服器的分布式緩存就得借助于Memcached或Redis了,如下圖:
浏覽器将讀/寫請求交給反向代理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擷取到緩存資料了。
好了,就到這裡了。