2015-10-26 83 views
3

我在Redis尋找簡單的方法來存儲高速緩存,並與tags標記緩存塊,所以,當我需要,我可以很容易地刪除所有標有特殊標記的緩存。PHP/Redis上的緩存標記是否有很好的解決方案?

有沒有一個很好的使用解決方案呢? (我要使用訪問的Redis與PHP)

我會做我自己,因爲我知道我需要標籤存儲爲組,其中值是緩存鍵,使用該標記。我甚至可以在刪除緩存時覆蓋這種情況,並且應該從標記集中刪除它的關鍵字(我可以爲緩存元素存儲標記列表)。但我不確定如何在緩存過期時執行此操作,在這種情況下,其密鑰將「卡住」在標記中,並且下次按標記刪除緩存時 - 它將清除緩存中的密鑰,該密鑰可能不再使用。

所以我正在尋找現成的解決方案,至少看看它是如何完成的。

+0

有與嘗試刪除密鑰進行過期後沒有問題的 - 操作將失敗,但最終的結果是一樣的。您的緩存標記方法是通常實踐的方法。 –

回答

4

您可以照亮\緩存是Laravel的一部分,雖然可以在它自己的使用做到這一點。

爲了配置它,你需要安裝以下作曲家庫:

  • predis/predis
  • 照射/ redis的
  • 照射/緩存

下面是一個例子:

<?php 
require_once __DIR__ . '/vendor/autoload.php'; 

$servers = [ 
    'cluster' => false, 
    'default' => [ 
     'host'  => '127.0.0.1', 
     'port'  => 6379, 
     'database' => 0, 
    ], 
]; 

$redis = new Illuminate\Redis\Database($servers); 
$cache = new Illuminate\Cache\RedisStore($redis); 

$cache->tags('posts', 'author_1')->put('post_1', 'Post 1 by Author 1', 1); 
$cache->tags('posts', 'author_2')->put('post_2', 'Post 2 by Author 2', 1); 
var_dump($cache->tags('posts', 'author_1')->get('post_1')); 
var_dump($cache->tags('posts', 'author_2')->get('post_2')); 
$cache->tags('author_2')->flush(); 
var_dump($cache->tags('posts', 'author_1')->get('post_1')); 
var_dump($cache->tags('posts', 'author_2')->get('post_2')); 

結果將是:

php test.php 
string(18) "Post 1 by Author 1" 
string(18) "Post 2 by Author 2" 
string(18) "Post 1 by Author 1" 
NULL 
+0

這看起來很有趣,謝謝你的提示。會嘗試。你用它嗎?當緩存過期時,它如何處理相關標籤(例如我在問題中描述的) – SmxCde

+0

好吧,我試過了,但我沒有明白。據我所知 - 你設置緩存提供了一個標籤列表,然後你需要提供所有這些標籤來恢復你的緩存數據。它的目的是什麼?我的意思是,爲什麼/我應該如何知道當我需要創建緩存時提供的所有標記? – SmxCde

+0

我如何看待工作流應該工作:創建緩存時我有一個標記列表,如:某些頁面包含來自記錄user_1,user_2,article_10,image_120的數據,因此我使用鍵「page_50」創建緩存並添加所有這些標記。現在,當我需要這個緩存時 - 我只是做$ cache-> get('page_50')。當ID爲「2」的用戶更改他的用戶名時,我只需調用$ cache-> flushByTag('user_2')並刪除所有相關的緩存(包括「page_50」)。 – SmxCde

0

我會做我自己,因爲我知道我需要標籤存儲爲組,其中值是緩存鍵,使用該標記。

如果您不會限制Redis的內存使用量(通常對於緩存可用內存硬限制),這將起作用。因爲如果Redis將刪除包含密鑰的集合,並保留這些密鑰,您將無法通過標記刪除它們。

解決方案:

  • 確保有足夠的內存緩存
  • 放套不同的Redis實例,它不具有有限的存儲器
  • 放套完全不同的地方(如DB)
  • 不要」使用taging,使用Redis的哈希http://redis.io/commands/hset創建命名空間(您可以通過一個‘標籤’組鑰匙)。
相關問題