簡體   English   中英

C#ServiceStack.Redis SetAll與到期

[英]C# ServiceStack.Redis SetAll with expire

首先,指向庫的鏈接: ServiceStack.Redis

現在,我正在研究一些通用的緩存機制,該機制目前支持4種方法:

放置,獲取,放置很多,獲取很多

問題是,每當我要插入大量記錄時,我都沒有選項(對我可見)添加到期日,這與Put一樣-我可以。

該代碼非常靈活:

public void PutMany(ICollection<T> items)
{
    TimeSpan expiration = GetExpiration();
    DateTime expire = DateTime.UtcNow.Add(expiration);

    Dictionary<string, CachedItem<T>> dict = new Dictionary<string, CachedItem<T>>();
    foreach (T item in items)
    {
        CachedItem<T> cacheItem = new CachedItem<T>(item, expire);

        if (!dict.ContainsKey(cacheItem.Id))
            dict.Add(cacheItem.Id, cacheItem);
    }

    // Store item in cache
    _client.SetAll(dict);
}

模型CachedItem<T>是我的,只需將其想象為某種對象即可。

如您所見,我沒有設置到期時間的選項。 有沒有辦法(除了使用_client.Set()插入它們)來實現這一點?

TIA。

PS

我知道我可以將所有記錄存儲在列表或哈希中,我不希望所有記錄都具有單個到期日期(錯誤,並且一旦到期就會引起非常嚴重的性能問題)

Redis沒有任何命令可以讓您使用批量插入設置到期時間,它的任何Expire命令都不允許您將到期時間應用於多個鍵。

為了避免N + 1操作,您需要在Redis事務管道 中將多個SET命令排隊 ,分別設置每個條目的有效期,例如:

using (var trans = Redis.CreateTransaction())
{
    foreach (var entry in dict) 
    {
        trans.QueueCommand(r => r.SetValue(entry.Key, entry.Value, expireIn));
    }

    trans.Commit();
}

ServiceStack.Redis仍將在批量Redis事務中發送多個SET操作。

暫無
暫無

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

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