laravel redis 缓存失效主因是:未启用 redis 驱动(需设 cachedriver=redis)、redis database 库冲突(缓存应避开 0 库)、cache::remember() 序列化失败(勿缓存模型实例或闭包)、key 含特殊字符(仅用字母数字及 : - 或 urlencode)。

Redis 驱动在 Laravel 中不是默认启用的
装完 Laravel 和 Redis 服务,php artisan cache:clear 还报错?大概率是缓存驱动没切到 redis,Laravel 默认用的是 file。不改配置,所有缓存操作都走文件系统,压根不会连 Redis。
- 检查
.env:必须有CACHE_DRIVER=redis(不是REDIS_CACHE,那是旧版写法) -
config/cache.php中的'default'值会受.env的CACHE_DRIVER覆盖,但得确保该文件里'redis'配置块存在且没被注释掉 - 如果同时用 Redis 做缓存和队列,别混淆
CACHE_DRIVER和QUEUE_CONNECTION—— 它们各自独立读取 Redis 配置
redis 配置项容易漏掉 database 导致连接成功但操作失败
常见现象:php artisan tinker 里执行 Cache::put('test', 'ok') 没报错,但 Cache::get('test') 返回 null。问题常出在 Redis 连接用了默认 database 0,而 Laravel 缓存配置里没显式指定 database,或指错了。
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
- 在
config/database.php的redis配置下,'cache'连接必须包含'database' => 1(或其他非 0 的库,避免和 session、queue 冲突) -
.env中不能只写REDIS_HOST=127.0.0.1,还得补上REDIS_CACHE_DATABASE=1(如果你在config/database.php里用env('REDIS_CACHE_DATABASE', 0)读取) - Laravel 9+ 默认配置已带
database字段,但很多项目从旧版升级时会删掉它,结果连上的是 database 0,而其他组件(比如 Horizon)可能占用了 database 0,缓存数据被覆盖或隔离了
Cache::remember() 在 Redis 下失效,可能是序列化方式不一致
本地开发用 array 驱动没问题,切到 redis 后 Cache::remember('key', 3600, fn() => [...]) 总是重新执行回调?关键点在于 Laravel 对 Redis 使用的是 PHP 的 serialize(),而某些对象(如 Eloquent 模型、闭包、资源句柄)无法正确序列化或反序列化。
- 避免直接缓存 Eloquent 模型实例;改用
$model->toArray()或$model->toJson() - 不要在
remember()回调里返回闭包、resource、Generator等不可序列化类型 - 如果用了
redis.serializer = php(php.ini或redis.conf),保持一致;但 Laravel 默认不依赖 ini 设置,它自己调用serialize()/unserialize(),所以更推荐统一用数组/字符串
缓存键名含特殊字符导致 Redis 操作异常
手动用 Cache::put('user:123:profile', ...) 没问题,但换成 Cache::put('user:123:profile:name@domain.com', ...) 就卡住或返回 false?Redis 本身支持任意字节作为 key,但 Laravel 的 redis 缓存驱动会对 key 做前缀拼接和转义,部分符号(如 @、/、控制字符)可能干扰内部处理逻辑或被 Redis 客户端拒绝。
- 一律使用字母、数字、冒号、下划线、短横线;避免
@、.、/、空格、中文 - 需要保留语义可读性时,用
urlencode()处理动态段,比如'user:'.urlencode($email).':profile' - 不要依赖 Redis CLI 直接
KEYS user*查看缓存 —— Laravel 默认加了前缀(如laravel_database_),真实 key 是laravel_database_user:xxx,用redis-cli --scan --pattern 'laravel_database_user*'










