Я никогда особо не занимался кешированием, но сейчас пытаюсь немного поиграться с ним. У меня есть информационная панель, которая возвращает много данных, и, чтобы немного облегчить нагрузку, я кэширую данные следующим образом:

return cache()->rememberForever('something', function () {
    return auth()->user()->something()->get();
});

Где «что-то» - это просто родственная модель. При создании новой записи в методах контроллера store и update я просто делаю следующее:

cache()->forget('something');

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

Есть ли простой способ просто кэшировать данные для каждого пользователя?

3
Hardist 30 Дек 2017 в 22:36

2 ответа

Лучший ответ

Вы можете сделать что-то вроде этого, чтобы хранить пользовательский объект для каждого пользователя отдельно:

return cache()->rememberForever('something' . auth()->id(), function () {
    return auth()->user()->something()->get();
});

Чтобы получить данные для аутентифицированного пользователя:

 cache('something' . auth()->id());
5
Alexey Mezenin 30 Дек 2017 в 19:49

Кэширование для каждого пользователя не обязательно имеет большой смысл, о котором я могу думать сразу (не говоря уже о том, что для этого нет странного варианта использования). Целью кэширования является не создание «сеансового» хранилища для данного пользователя, а облегчение нагрузки на все приложение для всех пользователей.

Я бы начал с вопроса, почему вам нужно кешировать для каждого пользователя. Возможно, существует фундаментальное непонимание того, как работает Laravel Caching, или, возможно, архитектура приложения плохо спроектирована? Я рекомендую кэшировать все, кроме пользовательской информации.

Есть несколько пакетов, которые могут с этим помочь, я создал один, чтобы избавиться от своего зуда: https://github.com/GeneaLabs/laravel-model-caching. Этот пакет направлен на абстрактное кэширование и автоматическое кэширование взаимодействий с базой данных (за исключением информации пользователя) для вас. При этом учитываются все условия предложения WHERE, поэтому каждый запрос будет кэшироваться по-разному для разных предложений WHERE. Это означает, что ваши конфиденциальные данные будут возвращены только для правильного пользователя (предположительно, идентификатор пользователя или какой-либо другой идентификатор будет в предложении WHERE).

-1
mike.bronner 31 Дек 2017 в 00:39