【问题标题】:C# ServiceStack.Redis SetAll with expireC# ServiceStack.Redis SetAll 与过期
【发布时间】:2017-05-10 13:25:48
【问题描述】:

首先,图书馆的链接:ServiceStack.Redis

现在,我正在研究一些通用缓存机制,目前支持 4 种方法:

Put、Get、PutMany、GetMany

问题是,每当我想插入大量记录时,我没有选项(对我可见)添加过期时间,不像 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&lt;T&gt; 的模型是我的,把它想象成某种物体。

如您所见,我没有设置过期时间的选项。 有没有办法(除了使用_client.Set() 逐个插入它们)来实现这一点?

TIA。

附言

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

【问题讨论】:

    标签: c# caching redis servicestack servicestack.redis


    【解决方案1】:

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

    为避免 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 操作。

    【讨论】:

    • 只要它的 1 个请求就可以了。
    • @MichaC ServiceStack.Redis 在单个网络写入中批处理所有命令,因此它没有 N+1 请求延迟。 LUA 的开销会更大。
    • @mythz Redis 仍然需要做 n+1,这就是我的意思。当然,网络延迟是一回事,但 Redis 服务器仍然必须运行所有这些命令 ^^。不明白为什么 LUA 会更多开销?这将是一个命令/请求,然后在服务器上运行循环。
    • @MichaC 执行 N+1 个请求的最慢部分是每个请求单独的网络写入/读取的延迟,正如解释的那样,Redis 流水线不会发生这种情况。 LUA 仍然必须在服务器上执行相同的命令,但需要额外的脚本处理开销。
    • @mythz 如果您预加载 LUA 脚本,则没有脚本处理开销。此外,您不必在所有命令周围放置“事务”,因为 LUA 脚本已经以原子方式运行,这可以提高性能。但是,嘿,那只是另一种味道^^
    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2015-01-15
    • 2011-05-15
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多