Yii框架分布式快取的實現方案

2021-07-07 06:26:02 字數 2823 閱讀 5699

yiiframework簡稱yii,讀作易,代表簡單(easy)、高效(efficient)、可擴充套件(extensible),yii將物件導向思想以及**的重用性發揮到了極致,尤其是在快取的支援上,yii是最有效率的php框架之一。

yii的快取支援封裝在框架核心的caching資料夾下面,如下圖是yii支援的快取儲存介質。

如果要做跨session和請求的分布式快取,可以選用cfilecache,如果要做跨webserver的分布式快取,就必須用cmemcache或crediscache快取。

yii 使用者登陸機制  

yii中引入js和css檔案  

yii 不完全解決方案  

yii cgridview 基本使用 

1.跨session和請求分布式快取處理方案(只有一台web伺服器、利用快取依賴實現快取實時更新)

yii快取支援需要在專案的主配置檔案新增相應的配置支援。

'components'=>array(

//設定快取

'cache'=>array(

'class'=>'cfilecache',

),),

yii中不管快取介質是磁碟、資料庫還是記憶體,賦值和取值都是統一的,這樣的話,當我們有更換快取介質的時候就可以改一下主配置檔案,程式**一點都不用動,這也是yii將**重用性發揮到極致的乙個很好體現。

a.快取的賦值:

下面舉乙個具體呼叫案例:

$products=['id'=>1,'name'=>'茅台酒'];

上面是乙個常用的案例,我們將'product'作為key,$products陣列當做value,過期時間為30秒(若永不過期此處填0),同時依賴全域性快取變數'version'這個值。

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

b.快取值的獲取

下面舉乙個具體呼叫案例:

跨session和請求分布式快取的實現方案demo:

讀取執行緒**:

寫執行緒**:

$command=$pro->createcommand("insertinto}(`name`,`color`,`version`)values('依賴','黑色',1)");

$command->execute();

//設定快取依賴,讓快取過期

上面的業務邏輯如下圖:

讀執行緒每次獲取快取的時候都會驗證一下快取依賴是否值發生變化,如果快取依賴值變化了就獲取不到快取,獲取不到快取就會去資料庫查詢結果,查詢到結果後,重新設定快取;如果快取依賴值沒有發生變化,直接獲取快取,不再連線資料庫並將值返回給瀏覽器,這樣讀執行緒完成了任務。

寫執行緒直接運算元據庫,將資料更新到資料庫,然後他只需要更新denp快取依賴就可以返回瀏覽器了,當然,寫執行緒也可以直接清除對應的快取,這樣寫執行緒完成任務。

當你想更新快取介質的時候,如memcached做分布式快取介質,前提是web伺服器安裝php的memcached擴充套件,在web程式內只需要在主配置檔案中做如下修改:

'components'=>array(

//設定快取

'cache'=>array(

'class'=>'cmemcache',

'servers'=>array(

array('host'=>'192.168.1.16','port'=>11211,'weight'=>60),

array('host'=>'192.168.1.16','port'=>11212,'weight'=>40),

),),

),2.跨web伺服器分布式快取處理方案

跨web伺服器的分布式快取就得借助於memcached或redis了,如下圖:

瀏覽器將讀/寫請求交給反向**nginx或者f5硬體,再由nginx將請求分發給各自的web伺服器,各自web伺服器共享快取伺服器。

上圖是利用cache server來實現的分布式快取實時更新,處理流程:

1號讀執行緒開始請求快取,請求不到,讀取資料庫,設定快取,將查詢結果返回給瀏覽器;2號讀執行緒,請求快取,請求到快取,將結果返回給瀏覽器;寫執行緒直接運算元據庫,刪除快取,返回瀏覽器;1號讀執行緒讀不到快取,讀取資料庫,設定快取,將查詢結果返回給瀏覽器。

讀執行緒**:

/**讀執行緒

*@return mixed

*/public function actionwide()

echo json_encode($products);

}寫執行緒**:

'components'=>array(

//設定快取

'cache'=>array(

'class'=>'ext.redis.crediscache',

'servers'=>array(

array('host'=>'192.168.1.16','port'=>6379,),

),'keyprefix'=>'',

),),

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

好了,就到這裡了。

分布式快取布置方案

有時我們僅布置一台快取機器 如mencached,redis 是不夠的,因此需要分布式快取。那麼問題來了,當我們布置了多台機器,我們如何確定乙個資料應該儲存在哪一台機器上?或者說,我們怎麼知道我們要查詢的資料分布在哪一台機器上?通常有以下兩種方式 普通hash分布 一致性hash分布 下面以php為...

實現分布式快取

1概述 通常情況下我們執行程式的過程中會產生一些中間資料,這些中間資料需要在將來的某個時間讀取。這就要求我們要把它存在乙個提供高速訪問的地方,最好的選擇就是記憶體中。基於這個以及多個原因需要我們把這部分儲存到其他機器上,這樣就產生了分布式快取的問題。實際上分布式快取根本上就是提供乙個附加記憶體讓另一...

JAVA實現分布式快取

1概述 通常情況下我們執行程式的過程中會產生一些中間資料,這些中間資料需要在將來的某個時間讀取。這就要求我們要把它存在乙個提供高速訪問的地方,最好的選擇就是記憶體中。基於這個以及多個原因需要我們把這部分儲存到其他機器上,這樣就產生了分布式快取的問題。實際上分布式快取根本上就是提供乙個附加記憶體讓另一...