Настройка Redis в качестве интерфейса Cache в приложении Laravel 5 - PullRequest
4 голосов
/ 24 июня 2019

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

Я установил redis-сервер и подтвердил, что он работает на сервере:

> redis-cli
127.0.0.1:6379 > ping
PONG

Затем я следовал документации по интеграции для Redis / Laravel отсюда: https://laravel.com/docs/5.7/redis

Я установил пакет predis / predis для композитора ...
Я настроил его в Laravel для использования конфигурации Redis по умолчанию:

приложение / Config / cache.php:

'default' => env('CACHE_DRIVER', 'redis'),

приложение / Config / database.php:

'redis' => [

    'client' => 'predis',

    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_DB', 0),
    ],

    'cache' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_CACHE_DB', 1),
    ],
]

.env:

BROADCAST_DRIVER=log
CACHE_DRIVER=redis
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

Теперь, когда я тестирую, я могу получить доступ к Redis через Redis Facade ...

использовать Освещение \ Поддержка \ Фасады \ Redis;

... но не с Кэша Фасад .

использовать Освещение \ Поддержка \ Фасады \ Кэш;

    // ************* this works
    Redis::set('testFromRedisSet', 'RedisSet');

    // ************* none of these work...
    Cache::store('redis')->put('testFromStoreCachePut', 'CacheStorePut', 600);

    Cache::put('testFromCachePut', 'CachePut', 600);

    Cache::remember('testFromCacheRemember', 60, function() {
       return "CacheRemember";
    });
    Cache::rememberForever('testFromCacheRememberForever', function() {
        return "CacheRememberForever";
    });

127.0.0.1: 6379> КЛЮЧИ '*'
1) "testFromRedisSet"
127.0.0.1:6379>


Интересно, что Cache Facade по-прежнему функционирует нормально. Если я отслеживаю запросы кеша в Telescope , то 4 примера кеша в примере, которые не отображаются на Redis Server , все еще где-то кэшируются и используют фасад Cache для извлечения эти 4 значения отлично работают.

... все они возвращают правильные значения:

Cache::get('testFromCacheStoreRedisPut');
Cache::get('testFromCachePut');
Cache::get('testFromCacheRemember');
Cache::get('testFromCacheRememberForever');

Так что здесь происходит?

Похоже, что Laravel правильно использует драйвер кэша [redis], потому что, когда я выключаю Redis Server и повторно тестирую приложение, все приложения выдают Исключение подключения Predis :

В строке AbstractConnection.php 155: соединение отклонено [tcp: //127.0.0.1: 6379]

Где хранятся ключи кеша и почему я не могу просмотреть сохраненные ключи в терминале, используя "redis-cli"?

redis-cli KEYS '*'

Наблюдение за Redis Server показывает, что Redis хранит данные и отправляет уведомления о событиях, но все данные, которые я не вижу в термине, имеют префикс laravel_cache. Однако в интерфейсе нет данных или хеш-ключа с таким именем.

1561596707.950397 [1 127.0.0.1:42058] "SETEX" "laravel_cache:testFromCacheStoreRedisPut" "36000" "s:18:\"CacheStoreRedisPut\";"
1561596707.950898 [1 127.0.0.1:42058] "SETEX" "laravel_cache:testFromCachePut" "36000" "s:8:\"CachePut\";"
1561596707.951521 [1 127.0.0.1:42058] "GET" "laravel_cache:testFromCacheRemember"
1561596707.952110 [1 127.0.0.1:42058] "GET" "laravel_cache:testFromCacheRememberForever"
1561596707.952718 [1 127.0.0.1:42058] "GET" "laravel_cache:testFromCacheStoreRedisPut"
1561596707.953236 [1 127.0.0.1:42058] "GET" "laravel_cache:testFromCachePut"
1561596707.953745 [1 127.0.0.1:42058] "GET" "laravel_cache:testFromCacheRemember"
1561596707.954191 [1 127.0.0.1:42058] "GET" "laravel_cache:testFromCacheRememberForever"
1561596709.251036 [0 127.0.0.1:42064] "SELECT" "1"
1561596709.251200 [1 127.0.0.1:42064] "GET" "laravel_cache:telescope:dump-watcher"
1561596709.263678 [1 127.0.0.1:42064] "GET" "laravel_cache:telescope:pause-recording"

Как я могу получить доступ к данным, хранящимся в пространстве имен laravel_cache? Даже выполнение тех же команд GET, показанных на мониторе сервера, не приводит к получению каких-либо данных напрямую.

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Redis cache store по умолчанию использует соединение с базой данных cache.Если вы посмотрите на config / database.php , он переключится на базу данных 1 для кэширования по умолчанию.Чтобы просмотреть ключи в терминале, вам нужно select, какую базу данных использовать в первую очередь.

127.0.0.1:6379> SELECT 1
127.0.0.1:6379[1]> KEYS *

Использование разных баз данных позволяет разделить кеш и хранилище сеансов, это может быть удобно, когда вам нужноудалите все ключи кеша (flushdb), но продолжайте сеанс пользователя.Вы даже можете добавить отдельное соединение для очередей.Обратите внимание, что не рекомендуется использовать несколько баз данных, вместо этого используйте несколько экземпляров Redis.

0 голосов
/ 24 июня 2019

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

Вам необходимо указать магазин:

Cache::store('redis')->put('bar', 'baz', 600); // 10 Minutes

https://laravel.com/docs/5.8/cache#cache-usage

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...