首页 / 缓存 / c# – 具有LRU策略的默认内存缓存
c# – 具有LRU策略的默认内存缓存
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 具有LRU策略的默认内存缓存,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2123字,纯文字阅读大概需要4分钟。
内容图文
![c# – 具有LRU策略的默认内存缓存](/upload/InfoBanner/zyjiaocheng/966/49a2698d72de489daffa3683b38ec127.jpg)
我试图在我的应用程序中实现一些缓存,我想在C#中使用默认的内存缓存(如果这不起作用,可以更改此要求).我的问题是,不想超过我在机器上的最大物理内存量,但据我所知,我无法将这样的约束添加到默认内存缓存.
一般来说,政策是:
>如果对象已在缓存中10分钟而没有请求,则将其删除
>如果将新对象添加到缓存并且最大可用物理内存量接近使用,则基于LRU删除元素
我的缓存可以包含许多不同的对象,它们的范围从10mb到2-3gb,所以我无法真正得到修剪功能.
有没有关于如何实现监控ram使用的LRU缓存的建议?并且可以使用.net中的缓存来完成它.
编辑
我添加了一个简单的例子,其中MemoryCache限制为100Mb和20%的物理内存,但这并没有改变任何东西.我的内存充满了删除缓存条目.请注意,轮询间隔更改为等待5秒.
class Item
{
private List<Guid> data;
public Item(int capacity)
{
this.data = new List<Guid>(capacity);
for (var i = 0; i < capacity; i++)
data.Add(Guid.NewGuid());
}
}
class Program
{
static void Main(string[] args)
{
var cache = new MemoryCache(
"MyCache",
new NameValueCollection
{
{ "CacheMemoryLimitMegabytes", "100" },
{ "PhysicalMemoryLimitPercentage", "20" },
{ "PollingInterval", "00:00:05" }
});
for (var i = 0; i < 10000; i++)
{
var key = String.Format("key{0}", i);
Console.WriteLine("Add item: {0}", key);
cache.Set(key, new Item(1000000), new CacheItemPolicy() { UpdateCallback = UpdateHandler } );
}
Console.WriteLine("\nDone");
Console.ReadKey();
}
public static void UpdateHandler(CacheEntryUpdateArguments args)
{
Console.WriteLine("Remove: {0}, Reason: {1}", args.Key, args.RemovedReason.ToString());
}
}
解决方法:
看起来System.Runtime.Caching.MemoryCache课程很适合这个法案.您可以基于每个项目设置缓存策略,因此,如果您使用TimeSpan为10min的SlidingExpiration缓存策略添加项目,则应该获得您正在寻找的行为.
这只是一个.Net v4类,因此它在早期的运行时版本中不存在.如果您在Web上下文中,ASP.Net缓存的行为类似,但可能不会让您管理系统信息.
您可以在创建缓存大小时设置限制,以使其不超过某个内存占用:
var myCache = new MemoryCache(
"MyCache",
new NameValueCollection { { "PhysicalMemoryLimit", "50" }} // set max mem pct
);
这应该可以防止任何分页到磁盘,至少在您的应用程序中.如果存在外部内存压力或者系统过于积极地将内存分页到磁盘,则您的缓存仍可能被分页,但不是由于您的应用程序中的过度使用.据我所知,没有办法在C#中保留内存页面.
内容总结
以上是互联网集市为您收集整理的c# – 具有LRU策略的默认内存缓存全部内容,希望文章能够帮你解决c# – 具有LRU策略的默认内存缓存所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。