簡體   English   中英

Laravel 緩存獲取所有帶標簽的項目

[英]Laravel cache get all items with tag

在 Laravel 中,您可以使用如下標簽將項目放入緩存中:

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

但我似乎無法找到一種方法來獲取帶有特定標簽的所有項目。 是否可以檢索具有特定標簽的所有項目?

喜歡:

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

或類似的東西

我覺得你錯了。 作為第一個參數,您傳遞緩存鍵,作為第二個值,第三個參數以分鍾為單位到期。

如果你想緩存一些有理由的禁令,例如假設你在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循環訪問項目。

'yourKeyGoesHere'中,您可以插入一個與*相同的字符串,或者直接插入精確的鍵。

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

不支持底層緩存驅動器檢索某個標記的所有緩存。

如果你真的需要這種功能,你應該使用Redis的哈希而不是Cache的標簽來尋找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'));

調試輸出將是:

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

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM