Laravel 緩存系統(tǒng)及事件系統(tǒng)

緩存系統(tǒng)

Laravel 為各種后端緩存提供了豐富而統(tǒng)一的 API,其配置信息位于 config/cache.php 文件中。默認情況下,Laravel 配置為使用 file 緩存驅(qū)動,它將序列化的緩存對象存儲在文件系統(tǒng)中陕习。

緩存配置

mysql:

Schema::create('cache', function ($table) {
    $table->string('key')->unique();
    $table->text('value');
    $table->integer('expiration');
});

file:

'file' => [
    'driver' => 'file',
    'path' => storage_path('framework/cache/data'),
],

memcache:

'memcached' => [
    [
        'host' => '127.0.0.1',
        'port' => 11211,
        'weight' => 100
    ],
],

redis:

// cache.php
'redis' => [
    'driver' => 'redis',
    'connection' => 'cache',
],

// database.php
'redis' => [
    'cache' => [
        'url' => env('REDIS_URL'),
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_CACHE_DB', 1),
    ],
],

使用示例

// 獲取某個緩存
$value = Cache::get('key');
$value = Cache::get('key', 'default');
$value = Cache::get('key', function () {
    return DB::table(...)->get();
});

// 訪問多個緩存存儲
$value = Cache::store('file')->get('foo');
Cache::store('redis')->put('bar', 'baz', $seconds);

// 檢查緩存是否存在
if (Cache::has('key')) {
}

// 遞增與遞減
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount);

// 獲取不存時則存儲緩存
$value = Cache::remember('users', $seconds, function () {
    return DB::table('users')->get();
});

// 獲取數(shù)據(jù)或永久存儲緩存
$value = Cache::rememberForever('users', function () {
    return DB::table('users')->get();
});

// 獲取數(shù)據(jù)并刪除緩存(不存在返回 null)
$value = Cache::pull('key');

// 存儲緩存數(shù)據(jù)(沒有過期時間則永久有效)
Cache::put('key', 'value', $seconds);
Cache::put('key', 'value');
Cache::put('key', 'value', now()->addMinutes(10));

// 僅存儲不存在的數(shù)據(jù)(true 和 fasle)
Cache::add('key', 'value', $seconds);

// 永久存儲緩存數(shù)據(jù)(必須通過 forget 才能刪除)
Cache::forever('key', 'value');

// 刪除緩存數(shù)據(jù)
Cache::forget('key');
// 通過零或負值來刪除數(shù)據(jù)
Cache::put('key', 'value', 0);
Cache::put('key', 'value', -5);

// 清空所有的緩存
Cache::flush();

// 原子鎖(僅限使用 memcache、redis 等緩存驅(qū)動)
// 原子鎖允許對分布式鎖進行操作而不必擔心競爭條件,即使用原子鎖來確保在一臺服務器上每次只有一個遠程任務在執(zhí)行。
$lock = Cache::lock('foo', 10);
if ($lock->get()) {
    // 獲取鎖定10秒...
    $lock->release();
}
Cache::lock('foo')->get(function () {
    // 獲取無限期鎖并自動釋放...
});

// 在指定的時間限制內(nèi)無法獲取鎖則拋出異常
use Illuminate\Contracts\Cache\LockTimeoutException;
$lock = Cache::lock('foo', 10);
try {
    $lock->block(5);
    // 等待最多5秒后獲取的鎖...
} catch (LockTimeoutException $e) {
    // 無法獲取鎖...
} finally {
    optional($lock)->release();
}
Cache::lock('foo', 10)->block(5, function () {
    // 等待最多5秒后獲取的鎖...
});

// 管理跨進程鎖
// 控制器里
$podcast = Podcast::find($id);
$lock = Cache::lock('foo', 120);
if ($result = $lock->get()) {
    ProcessPodcast::dispatch($podcast, $lock->owner());
}

// 隊列里
Cache::restoreLock('foo', $this->owner)->release();

// 無視當前鎖的所有者的情況下釋放鎖
Cache::lock('foo')->forceRelease();

// Cache 輔助函數(shù)
$value = cache('key');
cache(['key' => 'value'], $seconds);
cache(['key' => 'value'], now()->addMinutes(10));
cache()->remember('users', $seconds, function () {
    return DB::table('users')->get();
});

