Laravel框架中實(shí)現(xiàn)使用阿里云ACE緩存服務(wù)
來(lái)源:易賢網(wǎng) 閱讀:667 次 日期:2015-02-11 14:22:12
溫馨提示:易賢網(wǎng)小編為您整理了“Laravel框架中實(shí)現(xiàn)使用阿里云ACE緩存服務(wù)”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了Laravel框架中實(shí)現(xiàn)使用阿里云ACE緩存服務(wù),本文擴(kuò)展了一個(gè)ACE緩存驅(qū)動(dòng),以便使用阿里云ACE緩存服務(wù),需要的朋友可以參考下

之前我寫(xiě)了一篇在 Laravel 4 框架中使用阿里云 OCS 緩存的文章,介紹了如何通過(guò)擴(kuò)展 Laravel 4 來(lái)支持需要 SASL 認(rèn)證的阿里云 OCS 緩存服務(wù)。有網(wǎng)友問(wèn)我,ACE 的緩存怎么在 Laravel 4 中使用。我本來(lái)覺(jué)得應(yīng)該可以完全用相同的辦法,后來(lái)自己嘗試的時(shí)候才發(fā)現(xiàn),ACE 的緩存差別非常大。所以再寫(xiě)一篇,介紹一下如何在 Laravel 框架中使用阿里云 ACE 的緩存服務(wù)。

如何擴(kuò)展 Laravel 的緩存驅(qū)動(dòng)

在 Laravel 4 中使用 Cache::get($key), Cache::put($key, $value, $minutes) 這樣的代碼時(shí),實(shí)際上是訪問(wèn) 實(shí)例化的 Illuminate\Cache\Repository, 所以我們通過(guò) Cache::extend 方法擴(kuò)展自定義緩存驅(qū)動(dòng)時(shí),同樣應(yīng)該返回一個(gè) Illuminate\Cache\Repository 對(duì)象。

Laravel 4 內(nèi)置的 Memcached 緩存驅(qū)動(dòng),實(shí)現(xiàn)的流程是這樣的:

1.創(chuàng)建一個(gè)標(biāo)準(zhǔn) Memcached 類的新對(duì)象

2.用上一步創(chuàng)建的 Memcached 對(duì)象創(chuàng)建一個(gè)實(shí)現(xiàn)了 Illuminate\Cache\StoreInterface 接口的 Illuminate\Cache\MemecachedStore 對(duì)象。

3.用上一步創(chuàng)建的 MemcachedStore 對(duì)象創(chuàng)建一個(gè) Illuminate\Cache\Repository 對(duì)象。

所以我們?cè)跀U(kuò)展自定義的 Cache 驅(qū)動(dòng)時(shí),根據(jù)自己的情況,選擇上面的某一個(gè)步驟自定義,最終還是要返回 Illuminate\Cache\Repository 對(duì)象。比如上一篇文章中,我就是在第一步,創(chuàng)建標(biāo)準(zhǔn) Memcached 對(duì)象之后,通過(guò) setSaslAuthData() 方法設(shè)定 OCS 需要的用戶名密碼。之后第2步、第3步并不需要自定義。

ACE 的緩存服務(wù)

阿里云 ACE 的緩存服務(wù),跟默認(rèn)的 OCS 有所不同:

1.通過(guò) Alibaba::Cache() 方法獲得 Cache 對(duì)象。

2.ACE 的 Cache 對(duì)象與標(biāo)準(zhǔn) Memcached 對(duì)象不同,支持的方法有限。

所以,這次第一步得到的不是標(biāo)準(zhǔn) Memcached 對(duì)象,因此就不能創(chuàng)建 Illuminate\Cache\MemcachedStore 對(duì)象。需要自己實(shí)現(xiàn) Illuminate\Cache\StoreInterface 接口。

在控制臺(tái)創(chuàng)建了緩存空間之后,會(huì)有唯一的“緩存空間名稱”,然后通過(guò) Alibaba::Cache('緩存空間名稱') 來(lái)獲得 Cache 對(duì)象。以下就是實(shí)現(xiàn) ACE 緩存服務(wù)驅(qū)動(dòng)的步驟:

1.為了方便修改,我在配置文件 app/config/cache.php 中增加一個(gè)名為 ace 的鍵,存儲(chǔ)緩存空間名稱。

2.然后創(chuàng)建一個(gè) AceMemcachedStore 類,這個(gè)類實(shí)現(xiàn) Illuminate\Cache\StoreInterface 接口。

3.最后,用 AceMemcachedStore 對(duì)象來(lái)創(chuàng)建 Illuminate\Cache\Repository 對(duì)象。

下面來(lái)看具體的代碼實(shí)現(xiàn):

編碼實(shí)現(xiàn)自定義 ACE 緩存驅(qū)動(dòng):

第一步,修改配置文件。打開(kāi) app/config/cache.php,在最后增加一行:

代碼如下:

// 指定緩存空間名稱

'ace' => 'lblog-cache',

第二步,為了方便,把自己的類文件放在 src/Ace 目錄下,使用 Ace 作為命名空間。

1.在 app 的同級(jí)目錄創(chuàng)建目錄 src/Ace。

