首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  PHP

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

  •  
  •   liguoshu · 36 天前 · 1443 次点击
    这是一个创建于 36 天前的主题,其中的信息可能已经有所发展或是发生改变。

    $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 这种,想问一下各位大佬,为啥会增加中间这一段字符串

    4 回复  |  直到 2019-11-06 22:42:13 +08:00
        1
    javalaw2010   36 天前
    没看源码,无责任猜测一下,中间那段 hash 应该是 tag 的 hash,如果框架要按照 tag 做什么操作,比如清空该 tag 下的所有 cahce,可以直接以 bosigou_cache:{$hash}:*的方式直接清空
        2
    javalaw2010   36 天前
    刚刚跑去看了下源码,在 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   36 天前 via iPhone
    @javalaw2010 我也看了底层,我的想法是在同一台服务器的不同框架里,去删除这个键。感觉是很麻烦。现在直接调用 API 清除。😂
        4
    liguoshu   36 天前 via iPhone
    @javalaw2010 谢谢老哥
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3963 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 03:52 · PVG 11:52 · LAX 19:52 · JFK 22:52
    ♥ Do have faith in what you're doing.