php Laravel缓存获取所有带有标签的物品

zbsbpyhn  于 2023-01-12  发布在  PHP
关注(0)|答案(4)|浏览(174)

在Laravel中,您可以将带有如下标记的项目放入该高速缓存:

Cache::tags('bans')->put($result->ip, $result->reason);

但是我似乎找不到一种方法来获取带有某个标记的所有项目。有没有可能检索带有某个标记的所有项目?
例如:

Cache::tags('bans')->all();

或者类似的东西

h43kikqp

h43kikqp1#

不支持底层缓存驱动器检索特定标记的所有缓存。
如果你真的需要这种特性,你应该寻找Redis,使用Redis的哈希而不是Cache的标签。
下面是一些示例代码:

// 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'));

调试输出将为:

array:2 [▼
  "ip1" => "spam: test reason"
  "ip2" => "spam: test reason 2"
]
jobtbby3

jobtbby32#

我认为你用错了。作为第一个参数,你传递了缓存的密钥,作为第二个参数,作为第三个参数,以分钟为单位的过期时间。
如果你想缓存一些有理由的禁令,例如假设你在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 />";
}

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

tvokkenx

tvokkenx3#

'yourKeyGoesHere' 中,您可以插入一个字符串,该字符串与带有 * 的like相同,或者直接插入确切的键。

$redis = Cache::getRedis();
$a_keys = $redis->keys("*yourKeyGoesHere*");
ha5z0ras

ha5z0ras4#

Laravel将所有带标签的物品存储在一个Redis Set中。

Cache::tags('bans')->put($result->ip, $result->reason);

Laravel创建tags:bans:key-它本身只存储Set的一个键,其中包含所有标记的项目

$setKey = Cache::get('tags:bans:key'); // => 63bd57cbdb77d819804950 – key to the Set that contains all tagged items

现在我们可以使用该键获取所有项目:

// get all set members
$keys = Cache::connection()->smembers("prefix:$setKey:forever_ref");

$items = [];
foreach($keys as $key) {
  $key = collect(explode(':', $key))->last(); // remove prefixes from key
  $items[] = Cache::tags('bans')->get($key);
}

相关问题