Рубрики
Uncategorized

Кэширование данных на уровне модели laravel

Автор оригинала: David Wong.

Статья была переслана из профессионального сообщества разработчиков 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 для определения этого метода, чтобы вы могли использовать его в составной модели или определить все методы расширения модели в базовой модели. Вы даже можете захотеть получить ключ кэша() Модель метода использует контракт на использование (интерфейс).

Я надеюсь, что вы нашли эту простую технологию очень полезной!