在 Laravel 6 中,缓存标记的实践与分析

1、现在存储被打上标签的缓存数据,打上了 2 个标签:theme_editor、theme_editor_rjxMAeCRpPuaD4LJlljDOMXb47hRdVTb2vPW

return Cache::tags([
  ThemePreviewInterface::TAG_THEME_EDITOR,
  ThemePreviewInterface::TAG_THEME_EDITOR . '_' . $sessionId]
 )
 ->put(ThemePreviewInterface::THEME_EDITOR_SESSION_PREFIX . $sessionId, json_encode($data), ThemePreviewInterface::TTL);

2、运行程序以后,查看 GUI for Redis 中的数据结构。展开 tag 。cache:tag:theme_editor:key 的值为:s:22:”633146b13433b471207802″;。其表示关联的 key 为:cache:633146b13433b471207802:standard_ref。这是标签:theme_editor 生成的结构。总计为 2 个 key。如图1

图1

3、运行程序以后,查看 GUI for Redis 中的数据结构。展开 tag 。cache:tag:theme_editor_rjxMAeCRpPuaD4LJlljDOMXb47hRdVTb2vPW:key 的值为:s:22:”633146b134d67627586383″;。其表示关联的 key 为:cache:633146b134d67627586383:standard_ref。这是标签:theme_editor_rjxMAeCRpPuaD4LJlljDOMXb47hRdVTb2vPW 生成的结构。总计为 2 个 key。如图2

图2

4、2 个标签所关联的 key 的值列表是相同的,可得到对应的 key :cache:327d4fd2bc91588c8a5e4c7248cf680165a2e12a:theme_editor_session:rjxMAeCRpPuaD4LJlljDOMXb47hRdVTb2vPW 。如图3

图3

5、决定删除 cache:327d4fd2bc91588c8a5e4c7248cf680165a2e12a:theme_editor_session:rjxMAeCRpPuaD4LJlljDOMXb47hRdVTb2vPW 所对应的缓存数据。不使用 tags 方法。操作结果为 false ,表示删除失败。如图4

图4

        $result = Cache::forget($sessionId);

        dd($result);

6、使用 tags 方法。操作结果为 true ,表示删除成功。如图5

图5

        $result = Cache::tags(ThemePreviewInterface::TAG_THEME_EDITOR . '_' . $sessionId)->flush();

        dd($result);

7、查看 Redis 中的数据。cache:633146b13433b471207802:standard_ref 中的关联的 值列表中仍然有 1 条记录,未删除:cache:327d4fd2bc91588c8a5e4c7248cf680165a2e12a:theme_editor_session:rjxMAeCRpPuaD4LJlljDOMXb47hRdVTb2vPW 。键 cache:633146b134d67627586383:standard_ref 已经被删除,之前其中的关联的 值列表中的 1 条记录所对应的 key 也已经被删除。符合预期。如图6

图6

永夜