gpt4 book ai didi

c# - CacheManager - 每 x 分钟或到期时刷新缓存

转载 作者:行者123 更新时间:2023-11-30 15:56:00 24 4
gpt4 key购买 nike

使用 CacheManager ,您如何最好地实现这种情况,其中缓存实例包含可能需要很长时间才能从慢速来源获取的数据?

我从不希望用户等待缓存填充(我不关心第一次加载)

我可以想到两种方法,但不确定它们是否适用于 CacheManager:

“预定”刷新

  • 将缓存实例设置为在 60 分钟后过期
  • 每 15 分钟,安排一些事情来刷新缓存实例

到期时刷新

  • 当缓存实例过期时,触发刷新数据的事件。当数据刷新时(或者刷新失败),缓存实例仍然返回“陈旧”数据。

Cachemanager 在技术上有什么可能,哪种方法效果最好 - 如果有的话?

最佳答案

关于您的第二个选项“到期时刷新”,这不起作用,因为如果项目过期,CacheManager 不会返回缓存的值。而且,当你“刷新”缓存时,你最终会从其他调用者那里得到很多缓存未命中。

我的建议:

如果您只有少量的键被缓存 60 分钟并且它们都“工作相同”,只需启动一个后台任务,该任务与您的进程异步运行并每 15 分钟刷新一次缓存。

如果您有许多 key ,这些 key 在过期方面可能会有很大差异,您可以缓存 60 分钟过期的数据,并存储一个 15 分钟过期的辅助 key (没有实际值的假 key )。然后,如果假 key 过期,刷新实际的键/值...作为假 key 的key,例如使用前缀+实际 key ,然后监听OnRemove事件。

快速示例程序

internal class Program
{
private static ICacheManager<object> _cache;

private static void Main(string[] args)
{
_cache = CacheFactory.Build(c => c.WithDictionaryHandle());

_cache.OnRemoveByHandle += Cache_OnRemoveByHandle;

for (var i = 0; i < 10; i++)
{
_cache.Add("key" + i, "data" + i);
AddFakeKey("key" + i);
Thread.Sleep(1000);
}

Console.ReadKey();
}

private static void AddFakeKey(string forKey)
{
_cache.Add(new CacheItem<object>("trigger_" + forKey, "n/a", ExpirationMode.Absolute, TimeSpan.FromSeconds(1)));
}

private static void Cache_OnRemoveByHandle(object sender, CacheItemRemovedEventArgs e)
{
// Remark: you might get this event triggered for each level of the cache e.Level can be checked to react only on the lowest level...

Console.WriteLine("OnRemoveByHandle " + e.ToString());
if (e.Key.StartsWith("trigger_") && e.Reason == CacheItemRemovedReason.Expired)
{
var key = e.Key.Substring(8);
Console.WriteLine("Updating key " + key);

// updating the key
_cache.Update(key, _ => "new value");

// add a new fake key for another round
AddFakeKey(key);
}
}
}

如果启用了键空间通知,这甚至可以与 Redis 一起使用。

关于c# - CacheManager - 每 x 分钟或到期时刷新缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47606385/

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