Laravel中如何为特定全局缓存键禁用应用缓存前缀?
解决Laravel微服务中全局缓存键取消前缀的问题
方案一:新增专门的全局缓存Store
这是最符合Laravel设计规范的方式,通过配置一个不带前缀的缓存Store,专门处理跨服务共享的全局缓存项。
- 修改
config/cache.php,新增一个名为global的Store配置:
'global' => [ 'driver' => env('CACHE_DRIVER', 'redis'), // 和主缓存保持相同驱动(比如Redis) 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), // 复用主缓存的连接配置 'prefix' => '', // 关键:设置为空字符串,取消自动前缀 ],
- 使用时指定该Store进行缓存操作:
// 生成的缓存键就是纯字符串:campaigns:global:discovery:en Cache::store('global')->remember('campaigns:global:discovery:en', 3600, fn() => 'TEST');
优势:边界清晰,全局缓存和普通缓存完全分离,不会影响其他业务的缓存操作;支持Laravel缓存的所有方法(remember、put、forget等)。
方案二:封装全局缓存工具类
如果不想新增Store,可以直接封装一个工具类,绕过Laravel的前缀处理逻辑,直接调用缓存驱动的底层方法。
- 创建
app/Helpers/GlobalCache.php工具类:
namespace App\Helpers; use Illuminate\Support\Facades\Cache; class GlobalCache { /** * 全局缓存的remember方法 */ public static function remember(string $key, int|\DateTimeInterface $ttl, callable $callback) { return Cache::getStore()->remember($key, $ttl, $callback); } /** * 获取全局缓存 */ public static function get(string $key, mixed $default = null) { return Cache::getStore()->get($key, $default); } /** * 设置全局缓存 */ public static function put(string $key, mixed $value, int|\DateTimeInterface $ttl) { return Cache::getStore()->put($key, $value, $ttl); } /** * 删除全局缓存 */ public static function forget(string $key) { return Cache::getStore()->forget($key); } }
- 使用时直接调用工具类:
GlobalCache::remember('campaigns:global:discovery:en', 3600, fn() => 'TEST');
优势:调用方式接近原生Cache门面,无需切换Store;适合只需要少数缓存方法的场景。
注意事项
- 不要修改默认缓存Store的
prefix配置,否则会导致所有缓存项都失去前缀,破坏微服务各自的缓存隔离性。 - 如果使用Redis作为缓存驱动,确保全局缓存Store和各微服务的主缓存使用同一个Redis实例/数据库,才能实现跨服务共享。
内容的提问来源于stack exchange,提问作者Peter Fox
相关产品推荐
相关产品推荐

