在Laravel 5应用程序中将Redis配置为缓存接口

时间:2019-06-24 20:52:14

标签: php laravel laravel-5 caching redis

我有一个 Laravel 应用程序,正在将 Redis Server 集成到其中以处理应用程序缓存。但是,Redis配置存在问题,因为我无法使用 Laravel 缓存外观访问 Redis 界面。

我设置了一个redis服务器,并确认该服务器正在服务器上运行:

> redis-cli
127.0.0.1:6379 > ping
PONG

然后,我从这里开始关注Redis / Laravel的集成文档: https://laravel.com/docs/5.7/redis

我安装了composer predis / predis软件包...
我在Laravel中将其设置为使用默认的Redis配置:

app / config / cache.php:

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

app / 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 Facade ...

访问 Redis
  

使用Illuminate \ Support \ Facades \ Redis;

...但不是来自 Cache Facade

  

使用Illuminate \ Support \ Facades \ Cache;

    // ************* 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>


足够有趣的是,“缓存外观”仍然可以正常运行。如果我在 Telescope 中监视缓存请求,则示例中未显示在 Redis Server 中的4个缓存请求仍将缓存在某个位置,并使用Cache Facade检索这四个值很好用。

...所有这些都检索正确的值:

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

那么这是怎么回事?

Laravel似乎正确地使用了[redis]缓存驱动程序,因为当我关闭 Redis Server 并重新测试应用程序时,整个应用程序都会引发 Predis Connection Exception >:

  

在AbstractConnection.php第155行:连接被拒绝[tcp://127.0.0.1:6379]

缓存密钥存储在哪里,为什么不能使用“ redis-cli”在终端中查看存储的密钥?

  

redis-cli KEY'*'

监视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命令,也不会直接获取任何数据。

3 个答案:

答案 0 :(得分:2)

Redis cache store默认使用cache数据库连接。如果您查看config/database.php,则默认情况下它将切换到数据库1进行缓存。要查看终端中的键,必须select首先使用哪个数据库。

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

使用不同的数据库可以使您的缓存和会话存储区分开,当您需要删除所有缓存键(flushdb)但保持用户会话时,这会很方便。您甚至可以为队列添加单独的连接。请注意,it's not recommended要使用多个数据库,请改用多个Redis实例。

答案 1 :(得分:0)

  

如评论中所述,与显式定义商店相比,正确设置默认值将是更好的解决方案

您需要指定商店:

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

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

答案 2 :(得分:0)

简单的解决方案!

config\database.php中,用default更新cache1的值

'redis' => [

    'default' => [

         // Other settings...

        'database' => env('REDIS_DB', 1),
    ],

    'cache' => [

         // Other settings...

        'database' => env('REDIS_CACHE_DB', 1),
    ],

],