laravel 中的 Cache::tags()->put();缓存的键名问题

2019-11-06 15:00:49 +08:00
 liguoshu

$cacheName = self::CACHE_ACTIVITY.'_'.$bannerId .$size . $page; //键名 CACHE_ACTIVITY_131201

   if (Cache::tags([self::CACHE_ACTIVITY])->has($cacheName))  
        return Cache::tags([self::CACHE_ACTIVITY])->get($cacheName);  //这里是获取
        
Cache::tags([self::CACHE_ACTIVITY])->put($cacheName,$res,config('biz.cache_activity_detail'));//不存在时存数据

使用 tags 时(不使用 tags 没有这种情况),除了前缀还莫名的拼接了中间一段字符串 存储后的键名为:bosigou_cache:d06a81fc3f9472465c38fd83d93c33b071c084bf:CACHE_ACTIVITY_131201 而我需要的是:bosigou_cache:CACHE_ACTIVITY_131201 这种,想问一下各位大佬,为啥会增加中间这一段字符串

4203 次点击
所在节点    PHP
4 条回复
javalaw2010
2019-11-06 16:21:59 +08:00
没看源码,无责任猜测一下,中间那段 hash 应该是 tag 的 hash,如果框架要按照 tag 做什么操作,比如清空该 tag 下的所有 cahce,可以直接以 bosigou_cache:{$hash}:*的方式直接清空
javalaw2010
2019-11-06 16:53:25 +08:00
刚刚跑去看了下源码,在 RedisTaggedCache 里面 pushKeys 方法可以看到这部分的实现:
```php
protected function pushKeys($namespace, $key, $reference)
{
$fullKey = $this->store->getPrefix().sha1($namespace).':'.$key;

foreach (explode('|', $namespace) as $segment) {
$this->store->connection()->sadd($this->referenceKey($segment, $reference), $fullKey);
}
}
```
框架会为每个 tag 分配一个 tagId,然后多个 tag 的 ID 以“|”字符 implode 成 namespace,生成 namespace 的方法注释是:
Get a unique namespace that changes when any of the tags are flushed.所以这么做的理由应该跟上面猜测的一致
liguoshu
2019-11-06 22:42:00 +08:00
@javalaw2010 我也看了底层,我的想法是在同一台服务器的不同框架里,去删除这个键。感觉是很麻烦。现在直接调用 API 清除。😂
liguoshu
2019-11-06 22:42:13 +08:00
@javalaw2010 谢谢老哥

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/616864

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX