laravel 8中数据库缓存与队列结合的核心目标是解耦读取与更新:必须将缓存操作封装为队列任务(如refreshusercache),通过dispatch分发,禁用同步cache::put/forget;优先用remember()自动管理ttl与键生成,失效采用“变更时清除+下次请求重建”策略;统一由模型观察者触发,并借助redis缓存标签实现批量精准清理。

Laravel 8 中数据库缓存与队列结合,核心目标是把“数据读取”和“缓存更新”从用户请求中剥离,避免同步操作拖慢响应、加重数据库负担。关键不在于能不能做,而在于怎么让缓存更新既及时又可靠、既解耦又可控。
缓存更新逻辑必须封装成队列任务
不能在控制器或模型事件里直接调用 Cache::put() 或 Cache::forget()。要新建 Job 类(如 RefreshUserCache),在 handle() 方法里执行缓存操作。这样任务可重试、可延迟、可指定连接与队列名。分发时用 RefreshUserCache::dispatch($user),确保它走的是队列通道而非即时执行。
优先使用 remember() 配合主动失效,而非全量覆盖
查询时用 User::where(...)->remember(3600)->get(),比手动 Cache::put() 更安全——它自带键生成、序列化、TTL 管理。缓存失效不靠“更新时重写”,而靠“变更时清除”:模型更新后,队列任务只调用 Cache::forget('users_list') 或 Cache::tags(['users'])->flush(),下次请求自然重建。这避免了写入失败导致脏数据残留。
用模型观察者统一触发,减少分散调用
在 App\Observers\UserObserver 的 updated() 或 deleted() 方法里,直接分发缓存清理任务:
– InvalidateUserCache::dispatch($user);
– RefreshUserProfileCache::dispatch($user);
再通过 User::observe(UserObserver::class) 注册。这样所有 User 模型的变更都经过同一入口,逻辑集中、易于维护,也不用在每个控制器里重复写 dispatch。
Redis 驱动 + 缓存标签提升管理粒度
配置 CACHE_DRIVER=redis,并在缓存写入时打标签:
– Cache::tags(['users', 'active'])->put('user_123', $data, 3600);
– Cache::tags(['users'])->flush();
配合队列任务,在用户状态变更或角色调整后,按标签批量清理相关缓存,比逐个删 key 更高效、更不易遗漏。注意:标签功能仅 Redis 和 Memcached 支持,file 或 database 驱动不可用。











