簡體   English   中英

訂閱Redis在C#驅動程序中過期事件?

[英]Subscribing to Redis expire events in c# driver?

如果您向實體添加過期,則要添加到Redis中,例如在ServiceStack.Redis中:

redisClient.Set(elementKey, "some cached value", DateTime.Now.AddMinutes(2));

然后如何訂閱元素的到期。 理想的結果將是:

redisClient.Subscribe(elementKey, "expire", DoSomethingBasedOnKey)

實際上,您可以訂閱過期的密鑰事件,但是就像Matias所說的那樣,Redis可能需要一段時間才能發布事件。

Redis有Keyspace通知,您可以在此處閱讀有關它的信息

密鑰空間通知允許客戶端訂閱發布/訂閱通道,以便接收以某種方式影響Redis數據集的事件。

事件類型

實施鍵空間通知的目的是為影響Redis數據空間的每個操作發送兩種不同類型的事件。 例如,針對數據庫0中名為mykey的鍵的DEL操作將觸發兩條消息的傳遞,這完全等同於以下兩個PUBLISH命令:

發布keyspace @ 0 :mykey del
發布keyevent @ 0 :del mykey

因此,您需要訂閱將在keyevent的過期命令上發布消息的頻道(也可以在到達ttl時使用),其前綴將如下所示:“ keyevent @ 0 :expired”

定時精度對我而言並不重要,因此我已經像使用ServiceStack C#Redis客戶端那樣實現了:

string EXPIRED_KEYS_CHANNEL = "__keyevent@0__:expired";    
using (IRedisClient client = redisClient.GetClient())
{
    using (var cacheSubscription = client.CreateSubscription())
    {
        cacheSubscription.OnMessage += (ch, expiredKey) =>
        {                            
            FireOnKeyExpired(expiredKey);
        };
        cacheSubscription.SubscribeToChannels(EXPIRED_KEYS_CHANNEL);
    }
}

更新:

確保將redis.conf配置為允許過期密鑰上的密鑰事件:

notify-keyspace-events Ex

或這樣運行(重新啟動實例時配置可能會丟失)

配置設置notify-keyspace-events Ex

也許您不知道當密鑰過期時 ,過期消息不會被完全發布

過期事件的時間

Redis通過兩種方式使具有生存時間的密鑰失效:

  • 當命令訪問密鑰並且發現密鑰已過期時。
  • 通過后台系統,該系統逐步在后台查找過期的密鑰,以便能夠收集從未訪問過的密鑰。

我建議您最好的選擇是使用諸如內置Windows Task Scheduler或Quartz.NET之類的任務計划程序來計划任務,以在密鑰必須過期時將消息發布到某個自定義Redis PubSub通道。

暫無
暫無

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

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