2.打開(kāi) composer.json 文件,修改 autoload 節(jié),在 classmap 下面用 psr-0 或者 psr-4 來(lái)自動(dòng)加載文件。

代碼如下:

"autoload": {

"classmap": [

// autoload class

],

"psr-4": {

"Ace\\": "src/Ace"

}

},

創(chuàng)建 src/Ace/AceMemcachedStore.php 文件,代碼如下:

代碼如下:

namespace Ace;

use Illuminate\Cache\StoreInterface;

use Illuminate\Cache\TaggableStore;

class AceMemcachedStore extends TaggableStore implements StoreInterface {

protected $memcached;

protected $prefix;

public function __construct($space, $prefix = '') {

$this->memcached = \Alibaba::Cache($space);

$this->prefix = strlen($prefix) > 0 ? $prefix.':' : '';

}

/**

* Retrieve an item from the cache by key.

*

* @param string $key

* @return mixed

*/

public function get($key)

{

$value = $this->memcached->get($this->prefix.$key);

if(is_bool($value) && $value === false) {

return null;

}

return $value;

}

/**

* Store an item in the cache for a given number of minutes.

*

* @param string $key

* @param mixed $value

* @param int $minutes

* @return boolean

*/

public function put($key, $value, $minutes)

{

return $this->memcached->set($this->prefix.$key, $value, $minutes);

}

/**

* Increment the value of an item in the cache.

*

* @param string $key

* @param mixed $value

* @return boolean

*/

public function increment($key, $value = 1)

{

return $this->memcached->increment($this->prefix.$key, $value);

}

/**

* Decrement the value of an item in the cache.

*

* @param string $key

* @param mixed $value

* @return boolean

*/

public function decrement($key, $value = 1)

{

return $this->memcached->decrement($this->prefix.$key, $value);

}

/**

* Store an item in the cache indefinitely.

*

* @param string $key

* @param mixed $value

* @return boolean

*/

public function forever($key, $value)

{

return $this->memcached->set($key, $value, 0);

}

/**

* Remove an item from the cache.

*

* @param string $key

* @return boolean

*/

public function forget($key)

{

return $this->memcached->delete($this->prefix.$key);

}

/**

* Remove all items from the cache.

*

* @return void

*/

public function flush()

{

//$this->memcached->flush();

return false;

}

public function getMemcached()

{

return $this->memcached;

}

/**

* Get the cache key prefix.

*

* @return string

*/

public function getPrefix()

{

return $this->prefix;

}

}

這段代碼比較簡(jiǎn)單,不過(guò)要特別注意一下 get($key) 方法的實(shí)現(xiàn)。標(biāo)準(zhǔn) memcached 以及 ACE 的緩存對(duì)象的 get 方法都是key有效時(shí)返回對(duì)應(yīng)的緩存值,否則返回false,而在 Laravel 4 中,是通過(guò)檢測(cè) get 方法返回的是否 null 來(lái)做判斷,所以這里需要處理一下,返回緩存值或者null。

AceMemcachedStore類已經(jīng)創(chuàng)建好了,接下來(lái)在 bootstrap/start.php 文件中擴(kuò)展 Cache:

打開(kāi) bootstrap/start.php, 添加以下代碼:

代碼如下:

// 擴(kuò)展名為 ace 的緩存驅(qū)動(dòng)

Cache::extend('ace', function($app)

{

// 從 app/config/cache.php 文件中讀取 "ace" 的值

$space = $app['config']['cache.ace'];

// 從 app/config/cache.php 文件中讀取 "prefix" 的值

$prefix = $app['config']['cache.prefix'];

// 創(chuàng)建 \Ace\AceMemcachedStore 對(duì)象

$store = new \Ace\AceMemcachedStore($space, $prefix);

// 創(chuàng)建并返回 \Illuminate\Cache\Repository 對(duì)象

return new \Illuminate\Cache\Repository($store);

});

指定系統(tǒng)使用 'ace' 作為緩存驅(qū)動(dòng):打開(kāi) app/config/cache.php,找到 'driver' => '...' 所在行,修改為:'driver' => 'ace'.

使用和限制

通過(guò)以上操作,就可以在 Laravel 4 中調(diào)用 ACE 的緩存服務(wù),使用上與平常的用法完全一致,比如:

代碼如下:

// 添加緩存,有效時(shí)間10分鐘

Cache::put('my_key', 'my value', 10);

// 讀取緩存

Cache::get('my_key')

// 判斷緩存是否存在

Cache::has('my_key')

// 數(shù)據(jù)查詢緩存

$users = DB::table('users')->remember(10)->get();

但是由于 ACE 緩存對(duì)象本身的限制,只能刪除指定 key 的緩存對(duì)象,不能遍歷、全量操作,因此 Cache::flush() 方法就不能使用。在上面的 AceMemcachedStore 對(duì)象中,flush 方法沒(méi)有做任何操作,只是返回 false.

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看腳本欄目
易賢網(wǎng)手機(jī)網(wǎng)站地址:Laravel框架中實(shí)現(xiàn)使用阿里云ACE緩存服務(wù)
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)