返回

Redis CLI 不显示 Laravel 缓存键?问题分析与解决

php

Redis CLI 未显示 Laravel 缓存键问题分析

当在 Laravel 应用中使用 Redis 缓存,并通过 Cache::remember 等方法存储数据后,发现使用 redis-cli 查看键时却找不到对应键值,这可能让人困惑。本文深入探讨此问题的原因并提供有效的解决方案。

问题根源:默认数据库配置

Redis 支持多个数据库(默认为 16 个,编号从 0 到 15)。Laravel 默认配置使用数据库 0,但在 redis-cli 中,如果你没有指定数据库,可能会连接到另一个数据库(比如默认连接到 0),造成键“未存储”的假象。 关键问题在于应用实际存储缓存的数据库和 redis-cli 连接的数据库可能不同。

解决方法一:指定数据库

redis-cli 中,你可以使用 -n 参数来指定数据库。 要查找你 Laravel 应用正在使用的数据库,需检查 Laravel 应用的 config/database.php 配置。特别留意 redis 配置项中的 database 参数。找到这个数据库号之后, 重新连接 Redis-Cli,这次记得带上数据库参数。

  • 操作步骤:

    1. 打开 config/database.php 文件,找到 redis 部分配置。
    2. 记下 database 对应的值(假设是 1)。
    3. 在终端中,使用以下命令连接 redis-cli
    redis-cli -n 1
    
    1. 再次运行 KEYS * 命令查看。

    这个步骤非常关键,避免错误地假设存储在默认数据库上。

  • 代码示例:

    config/database.php (相关部分示例):

    ```php
      'redis' => [
         'client' => env('REDIS_CLIENT', 'phpredis'),
            'options' => [
            'cluster' => env('REDIS_CLUSTER', false),
          'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_cache_'),
         ],
         'default' => [
              'url' => env('REDIS_URL'),
                'host' => env('REDIS_HOST', '127.0.0.1'),
              'password' => env('REDIS_PASSWORD'),
              'port' => env('REDIS_PORT', 6379),
            'database' => env('REDIS_DB', 1), // 重点在此, 假设这里是1
         ],
    
      ],
    ```
    

    假设你的数据库号是 1 ,你需要用 -n 1 连接 redis-cli

解决方法二:清除应用缓存

虽然你已经执行过 php artisan config:cache,但在应用运行时可能存在其他缓存问题导致 redis 的数据出现混乱。在执行上述的数据库排查之后, 可以清除掉 Laravel 应用缓存,重新写入。

  • 操作步骤:

    1. 使用命令 php artisan cache:clear 来清除应用缓存。
    2. 确保缓存键已经从 PHP 代码中正确生成和写入 Redis 中,
      也就是再次运行一下使用了缓存的代码
    3. 然后使用redis-cli命令并加上正确的数据库号查看 KEYS * 是否返回结果
  • 额外安全建议:

    定期清除应用缓存也是保持应用性能和数据一致性的有效手段,它能有效避免由于陈旧数据带来的问题。
    

解决方法三:检查 cache.php 配置

仔细查看 config/cache.php 配置, 确保 redis 配置中的数据库匹配。特别是确保你的.env 文件中的 redis 配置和 config/database.php 的配置一致。 如果配置不一致,需要统一它们。 这样可以避免潜在的错误。

  • 代码示例:
    .env (相关部分示例):

    REDIS_HOST=127.0.0.1
    REDIS_PASSWORD=null
    REDIS_PORT=6379
    REDIS_DB=1
    

config/cache.php (相关部分示例)

'stores' => [
  'redis' => [
         'driver' => 'redis',
          'connection' => 'default', // 请确认此项与database.php 中redis下的 default 相匹配。

         'lock' => [
             'enabled' => true,
            'seconds' => 60,
        ],
  ],
],

解决方法四:连接到正确的Redis实例

确保你 redis-cli 连接的 Redis 实例确实是你的 Laravel 应用正在使用的实例。有可能存在多个 Redis 实例,你需要核对 redis-cli 连接的主机,端口信息和 Laravel 的 Redis 连接信息匹配。可以使用以下方法确认:

  • 操作步骤:
    1. 使用 redis-cli info server 命令查看当前 redis-cli 连接的 Redis 实例信息,例如,检查 listen_addresstcp_port 等,这些都显示在 Redis 的配置文件里(redis.conf), 你也需要看看应用在使用的连接参数是否与其一致。
      redis-cli info server
    
  1. 将此信息与 Laravel config/database.php 的 Redis 配置核对。

原因深入:命名空间前缀

需要强调的是: Redis key 并不仅仅只有你定义的 orders_cache, 还可能会被加上前缀, 特别是使用 Laravel 的默认 cache.prefix 配置。 请查看你的 .env 文件 和 config/database.php 配置中的redis.prefix 设置。 这个前缀可能会影响你在 redis-cli 中查询的 Key,你应该在 redis-cli中使用全称 key 名来查找, 举例来说,如果前缀是 laravel_cache_, 那么实际的 key 可能会是 laravel_cache_orders_cache, 请尝试使用全称键值进行查找。

总结

当遇到 Redis CLI 无法显示 Laravel 缓存键的问题时,排查数据库配置、检查应用缓存、核实 cache.php 配置以及验证 Redis 实例连接是至关重要的步骤。通过这些操作,能更准确地定位问题并有效地解决。同时也请注意,在日常工作中,确保 redis-cli 连接到正确的数据库和Redis 实例,并且仔细审查配置文件可以最大程度的减少类似的困惑,这也有助于构建更稳定可靠的应用。