Laravel缓存获取带有标签的所有项目

Mat*_*ijn 5 php memcached caching laravel

在Laravel中,您可以使用以下标记将项目放置在缓存中:

Cache::tags('bans')->put($result->ip, $result->reason);
Run Code Online (Sandbox Code Playgroud)

但是我似乎找不到找到带有特定标签的所有物品的方法。是否可以检索带有特定标签的所有项目?

喜欢:

Cache::tags('bans')->all(); 
Run Code Online (Sandbox Code Playgroud)

或类似的东西

Cha*_*ade 8

不支持底层缓存驱动器检索某个标签的所有缓存。

如果你真的需要这种功能,你应该寻找Redis,使用Redis 的哈希而不是缓存的标签。

下面是一些示例代码:

// Delete hash table - `bans`
Redis::del('bans');
// Setting hash table filed
Redis::hSet('bans', 'ip1', 'spam: test reason');
Redis::hSet('bans', 'ip2', 'spam: test reason 2');
// Get all filed form hash table - `bans`
dd(Redis::hGetAll('bans'));
Run Code Online (Sandbox Code Playgroud)

调试输出将是:

array:2 [?
  "ip1" => "spam: test reason"
  "ip2" => "spam: test reason 2"
]
Run Code Online (Sandbox Code Playgroud)


Mar*_*łek 4

我觉得你用错了。作为第一个参数,您传递缓存的密钥,作为第二个值和第三个过期时间(以分钟为单位)。

如果你想合理地缓存一些禁令,例如假设你在 PHP 中有一些发送垃圾邮件的用户,你可以使用类似的东西:

$bans = [
   [
       'ip' => 'test ip',
       'reason' => "spam: test reason",
   ],
   [
       'ip' => 'test ip2 ',
       'reason' => "spam: test reason 2",
   ]

];

Cache::tags('bans')->put('spam', $bans, 100);

$spams = Cache::tags('bans')->get('spam');
foreach ($spams as $spam) {
    echo $spam['ip'].' '.$spam['reason']."<br />";
}
Run Code Online (Sandbox Code Playgroud)

因此,在这里您将整个数组放入缓存中,现在您可以使用标准foreach循环访问项目。

  • 有没有办法做类似“Cache::tags([$tag])-&gt;all();”的事情?我有一个非常具体的用例,我需要能够从缓存中检索具有特定标签的每个项目。 (23认同)
  • 我想做和提问者一样的事情。但我从未找到有关如何检索特定标签的所有缓存的文档。这是否意味着标签仅对一次“删除”多个缓存有帮助?在上面的例子中,标签看起来毫无用处。`$spams = Cache::tags('bans')-&gt;get('spam');` 与 `$spams = Cache::get('spam');` 有何不同? (5认同)