gpt4 book ai didi

c# - 使用 MemoryCache 而不是 ConccurentDictionary 的常见模式是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 15:28:23 26 4
gpt4 key购买 nike

我的代码通过等待已运行操作的结果来处理并发请求。数据请求可能会同时使用相同/不同的凭据(包括空凭据)。

对于每组唯一的凭据,最多可以进行一个 GetDataInternal 调用,该调用的结果会在准备就绪时返回给所有排队的服务员

private static readonly Credentials EmptyCredentials = 
new Credentials
{
SqlCredentials = null,
ExchangeCredentials = null
}; // added it to avoid ArgumentNullException inside GetOrAdd if Credentials == null

private readonly ConcurrentDictionary<Credentials, Lazy<Data>> Cache =
new ConcurrentDictionary<Credentials, Lazy<Data>>();

public Data GetData(Credentials credential)
{
Lazy<Data> data = new Lazy<Data>(() => GetDataInternal(credential));
Lazy<Data> lazyData = Cache.GetOrAdd(credential ?? EmptyCredentials, data);

bool isAdded = ReferenceEquals(data, lazyData);

try
{
return lazyData.Value;
}
finally
{
if (isAdded)
{
Cache.TryRemove(credential ?? EmptyCredentials, out lazyData);
}
}
}

我添加了 finally block ,因为我需要更新我的字典(保持最新)。只允许创建缓存值的线程删除它,以防止竞争。

但我想停止使用 ConccurentDictionaryfinally block ,而是我想使用 MemoryCacheMemoryCache 具有逐出策略,因此它可以丢弃不再需要的条目或您不再有足够内存的条目。这正是我所需要的。

我怎样才能改变下面这行

Lazy<Data> lazyData = Cache.GetOrAdd(credential ?? EmptyCredentials, data);

通过使用 MemoryCache?

Lazy<Data> lazyData = (Lazy<Data>)MemoryCache.Default.AddOrGetExisting(..., data, 
new CacheItemPolicy());

那么,我怎样才能得到我的键值呢?

最佳答案

看下面的解决方案,但我不确定是否正确

public Data GetData(Credentials credential)
{
var data = new Lazy<Data>(() => GetCurrentInternal(credential));
var lazydata = (Lazy<Data>)MemoryCache.Default.AddOrGetExisting(
(credential ?? EmptyMetadataCredentials).ToString(),
data,
DateTime.Now.AddMinutes(5));

return (lazydata ?? data).Value;
}

关于c# - 使用 MemoryCache 而不是 ConccurentDictionary 的常见模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34463193/

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