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

8
我有一个 Laravel 应用程序,我正在将 Redis 服务器集成到其中以处理应用程序缓存。然而,我在 Redis 配置方面遇到了问题,因为我无法使用 Laravel 缓存门面访问 Redis 接口。
我设置了一个 redis-server,并确认它在服务器上运行:
> 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门面访问Redis...

使用 Illuminate\Support\Facades\Redis;

...但无法通过Cache门面访问。

使用 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> KEYS '*'
1) "testFromRedisSet"
127.0.0.1:6379>


有趣的是,缓存Facade仍然似乎正常工作。如果我在Telescope中监视缓存请求,在示例中没有显示在 Redis服务器 中的4个缓存请求仍然被缓存在某个地方,使用缓存facade检索这4个值可以正常工作。

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

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

那么这里到底发生了什么?

看起来Laravel正确地使用了[redis]缓存驱动程序,因为当我关闭Redis服务器并重新测试应用程序时,整个应用程序会抛出一个Predis连接异常

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

缓存键被存储在哪里?为什么我无法使用"redis-cli"在终端中查看已存储的键值?

redis-cli KEYS '*'

监控Redis服务器向我展示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
你的 .env 文件是什么样子的?示例中的 CACHE_DRIVER 被设置为 file,所以如果你复制了 .env.example,那么它将使用错误的驱动程序。 - jfadich
这不是 .env 文件的问题。我也在那里更新了 'CACHE_DRIVER'... 我只是将 .env 的内容添加到了问题信息中。 - VerySeriousSoftwareEndeavours
3个回答

18

Redis缓存存储器默认使用cache数据库连接。如果您查看config/database.php文件,它默认切换到数据库1进行缓存。要在终端中查看键,您需要先select要使用的数据库。

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

使用不同的数据库可以让您分离缓存和会话存储,当您需要删除所有缓存键(flushdb),但保留用户会话时,这将非常方便。您甚至可以为队列添加单独的连接。请注意,不建议使用多个数据库,而应该使用多个Redis实例。


1
这也解决了我的问题。谢谢! - Kenny

0

2
正确设置默认值将是更好的解决方案。唯一需要明确定义存储的时间是当您需要为应用程序的不同部分使用不同的存储时。 - jfadich
明确定义存储具有与设置默认值相同的效果。两者都不起作用。 - VerySeriousSoftwareEndeavours

0

简单解决方案!

config\database.php中,将defaultcache的值更新为1

'redis' => [

    'default' => [

         // Other settings...

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

    'cache' => [

         // Other settings...

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

],

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接