2016-03-14 36 views
3

我正在嘗試使用Redis實施標記。這是它的樣子:Redis Keyspace通知 - 用戶數量與爭用數量

mykey (my item) 
mykey:tags (a set with the tags associated to that item) 
tags:tag1 (a set with references to all items tagged with "tag1") 
... 

我打算使用Redis Keyspace Notifications防止過期的鑰匙留在我的標籤永遠集(即使高速緩存中的每個項目都有一個缺省TTL設定,我不知道喜歡保持陳舊的數據)。

這些都是我考慮的選項:

1)在所有的 「過期」 事件。

psubscribe '[email protected]*:expired' 

優點:

  • 只有1訂戶。

缺點:

  • 由於不是所有的項目包括標籤,我會檢查的myKey:標籤 ,如果存在獲得的標籤,並從每個標籤集合中刪除該項目。
  • 該方法的爭用將隨着商店中的密鑰數量 而增加。

2)訂閱所有僅包含標籤的密鑰的事件。

psubscribe '[email protected]*:mykey' 

優點:

  • 訂閱將僅與標籤的項目被創建。

缺點:

  • 必須有開銷每個用戶相關聯。
  • 根據商店中已標記商品的數量 ,訂戶數量可以增長得相當快。

問題:

  1. 哪個選項我應該執行?我應該關注2)上的 訂戶數量還是1)更大的 交易的爭用?我無法找到關於此主題的任何建議。
  2. 最終的遊戲是在Redis集羣上實現這一點。這是否會添加 任何額外的關注實施?

更新1:

這是標註在我們的緩存之上的通用實現。在這一點上,我不確定我們是如何最終使用它的。這更像是我正在開發的PoC。試圖用一些數字來回答一些問題的意見:

  • :我們有幾千萬,每天的獨立訪客。並非所有存儲在緩存中的每個訪問者的項目都有標籤。但是這個不斷變化。
  • 標籤:標籤管理。目前有幾十個標籤。我們正在考慮支持未來的免費文字標籤。
  • 我還沒有測試過這兩種方法。我希望的選項之一是如此糟糕,甚至不是一種選擇:)

更新2:

一些試驗和錯誤後和一些研究,我放棄2)。 Redis客戶端和輸出緩衝區都有一個限制,這使得這個選項不可行。你可以找到更多的信息herehere。 我試過1)它工作得很好。我甚至將按鍵的期限設置爲彼此相隔5ms,並且代碼正確處理它。這可以成爲一種選擇。

另一個選項可以是@ thepirat000建議的選項。我將這個答案標記爲已接受的答案,但我也在他的建議中加入了一點小小的調整:我不想在每個標記操作的標記中進行維護,而是可以隨機確定何時執行此操作。這是一個很好的方法,它不使用pub/sub和密鑰空間通知。

+0

@RyanVincent你是對的。到目前爲止,我所有的都是猜測。希望在我正在考慮的兩個選項之間有一條清晰的路徑。 –

回答

1

通過使用Keyspace通知可能會有太多開銷。

爲什麼不把清理作爲計劃或重複執行的任務,甚至是通過標記檢索密鑰?

我在CachingFramework.Redis上做過類似的工作,在檢索與標記相關的鍵時可以選擇運行清理。此外,標籤集TTL是其包含的密鑰的最大值(TTL)。

+0

使用週期性維護任務是我實際找到的選項[此處](http://stackify.com/implementing-cache-tagging-redis/)。我不喜歡的是,您確實使用KEYS或SCAN循環訪問標籤集並刪除過期的密鑰。 我完全按照您提到的方式爲標記集實現了TTL;但總有一箇舊密鑰過期的可能性,而新密鑰會使該組永久存活。最終,最終會有大量過期的密鑰混合在一起。 –

+0

我想我快速得出結論而沒有真正檢查你的代碼。通過傳遞實際的標籤,您不必在標籤上掃描或鍵入。這可能是我可以使用的可接受的解決方案。儘管如此,我不想在每個操作上都這樣做。感謝您的貢獻,現在將繼續開放。 –