$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 这种,想问一下各位大佬,为啥会增加中间这一段字符串
1
javalaw2010 2019-11-06 16:21:59 +08:00
没看源码,无责任猜测一下,中间那段 hash 应该是 tag 的 hash,如果框架要按照 tag 做什么操作,比如清空该 tag 下的所有 cahce,可以直接以 bosigou_cache:{$hash}:*的方式直接清空
|
2
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.所以这么做的理由应该跟上面猜测的一致 |
3
liguoshu OP @javalaw2010 我也看了底层,我的想法是在同一台服务器的不同框架里,去删除这个键。感觉是很麻烦。现在直接调用 API 清除。😂
|
4
liguoshu OP @javalaw2010 谢谢老哥
|