gpt4 book ai didi

C# ServiceStack.Redis SetAll 过期

转载 作者:IT王子 更新时间:2023-10-29 06:11:01 25 4
gpt4 key购买 nike

首先,链接到图书馆: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。

附言

我知道我可以将所有记录存储在一个列表或一个散列中,我不希望所有记录都有一个单一的到期日期(错误,并且在它们到期时会导致非常严重的性能问题)

最佳答案

Redis 没有任何命令可以让你 set an expiry with a bulk insert它的任何Expire commands也没有允许您将到期时间应用于多个 key 。

要避免 N+1 操作,您需要 queue multiple SET commands in a Redis Transactionpipeline ,分别设置每个条目的到期时间,例如:

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

trans.Commit();
}

ServiceStack.Redis 仍将在 bulk Redis transaction 中发送多个 SET 操作.

关于C# ServiceStack.Redis SetAll 过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43893858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com