Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t…
Возможно, вы уже кэшировали данные модели раньше, но я покажу вам более сложную технологию кэширования моделей laravel с использованием модели динамической записи, которую я изучил в железнодорожных передачах в начале.
С помощью уникального ключа кэша модели вы можете кэшировать свойства и ассоциации модели, которые автоматически обновляются (и кэшируются недействительными) при обновлении модели (или связанной модели). Одним из преимуществ является то, что данные, которые обращаются к кэшу, более часто используются повторно, чем данные, которые кэшируются в контроллере, поскольку они находятся в модели, а не в одном методе контроллера.
Это ключевой момент технологии:
Предположим, у вас есть много Комментариев К Статье Модели, учитывая следующий шаблон блейда laravel, вы можете получить к нему доступ следующим образом /статья/:идентификатор Количество комментариев, полученных во время маршрутизации:
$article->comments->count() {{ str_plural('Comment', $article->comments->count())
Вы можете кэшировать количество комментариев в контроллере, но когда у вас есть несколько одноразовых запросов и данных для кэширования, контроллер становится очень раздутым. С помощью контроллера не очень удобно получать доступ к кэшированным данным.
Мы можем создать шаблон, который обращается к базе данных только при обновлении статьи, и весь код, обращающийся к модели, может получить значение кэша:
$article->cached_comments_count {{ str_plural('Comment', $article->cached_comments_count)
Используя средство доступа к модели, мы можем кэшировать количество комментариев на основе последнего обновления статьи.
Итак, как нам обновить updated_at Как насчет значения столбца?
Сначала введите метод касания.
Запуск модели
Вы можете использовать метод touch() для обновления значения столбца updated_at :
$ php artisan tinker >>> $article = \App\Article::first(); => App\Article {#746 id: 1, title: "Hello World", body: "The Body", created_at: "2018-01-11 05:16:51", updated_at: "2018-01-11 05:51:07", } >>> $article->updated_at->timestamp => 1515649867 >>> $article->touch(); => true >>> $article->updated_at->timestamp => 1515650910
Мы можем аннулировать кэш с обновленным значением метки времени. Однако при добавлении или удалении комментария, как мы можем запустить updated_at Как насчет полей?
Бывает, что в красноречивой модели есть атрибут под названием $прикосновения . Вот как выглядит наша обзорная модель:
belongsTo(Article::class);
}
}
Здесь $касается Свойство представляет собой массив, содержащий соответствующую информацию, которая будет срабатывать при создании, сохранении или удалении комментария.
Кэшированные свойства
Давайте вернемся к $article->cached_comments_count Доступ. Реализация этого метода может быть похожа на Приложение\Статья Как это выглядит в модели:
public function getCachedCommentsCountAttribute()
{
return Cache::remember($this->cacheKey() . ':comments_count', 15, function () {
return $this->comments->count();
});
}
Мы используем метод cache Key () , который кэширует модель в течение 15 минут, а затем просто возвращает значение количества комментариев в методе закрытия.
Обратите внимание, что мы также используем метод Cache::rememberForever () , полагаясь на политику сбора мусора механизма кэширования для удаления значений ключей с истекшим сроком действия. Я установил таймер так, чтобы через каждые 15 минут интервала обновления кэша кэш мог иметь самую высокую частоту посещений в большинстве диапазонов этого времени.
ключ кэша() Метод использует уникальное значение ключа модели, и при обновлении модели происходит сбой соответствующего кэша. Вот мой CacheKey Код реализации:
public function cacheKey()
{
return sprintf(
"%s/%s-%s",
$this->getTable(),
$this->getKey(),
$this->updated_at->timestamp
);
}
Модель ключ кэша() Пример вывода метода может возвращать следующую строковую информацию:
articles/1-1515650910
Значение ключа состоит из имени таблицы, значения идентификатора модели и текущего обновленного_at Значения метки времени. Как только мы запускаем модель, значение метки времени обновляется, и наш кэш модели соответственно становится недействительным.
Ниже приведен Статья Полный код модели:
getTable(),
$this->getKey(),
$this->updated_at->timestamp
);
}
public function comments()
{
return $this->hasMany(Comment::class);
}
public function getCachedCommentsCountAttribute()
{
return Cache::remember($this->cacheKey() . ':comments_count', 15, function () {
return $this->comments->count();
});
}
}
И потом, это связано. Комментарий Модель:
belongsTo(Article::class);
}
}
Что дальше?
Я показал вам, как кэшировать простое количество комментариев, но как кэшировать все комментарии?
public function getCachedCommentsAttribute()
{
return Cache::remember($this->cacheKey() . ':comments', 15, function () {
return $this->comments;
});
}
Вы также можете преобразовать комментарии в массив вместо модели сериализации, которая обеспечивает только простой доступ к массиву данных на переднем конце:
public function getCachedCommentsAttribute()
{
return Cache::remember($this->cacheKey() . ':comments', 15, function () {
return $this->comments->toArray();
});
}
Наконец-то я был Статья ? определено в методе model CacheKey () , но вы можете передать трассировку ProvidesModelCacheKey для определения этого метода, чтобы вы могли использовать его в составной модели или определить все методы расширения модели в базовой модели. Вы даже можете захотеть получить ключ кэша() Модель метода использует контракт на использование (интерфейс).
Я надеюсь, что вы нашли эту простую технологию очень полезной!