gpt4 book ai didi

c# - 如何实现数据大小限制的缓存?

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

我有多个线程请求必须通过网络加载的数据。为了减少网络流量和加快响应速度,我想缓存经常被请求的数据。我还想限制缓存的数据大小。

我的类(class)看起来像这样:

public class DataProvider
{
private ConcurrentDictionary<string, byte[]> dataCache;
private int dataCacheSize;
private int maxDataCacheSize;
private object dataCacheSizeLockObj = new object();

public DataProvider(int maxCacheSize)
{
maxDataCacheSize = maxCacheSize;
dataCache = new ConcurrentDictionary<string,byte[]>();
}

public byte[] GetData(string key)
{
byte[] retVal;

if (dataCache.ContainsKey(key))
{
retVal = dataCache[key];
}
else
{
retVal = ... // get data from somewhere else

if (dataCacheSize + retVal.Length <= maxDataCacheSize)
{
lock (dataCacheSizeLockObj)
{
dataCacheSize += retVal.Length;
}
dataCache[key] = retVal;
}
}
return retVal;
}
}

我的问题是:如何确保 dataCacheSize 始终具有正确的值?如果两个线程同时请求相同的未缓存数据,它们都会将自己的数据写入缓存,这没有问题,因为数据相同,第二个线程只会用相同的数据覆盖缓存数据。但是我怎么知道它是否被覆盖,以避免计算其大小两次?

也可能发生,两个线程同时添加数据导致 dataCache 大小大于允许的...

有没有一种优雅的方式可以在不添加复杂的锁定机制的情况下完成这个任务?

最佳答案

与其尝试“自行拥有”缓存,不如看看 System.Runtime.Caching.MemoryCache。见上面的评论。

关于c# - 如何实现数据大小限制的缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41020821/

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