Laravel 9 使用 Redis 缓存标签需先启用 stores.redis.taggable = true,再通过 Cache::tags(['users'])->flush() 批量清除,要求驱动为 Redis、标签为字符串数组、配置已生效且清除操作交集匹配。

在 Laravel 9 中使用 Redis 驱动开启缓存标签(Cache Tags)并调用 flush() 清除指定标签下的全部缓存,需要满足几个关键前提,操作过程也需注意细节。Redis 本身不原生支持标签,Laravel 是通过额外元数据 key(如 tags:users:ids)模拟实现的,因此配置和写法必须严格对齐。
确认 Redis 驱动与 taggable 已启用
这是最常被忽略的第一步。即使 CACHE_DRIVER=redis,若未启用标签支持,Cache::tags(...)->flush() 会静默失败或报错。
- 检查
config/cache.php中'stores.redis.taggable'是否为 true(Laravel 9 默认为 false,需手动开启) - 确保
'default' => 'redis',且'stores.redis.connection'指向config/database.php中已配置有效的 Redis 连接名(如'default') - 运行
php artisan config:clear生效新配置
写入带标签的缓存项
标签必须是字符串数组,且只能用于支持的驱动(Redis 或 Memcached)。写入时自动建立标签与实际缓存键的映射关系。
- 示例:存储用户资料并打上
['users', 'profile']标签
use Illuminate\Support\Facades\Cache;
Cache::tags(['users', 'profile'])->put('user_123', [
'name' => 'Alice',
'role' => 'admin'
], 3600);
- 可叠加多个标签,如
['admin', 'notifications', 'unread'],后续清除需交集匹配 - 避免在不同环境/项目中混用相同标签名,建议加前缀(如
env('APP_ENV').'_users')
执行 flush() 批量清除指定标签缓存
flush() 是原子性操作,直接删除该标签(或标签组合)下所有关联缓存项,不依赖 key 扫描,效率高。
- 清除所有带
'users'标签的缓存:Cache::tags(['users'])->flush(); - 清除同时拥有
'admin'和'permissions'标签的缓存(交集):Cache::tags(['admin', 'permissions'])->flush(); - 显式指定 store 更稳妥(尤其多 Redis 实例时):
Cache::store('redis')->tags(['notifications'])->flush();
验证清除是否生效
清除后建议快速验证,避免因配置未生效或标签不一致导致误判。
- 用
Cache::get('user_123')检查原缓存键是否返回null - 进入 Redis CLI,执行
KEYS *users*(仅开发环境),确认无残留缓存键及tags:users:*元数据 key - 若使用
predis,可在 tinker 中调试:Cache::store('redis')->tags(['users'])->get('user_123')应返回null



















