laravel中redis缓存不会自动生效,必须显式设置cache_driver=redis、正确配置连接参数并执行php artisan config:clear与config:cache;否则cache::get()仍走file驱动。

Redis 缓存在 Laravel 里不会自动生效,哪怕你装了扩展、填了 REDIS_HOST,只要 CACHE_DRIVER 没设对或配置缓存没清,Cache::get() 就还在写文件。
CACHE_DRIVER=redis 必须显式设置,不能靠默认值
很多人改完 .env 里的 REDIS_HOST 就以为搞定了,结果 Cache::get() 还是走 file。Laravel 不会因为 Redis 配置存在就自动切驱动——它只认 CACHE_DRIVER 这个开关。
-
CACHE_DRIVER=redis必须出现在.env中,且不能被注释或拼错 - 如果项目里有多个缓存策略(比如部分用 Redis、部分用 Memcached),
default仍需设为redis,否则Cache::get()默认不走 Redis - 改完
.env后必须运行php artisan config:clear和php artisan config:cache,否则旧配置仍在内存里 - 执行
php artisan tinker后输入config('cache.default'),返回值必须是"redis"才算生效
redis-cli 能连 ≠ Laravel 能连,Docker 环境最容易栽在这
你在宿主机上 redis-cli -h 127.0.0.1 -p 6379 ping 返回 PONG,不代表 Laravel 容器能连上。Docker 容器里的 127.0.0.1 指的是容器自己,不是宿主机。
- Laravel 容器访问 Redis 容器:把
REDIS_HOST改成 Docker 网络别名,比如redis(对应docker-compose.yml中服务名) - Laravel 容器访问宿主机 Redis:用宿主机在 Docker 网络中的 IP,常见的是
172.17.0.1,不是127.0.0.1 - 验证方式不是看
redis-cli,而是直接在tinker里跑:Cache::store('redis')->put('test', 'ok', 10),再get,失败时异常 message 里会带真实连接地址和错误原因 - 若用 phpredis 扩展但没配序列化器,
get()可能返回空字符串或乱码,需在config/database.php的redis配置里加'options' => ['serializer' => 'php']
Cache::get() 查不到 key?不是没存进去,是 key 名和数据格式不对
你在 redis-cli 里 get user_123 返回 (nil),不代表 Laravel 没写成功。它默认加了前缀、用了序列化,key 名和值都不是明文。
- 真实 key 是类似
laravel_database_user_123(前缀来自config/database.php的redis.options.prefix) - 查 key 推荐用
redis-cli keys "*user_123*",或者进tinker用Cache::store('redis')->get('user_123')直接读 - 值是 PHP 序列化后的二进制数据,
redis-cli get显示的是一串不可读字符,不要用它判断存取是否成功 - 开发调试时可临时把 prefix 设为空字符串,但上线前务必改回,避免不同应用 key 冲突
多用途共用 Redis?database 分区必须隔离
如果你同时用 Redis 存缓存、Session、队列,全塞进 database 0 很容易互相覆盖或误删。Laravel 的 forget() 或 flush() 可能清掉 Session 数据。
- 在
.env里设独立 DB:比如REDIS_CACHE_DB=1、REDIS_SESSION_DB=2 - 在
config/database.php的redis.connections下,为每个用途定义独立连接,例如'cache'、'session' - 在
config/cache.php里把stores.redis.connection指向'cache',而不是'default' - 别图省事复用连接名,
connection字符串必须和database.php里定义的键完全一致,大小写敏感
最常被跳过的一步是清配置缓存;最容易被忽略的细节是 Docker 网络地址和 Redis database 分区。这两处出问题,其他都白配。