緩存標記

緩存標簽允許你給相關的緩存標簽項打上同一個標簽以便后續(xù)可以清除這些緩存值窍侧。

// 存儲被打上標簽的緩存數(shù)據(jù)
Cache::tags(['people', 'artists'])->put('John', $john, $seconds);
Cache::tags(['people', 'authors'])->put('Anne', $anne, $seconds);

// 訪問被打上標簽的緩存數(shù)據(jù)
$john = Cache::tags(['people', 'artists'])->get('John');
$anne = Cache::tags(['people', 'authors'])->get('Anne');

// 移除帶有標簽的緩存數(shù)據(jù)
Cache::tags(['people', 'authors'])->flush();

事件系統(tǒng)

Laravel 的事件提供了一個簡單的觀察者實現(xiàn),允許你在應用中訂閱和監(jiān)聽各種發(fā)生的事件转绷。事件類通常放在 app/Events 目錄下伟件,而這些事件類的監(jiān)聽器則放在 app/Listeners 目錄下。如果在你的應用中你沒有看到這些目錄暇咆,不用擔心锋爪,它們會在你使用 Artisan 控制臺命令生成事件與監(jiān)聽器的時候自動創(chuàng)建。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爸业,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子亏镰,更是在濱河造成了極大的恐慌扯旷,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件索抓,死亡現(xiàn)場離奇詭異钧忽,居然都是意外死亡,警方通過查閱死者的電腦和手機逼肯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門耸黑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人篮幢,你說我怎么就攤上這事大刊。” “怎么了三椿?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵缺菌,是天一觀的道長。 經(jīng)常有香客問我搜锰,道長伴郁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任蛋叼,我火速辦了婚禮焊傅,結果婚禮上剂陡,老公的妹妹穿的比我還像新娘。我一直安慰自己狐胎,他們只是感情好鹏倘,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顽爹,像睡著了一般纤泵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镜粤,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天捏题,我揣著相機與錄音,去河邊找鬼肉渴。 笑死公荧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的同规。 我是一名探鬼主播循狰,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼券勺!你這毒婦竟也來了绪钥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤关炼,失蹤者是張志新(化名)和其女友劉穎程腹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儒拂,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡寸潦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了社痛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片见转。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蒜哀,靈堂內(nèi)的尸體忽然破棺而出斩箫,到底是詐尸還是另有隱情,我是刑警寧澤凡怎,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布校焦,位于F島的核電站,受9級特大地震影響统倒,放射性物質(zhì)發(fā)生泄漏寨典。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一房匆、第九天 我趴在偏房一處隱蔽的房頂上張望耸成。 院中可真熱鬧报亩,春花似錦、人聲如沸井氢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽花竞。三九已至劲件,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間约急,已是汗流浹背零远。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厌蔽,地道東北人牵辣。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像奴饮,于是被迫代替她去往敵國和親纬向。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Laravel框架一:原理機制篇 Laravel作為在國內(nèi)國外都頗為流行的PHP框架戴卜,風格優(yōu)雅逾条,其擁有自己的一些特...
    Mr_Z_Heng閱讀 3,689評論 0 13
  • 1、配置 Laravel 為不同的緩存系統(tǒng)提供了統(tǒng)一的 API叉瘩。緩存配置位于 config/cache.php膳帕。在...
    layjoy閱讀 952評論 0 1
  • 緩存 配置 Laravel 對多種緩存系統(tǒng)提供了統(tǒng)一的 API。緩存的配置文件存放在 config/cache.p...
    Dearmadman閱讀 11,985評論 0 8
  • 過去做事情急薇缅,什么東西拿起來就用,不喜歡進行系統(tǒng)性的學習攒磨,造成在使用過程中的錯誤和低效泳桦,現(xiàn)在感覺自己耐心多了,用之...
    馬文Marvin閱讀 1,981評論 0 10
  • 一娩缰、框架概述 課程概述 laravel 4天(之前TP框架還是很大的區(qū)別)(國外框架) 在線教育平臺 6天(lar...
    大大的世界小小的夢想_97ef閱讀 1,352評論 0 2