[TOC]
## 1、配置
Lumen為不同的緩存系統提供了統一的API。緩存配置項位于env文件。在該文件中你可以指定在應用中默認使用哪個緩存驅動。Lumen目前支持流行的緩存后端如[Memcached](http://memcached.org/)和[Redis](http://redis.io/)等。對于大型應用,推薦使用內存緩存如[Memcached](http://laravelacademy.org/tags/memcached "View all posts in Memcached")或APC。
### 1.1 緩存預備知識
**數據庫**
使用`database`緩存驅動時,你需要設置一張表包含緩存緩存項。下面是該表的`Schema`聲明:
~~~
Schema::create('cache', function($table) {
$table->string('key')->unique();
$table->text('value');
$table->integer('expiration');
});
~~~
**Memcached**
使用Memcached緩存要求安裝了[Memcached PECL 包](http://pecl.php.net/package/memcached),即PHP Memcached擴展。[Memcached::addServer](http://php.net/manual/en/memcached.addserver.php)默認配置使用TCP/IP協議。
**[Redis](http://laravelacademy.org/tags/redis "View all posts in Redis")**
在Lumen中使用Redis緩存之前,你需要通過Composer安裝`predis/predis`包(~1.0)和`illuminate/redis`包(~5.1)。
## 2、緩存使用
### 2.1 獲取緩存實例
`Illuminate\Contracts\Cache\Factory`和`Illuminate\Contracts\Cache\Repository`[契約](http://laravelacademy.org/post/95.html)提供了訪問Laravel的緩存服務的方法。`Factory`契約提供了所有訪問應用定義的緩存驅動的方法。`Repository`契約通常是應用中`cache`配置文件中指定的默認緩存驅動的一個實現。
然而,你還可以使用`Cache`[門面](http://laravelacademy.org/post/97.html),這也是我們在整個文檔中使用的方式,`Cache`門面提供了簡單方便的方式對底層Lumen緩存契約實現進行訪問。
例如,讓我們在控制器中導入`Cache`門面:
~~~
<?php
namespace App\Http\Controllers;
use Cache;
class UserController extends Controller{
/**
* 顯示應用所有用戶列表
*
* @return Response
*/
public function index()
{
$value = Cache::get('key');
//
}
}
~~~
**訪問多個緩存存儲**
使用`Cache`門面,你可以使用`store`方法訪問不同的緩存存儲器,傳入`store`方法的鍵就是cache配置文件中`stores`配置數組里列出的相應的存儲器:
~~~
$value = Cache::store('file')->get('foo');
Cache::store('redis')->put('bar', 'baz', 10);
~~~
### 2.2 從緩存中獲取數據
`Cache`門面的`get`方法用于從緩存中獲取緩存項,如果緩存項不存在,返回null。如果需要的話你可以傳遞第二個參數到`get`方法指定緩存項不存在時返回的自定義默認值:
~~~
$value = Cache::get('key');
$value = Cache::get('key', 'default');
~~~
你甚至可以傳遞一個閉包作為默認值,如果緩存項不存在的話閉包的結果將會被返回。傳遞閉包允許你可以從數據庫或其它外部服務獲取默認值:
~~~
$value = Cache::get('key', function() {
return DB::table(...)->get();
});
~~~
**檢查緩存項是否存在**
`has`方法用于判斷緩存項是否存在:
~~~
if (Cache::has('key')) {
//
}
~~~
**數值增加/減少**
`increment`和`decrement`方法可用于調整緩存中的整型數值。這兩個方法都可以接收第二個參數來指明緩存項數值增加和減少的數目:
~~~
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount);
~~~
**獲取或更新**
有時候你可能想要獲取緩存項,但如果請求的緩存項不存在時給它存儲一個默認值。例如,你可能想要從緩存中獲取所有用戶,或者如果它們不存在的話,從數據庫獲取它們并將其添加到緩存中,你可以通過使用`Cache::remember`方法實現:
~~~
$value = Cache::remember('users', $minutes, function() {
return DB::table('users')->get();});
~~~
如果緩存項不存在,傳遞給`remember`方法的閉包被執行并且將結果存放到緩存中。
你還可以聯合`remember`和`forever`方法:
~~~
$value = Cache::rememberForever('users', function() {
return DB::table('users')->get();
});
~~~
**獲取并刪除**
如果你需要從緩存中獲取緩存項然后刪除,你可以使用`pull`方法,和`get`方法一樣,如果緩存項不存在的話返回null:
~~~
$value = Cache::pull('key');
~~~
### 2.3 存儲緩存項到緩存
你可以使用`Cache`?門面上的`put`方法在緩存中存儲緩存項。當你在緩存中存儲緩存項的時候,你需要指定數據被緩存的時間(分鐘數):
~~~
Cache::put('key', 'value', $minutes);
~~~
除了傳遞緩存項失效時間,你還可以傳遞一個代表緩存項有效時間的PHP?`Datetime`實例:
~~~
$expiresAt = Carbon::now()->addMinutes(10);
Cache::put('key', 'value', $expiresAt);
~~~
`add`方法只會在緩存項不存在的情況下添加緩存項到緩存,如果緩存項被添加到緩存返回`true`,否則,返回`false`:
~~~
Cache::add('key', 'value', $minutes);
~~~
`forever`方法用于持久化存儲緩存項到緩存,這些值必須通過`forget`方法手動從緩存中移除:
~~~
Cache::forever('key', 'value');
~~~
### 2.4 從緩存中移除數據
你可以使用`Cache`門面上的`forget`方法從緩存中移除緩存項:
~~~
Cache::forget('key');
~~~