Laravel 缓存标签的使用指南
缓存标签是 Laravel 提供的一个强大功能,允许对缓存项进行逻辑分组,方便批量管理。

基本使用条件
缓存标签需要特定驱动支持:
- ✅ Redis
- ✅ Memcached
- ❌ File(不支持)
- ❌ Database(不支持)
基础用法
存储带标签的缓存
use Illuminate\Support\Facades\Cache;
// 存储单个值
Cache::tags(['people', 'artists'])->put('John', 'Doe', 3600);
// 存储数组
Cache::tags(['products', 'electronics'])->put('laptop', [
'name' => 'MacBook Pro',
'price' => 12999
], 3600);
// 使用 remember 方法
$user = Cache::tags(['users', 'active'])
->remember('user.'.$id, 3600, function () use ($id) {
return User::find($id);
});
获取带标签的缓存
// 获取特定缓存
$value = Cache::tags(['people', 'artists'])->get('John');
// 带默认值
$value = Cache::tags(['people'])->get('Unknown', 'Default Value');
清除带标签的缓存
// 清除单个标签的所有缓存 Cache::tags(['people'])->flush(); // 清除多个标签的缓存(使用任意一个标签都会清除) Cache::tags(['people', 'artists'])->flush();
实用示例
用户相关缓存管理
class UserService
{
public function getUserData($userId)
{
return Cache::tags(['users', 'user.'.$userId])
->remember('profile', 3600, function () use ($userId) {
return User::with('posts', 'comments')
->findOrFail($userId);
});
}
public function clearUserCache($userId)
{
// 清除特定用户的所有缓存
Cache::tags(['user.'.$userId])->flush();
}
public function clearAllUserCache()
{
// 清除所有用户相关缓存
Cache::tags(['users'])->flush();
}
}
文章标签系统
class ArticleCacheManager
{
private $tags = ['articles'];
public function getArticle($id)
{
return Cache::tags(array_merge($this->tags, ['article.'.$id]))
->remember("article.{$id}.detail", 3600, function () use ($id) {
return Article::with('tags', 'comments')->findOrFail($id);
});
}
public function getArticleList()
{
return Cache::tags($this->tags)
->remember('articles.list', 1800, function () {
return Article::latest()->paginate(20);
});
}
public function clearArticle($id)
{
// 清除特定文章相关的所有缓存
Cache::tags(['article.'.$id])->flush();
}
public function clearAll()
{
// 清除所有文章缓存
Cache::tags($this->tags)->flush();
}
}
高级用法
多层标签组合
// 复杂的标签组合
Cache::tags([
'v2', // API版本
'user.'.$userId, // 用户特定
'permissions' // 权限相关
])->remember('user.permissions', 3600, function () use ($userId) {
return $this->getUserPermissions($userId);
});
批量操作
// 同时存储多个缓存项
Cache::tags(['settings'])->putMultiple([
'site.name' => 'My Site',
'site.url' => 'https://example.com',
'site.description' => 'A Laravel site'
], 86400);
// 获取多个缓存项
$settings = Cache::tags(['settings'])->getMultiple([
'site.name',
'site.url',
'site.description'
]);
最佳实践
统一的标签管理
class CacheTags
{
const USERS = 'users';
const PRODUCTS = 'products';
const ORDERS = 'orders';
public static function user($id)
{
return [self::USERS, "user.{$id}"];
}
public static function product($id)
{
return [self::PRODUCTS, "product.{$id}"];
}
}
// 使用
Cache::tags(CacheTags::user(1))->put('profile', $data, 3600);
清理策略
class CacheCleanupService
{
// 更新用户时清理相关缓存
public function userUpdated(User $user)
{
Cache::tags(['user.'.$user->id])->flush();
}
// 批量更新时清理
public function bulkUpdate(array $userIds)
{
foreach ($userIds as $id) {
Cache::tags(['user.'.$id])->flush();
}
}
}
注意事项
- 性能考虑:大规模使用标签可能会影响 Redis/Memcached 性能
- 标签命名:使用一致的命名规范,避免冲突
- 不要过度使用:只在需要批量清除的场景使用标签
- 标签数量:单个缓存项的标签数量不宜过多
缓存标签适用于:
- 用户模块(清除某个用户的所有缓存)
- 文章/商品系统(更新时清除相关缓存)
- API版本管理(切换版本时清除缓存)
- 多租户应用(清除特定租户缓存)
合理使用缓存标签可以大大提高缓存管理效率,特别是在需要批量清除关联缓存时非常有用。