按模式/通配符删除缓存键

j34*_*491 16 laravel lumen

我正在使用Lumen构建REST API,并希望使用Redis缓存一些路由.例如我使用的route/users/123/items:

$items = Cache::remember('users:123:items', 60, function () {
  // Get data from database and return
});
Run Code Online (Sandbox Code Playgroud)

当对用户的项目进行更改时,我清除缓存:

Cache::forget('users:123:items');
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是,我还需要清除我为routes/users/123和/ users/123/categories实现的缓存,因为那些包括项目列表.这意味着我还必须运行:

Cache::forget('users:123');
Cache::forget('users:123:categories');
Run Code Online (Sandbox Code Playgroud)

在将来,可能会有更多的缓存需要清除,这就是我正在寻找模式/通配符的原因,例如:

Cache::forget('users:123*');
Run Code Online (Sandbox Code Playgroud)

有没有办法在Lumen/Laravel中容纳这种行为?

Ale*_*nin 10

您可以使用缓存标记.

缓存标记允许您标记缓存中的相关项,然后刷新已分配给定标记的所有缓存值.您可以通过传入有序的标记名称数组来访问标记的缓存.例如,让我们访问标记的缓存并将值放入缓存中:

Cache::tags(['people', 'artists'])->put('John', $john, $minutes);
Run Code Online (Sandbox Code Playgroud)

您可以刷新分配了标签或标签列表的所有项目.例如,此语句将删除标记为人员,作者或两者的所有缓存.所以,Anne和John都将从缓存中删除:

Cache::tags(['people', 'authors'])->flush();
Run Code Online (Sandbox Code Playgroud)

  • 使用'file'或'database'驱动时不支持:( (19认同)
  • 在每个键值存储中,标签都是令人头疼的事情。无论您使用什么驱动程序。在大多数系统中,请求的通配符解决方案可能会更快。 (4认同)
  • Vapor 上的 DynamoDB 也不支持此功能。 (2认同)