Кэш

Настройка

Laravel предоставляет унифицированное API для различных систем кэширования. Настройки кэша содержатся в файле config/cache.php. Там вы можете указать драйвер, который будет использоваться для кэширования. Laravel "из коробки" поддерживает многие популярные системы, такие как Memcached и Redis.

Этот файл также содержит множество других настроек, которые в нём же документированы, поэтому обязательно ознакомьтесь с ними. По умолчанию Laravel настроен для использования драйвера file, который хранит сериализованные объекты кэша в файловой системе. Для больших приложений рекомендуется использование систем кэширования в памяти - таких как Memcached или APC. Вы так же можете создать несколько разных конфигурций для одного драйвера.

Прежде чем использовать Redis, необходимо установить пакет predis/predis версии ~1.0 через Composer.

Использование кэша

Запись нового элемента в кэш

Cache::put('key', 'value', $minutes);

Использование объектов Carbon для установки времени жизни кэша

$expiresAt = Carbon::now()->addMinutes(10);

Cache::put('key', 'value', $expiresAt);     

Запись элемента, если он не существует

Cache::add('key', 'value', $minutes);

Метод add возвращает true, если производится запись элемента в кэш. Иначе, если элемент уже есть в кэше, возвращается false.

Проверка существования элемента в кэше

if (Cache::has('key'))
{
    //
}

Чтение элемента из кэша

$value = Cache::get('key');

Чтение элемента или возвращение значения по умолчанию

$value = Cache::get('key', 'default');

$value = Cache::get('key', function() { return 'default'; });

Запись элемента на постоянное хранение

Cache::forever('key', 'value');

Иногда вам может понадобиться получить элемент из кэша или сохранить его там, если он не существует. Вы можете сделать это методом Cache::remember:

$value = Cache::remember('users', $minutes, function()
{
    return DB::table('users')->get();
});

Вы также можете совместить remember и forever:

$value = Cache::rememberForever('users', function()
{
    return DB::table('users')->get();
});

Обратите внимание, что все кэшируемые данные сериализуются, поэтому вы можете хранить любые типы данных.

Изъятие элемента из кэша

Если понадобится получить элемент из кэша, а потом удалить его, можно воспользоваться методом pull:

$value = Cache::pull('key');

Удаление элемента из кэша

Cache::forget('key');

Доступ к определённому хранилищу

Если вы используете несколько хранилищ для кэша (с одинаковыми или разными драйверами) - вы можете обратиться к конкретному хранилищу следующим образом:

$value = Cache::store('foo')->get('key');    

Увеличение и уменьшение значений

Все драйверы, кроме file и database, поддерживают операции инкремента и декремента.

Увеличение числового значения:

Cache::increment('key');

Cache::increment('key', $amount);

Уменьшение числового значения:

Cache::decrement('key');

Cache::decrement('key', $amount);

Тэги кэша

Примечание: тэги кэша не поддерживаются драйверами file и database. Кроме того, если вы используете мультитэги для "вечных" элементов кэша (сохраненных как forever), наиболее подходящим с точки зрения производительности будет драйвер типа memcached, который автоматически очищает устаревшие записи.

Работа с тэгами кэша

При помощи тэгов вы можете объединять элементы кэша в группы, а затем очищать всю группу целиком по названию тэга. Для работы с кэшем с тэгами используйте метод tags.

Элементу кэша можно присвоить один или несколько тэгов кэша. Список тэгов можно указать либо перечислив через запятую, либо массивом:

Cache::tags('people', 'authors')->put('John', $john, $minutes);

Cache::tags(['people', 'authors'])->put('Anne', $anne, $minutes);

Любой метод для записи в кэш можно использовать в связке с тэгами, включая remember, forever и rememberForever. Элемент кэша также можно получить из кэша с тэгом, так же как и использовать другие методы кэша, такие как increment и decrement.

Получение элементов из кэша с тэгами

Чтобы получить элемент кэша, вы должны указать все тэги, под которыми он был сохранен:

$anne = Cache::tags('people', 'artists')->get('Anne');

$john = Cache::tags(['people', 'authors'])->get('John');

Вы можете очистить все элементы по тэгу или списку тэгов. Например, это выражение удалит все элементы кэша с тэгом или people, или authors, или в обоих сразу. Таким образом, и "Anne", и "John" будут удалены из кэша:

Cache::tags('people', 'authors')->flush();

Для сравнения, это выражение удалит только элементы с тэгом authors, таким образом "John" будет удален, а "Anne" нет:

Cache::tags('authors')->flush();

Кэширование в базе данных

Перед использовании драйвера database вам понадобится создать таблицу для хранения элементов кэша. Ниже приведён пример её структуры в виде миграции Laravel:

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