![](/img/trans.png)
[英]Prerequisite to run C# apps that implements ServiceStack.Redis package
[英]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.