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