【问题标题】:Configuring Redis as Cache interface in a Laravel 5 Application在 Laravel 5 应用程序中将 Redis 配置为缓存接口
【发布时间】:2019-11-06 16:28:57
【问题描述】:

我有一个 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 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>


有趣的是,Cache Facade 似乎仍然正常运行。如果我在 Telescope 中监视缓存请求,则示例中未显示在 Redis 服务器 中的 4 个缓存请求仍被缓存在某处,并使用 Cache 门面检索这 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 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 命令也不会直接获取任何数据。

【问题讨论】:

  • 您的.env 是什么样的?示例中的CACHE_DRIVER 设置为file,因此如果您复制了.env.example,则会设置为使用错误的驱动程序。
  • 不是 .env 文件。我还在那里更新了“CACHE_DRIVER”……我只是将 .env 的内容添加到问题信息中。

标签: php laravel laravel-5 caching redis


【解决方案1】:

正如 cmets 中提到的,正确设置默认值会比显式定义存储更好的解决方案

您需要指定商店:

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

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

【讨论】:

  • 正确设置默认值会是更好的解决方案。唯一应该明确定义存储的时候是当您需要为应用程序的不同部分使用不同的存储时。
  • 显式定义存储与设置默认值具有相同的效果。都不行。
【解决方案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实例。

【讨论】:

    【解决方案3】:

    简单的解决方案!

    config\database.php 中更新defaultcache 的值与1

    'redis' => [
    
        'default' => [
    
             // Other settings...
    
            'database' => env('REDIS_DB', 1),
        ],
    
        'cache' => [
    
             // Other settings...
    
            'database' => env('REDIS_CACHE_DB', 1),
        ],
    
    ],
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-22
      • 2020-09-04
      • 2018-10-05
      • 1970-01-01
      • 2017-04-02
      • 2019-07-31
      • 1970-01-01
      • 2015-06-26
      相关资源
      最近更新 更多