訪問多種緩存存儲
你可以通過 Cache
假面的 store
方法來訪問多種緩存存儲。傳遞到 store
方法的 key 應該與你的 cache
配置文件中的 stores
配置項的列表之一相匹配:
$value = Cache::store('file')->get('foo'); Cache::store('redis')->put('bar', 'baz', 10);
獲取緩存項
你可以通過使用 Cache
假面的 get
方法來從緩存中獲取相關項的值。如果該項在緩存中並不存在,則返回 null
。如果你需要,你也可以傳遞第二個參數到 get
方法,這個參數所傳遞的值會在緩存中項不存在時被返回:
$value = Cache::get('key'); $value = Cache::get('key', 'default');
你甚至可以傳遞 Closure
作為默認值。如果緩存的項不存在,Closure
所返回的值將被做為默認值。傳遞閉包的方式可以使你從數據庫或者其他外部服務中延遲獲取默認值:
$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(); });
如果緩存中沒有檢索到該項,傳遞到 remeber
方法中的閉包將會被執行並且其執行結果將會在緩存中進行替換。
你也可以合並 remember
和 forever
方法:
$value = Cache::rememberForever('users', function () { return DB::table('users')->get(); });
檢索並刪除
如果你需要檢索一個項目,並在檢索到的同時從緩存中刪除該項,你可以使用 pull
方法。就像 get
方法一樣,如果未檢索到該項,將會返回 null
:
$value = Cache::pull('key');
存儲項目到緩存
你可以使用 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');
從緩存中移除項目
你可以使用 Cache
假面的 forget
方法來從緩存中移除某項:
Cache::forget('key');
你可以使用 flush
方法來擦除所有的緩存:
Cache::flush();
擦除緩存並不會根據前綴來進行智能擦除,它會移除所有的緩存。所以如果你的應用和其他的應用共享緩存,你應該謹慎的使用該方法。
緩存標簽
注意: 緩存標簽並不支持
file
或者database
緩存驅動。另外,對於將多種標簽標記為永久存儲的驅動,性能最好的是能夠提供自動清除過期記錄的驅動,比如memcached
。
存儲標記了的項目到緩存
緩存標簽允許你將相關的項目進行關聯標記。並且允許一次性清除所有給定標簽的緩存項。你可以通過有序的標簽數組來訪問被標記的緩存項目。比如,讓我們訪問被標記的項目並使用 put
方法來設置緩存值:
Cache::tags(['people', 'artists'])->put('John', $john, $minutes); Cache::tags(['people', 'authors'])->put('Anne', $anne, $minutes);
事實上,你並沒有被限制只使用 put
方法。你可以在標簽中使用任意的緩存存儲方法。
訪問被標記的緩存項
為了訪問被標記了的緩存項,你需要傳遞相應的有序列表到 tags
方法:
$john = Cache::tags(['people', 'artists'])->get('John'); $anne = Cache::tags(['people', 'authors'])->get('Anne');
你可以一次性的擦除分配的標記或者標記列表中的所有項。比如,你可以使用 flush
方法來刪除所有的 people
和 authors
標簽和兩者組成的有序列標簽里的所有緩存項。所以,Anne
和 John
都會被從緩存中移除:
Cache::tags(['people', 'authors'])->flush();
下面的語句將會作為上面語句的對照,將只會從緩存中刪除 authors
標簽的項目,所以 Anne
會被刪除,而 John
被保留:
Cache::tags('authors')->flush();
添加自定義的緩存驅動
為了在自定義的緩存驅動中繼承 laravel 的緩存。我們需要使用 Cache
假面的 extend
方法,該方法被用來綁定自定義緩存到底層管理中。通常這些都是在服務提供者中完成。
比如,注冊一個新的緩存驅動並命名為 'mongo':
<?php namespace App\Providers; use Cache; use App\Extensions\MongoStore; use Illuminate\Support\ServiceProvider; class CacheServiceProvider extends ServiceProvider { /** * Perform post-registration booting of services. * * @return void */ public function boot() { Cache::extend('mongo', function ($app) { return Cache::repository(new MongoStore); }); } /** * Register bindings in the container. * * @return void */ public function register() { // } }
第一個被傳遞到 extend
方法中的參數應該是驅動的名稱。這個名稱應該和你的 config/cache.php
配置文件中的 driver
選項一致。而第二個參數是一個閉包,該閉包應該返回一個 Illuminate\Cache\Repository
的實現。在閉包中將會被傳遞一個 $app
實例,這個實例是 laravel 中的服務容器的實例。
Cache::extend
方法的調用應該在 App\Providers\AppServiceProvider
的 boot
方法中完成。或者你可以創建自己的服務提供者來存儲這個擴展。但是不要忘記在 config/app.php
文件中進行注冊。
為了創建我們自己的緩存驅動,我們首先需要實現 Illuminate\Constracts\Cache\Store
契約的接口。所以,我們的 MongoDB 緩存實現應該看起來像這樣:
<?php namespace App\Extensions; class MongoStore implements \Illuminate\Contracts\Cache\Store { public function get($key) {} public function put($key, $value, $minutes) {} public function increment($key, $value = 1) {} public function decrement($key, $value = 1) {} public function forever($key, $value) {} public function forget($key) {} public function flush() {} public function getPrefix() {} }
我們僅僅需要使用 MongoDB 連接來實現這些方法。一旦我們的實現完成,我們就可以完成自己的緩存驅動的注冊:
Cache::extend('mongo', function ($app) { return Cache::repository(new MongoStore); });
然后在 config/cache.php
配置文件中更新驅動為的名稱 driver
為你的擴展的名稱。
如果你在為自定義的緩存文件應該存放在哪里而疑惑,你可以考慮將其發布到 Packagist!或者,你可以在 app
目錄中創建一個 Extensions
命名空間。事實上,你應該謹記,laravel 並不死板的限制你的目錄結構,你應該可以根據自己的習慣自由的管理你的應用目錄結構。
事件
如果你想在任何緩存被操作時執行額外的代碼,你可能需要監聽緩存的觸發事件。通常的你應該存放這些事件監聽器到你的 EventServiceProvider
:
/** * The event listener mappings for the application. * * @var array */ protected $listen = [ 'Illuminate\Cache\Events\CacheHit' => [ 'App\Listeners\LogCacheHit', ], 'Illuminate\Cache\Events\CacheMissed' => [ 'App\Listeners\LogCacheMissed', ], 'Illuminate\Cache\Events\KeyForgotten' => [ 'App\Listeners\LogKeyForgotten', ], 'Illuminate\Cache\Events\KeyWritten' => [ 'App\Listeners\LogKeyWritten', ], ];
作者:Dearmadman
鏈接:https://www.jianshu.com/p/46a7b2d3603c
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。