我正在尝试在我的应用程序中实现一些缓存,我想在C#中使用默认的内存缓存(如果此要求不起作用,则可以更改此要求)。我的问题是不想超过计算机上的最大物理内存量,但是据我了解,我无法将这样的约束添加到默认内存缓存中。
通常,该策略是:
我的缓存可以包含许多不同的对象,它们的范围从10mb到2-3gb,因此我无法真正使用该trim功能。
关于如何实现监视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}", …Run Code Online (Sandbox Code Playgroud) 我有一个关于std :: set容器的简短问题.现在我正在使用pushback功能来提供我的设置.对于每个push_back,该集合变得越来越大.我只对最新的30个元素感兴趣......可以删除旧元素.所以我的想法是将集合的大小限制为30个元素左右,并通过这样做摆脱不需要的旧元素.但是,默认情况下,该集不支持限制.我可以偶尔检查一下这个集的大小,然后手动删除多余的元素.有更聪明的方法吗?
关心Lumpi
(首先,我的英文不是很好,拜托了)
众所周知,memcached 提供延迟到期,并“替换”其slab 中的LRU 数据,但是我不太清楚它是如何做到这一点的。例如,如果一个slab已经满了,但是这个slab中的一些数据已经过期了,那么当数据被添加到slab时会发生什么?
据我所知,延迟过期是这样的,memcached 不会主动从每个平板中删除过期数据,而是仅在引用过期条目的键时删除过期条目。这是一种资源浪费,不是吗?
我的数据包含以下三个组件:
a_patha_keya_value =f(a_path, a_key)a_value计算起来很昂贵,所以我想不经常计算它.在一个理想的世界中,只有当它发生变化时才会这样.所以,我对这个缓存的要求如下:
(a_path, a_key)expiry_func(a_path, a_key)我的谷歌搜索在这里失败了; 即使在搜索"elisp LRU缓存"时,我也发现了很多Java站点.
问题1
我正在为服务器构建/搜索RAM内存缓存层。它是一个简单的LRU缓存,需要处理并发请求(均获取一个Set)。
我发现https://github.com/pmylund/go-cache声称是线程安全的。
就获取存储的接口而言,这是正确的。但是,如果多个goroutines请求相同的数据,它们都将检索指向同一块内存的指针(存储在接口中)。如果有任何goroutine更改了数据,那么这将不再是非常安全的。
是否有任何可以解决此问题的缓存程序包?
问题1.1
如果对问题1的回答为否,那么建议的解决方案是什么?
我看到两个选择:
备选方案1
解决方案:使用值将值存储在包装结构中,sync.Mutex以便每个goroutine在读取/写入数据之前都需要锁定数据。
type cacheElement struct { value interface{}, lock sync.Mutex }
缺点:缓存不知道对数据所做的更改,甚至可能已将其从缓存中删除。一个goroutine可能还会锁定其他goroutine。
备选方案2
解决方案:制作数据的副本(假设数据本身不包含指针)
缺点:每次执行缓存Get时的内存分配都会进行更多的垃圾回收。
对不起,这个问题很复杂。但是您不必全部回答。如果您对问题1有一个好的答案,那对我来说就足够了!
错误看起来像这样
Exception in thread "Thread-1" java.lang.NullPointerException
at java.util.LinkedHashMap$Entry.remove(LinkedHashMap.java:332)
at java.util.LinkedHashMap$Entry.recordAccess(LinkedHashMap.java:356)
at java.util.LinkedHashMap.get(LinkedHashMap.java:304)
at Server.getLastFinishedCommands(Server.java:9086)
at Server.processPacket(Server.java:484)
at PacketWorker.run(PacketWorker.java:34)
at java.lang.Thread.run(Thread.java:744)
Run Code Online (Sandbox Code Playgroud)
里面getLastFinishedCommands我用
public List<CCommand> getLastFinishedCommands(UserProfile player) {
List<CCommand> returnList = new ArrayList<CCommand>();
if(!finishedCommands.containsKey(player.myWebsitecmd-1)) {
getSavedState(player);
return null;
}
try { //<-- added this try/catch so it doesn't happen again.
//Get commands.
CCommand cmd;
long i;
long startIndex = player.myWebsitecmd;
long endIndex = startIndex+LIMIT_COMMANDS;
for(i = startIndex; i <= endIndex; i++) {
cmd = finishedCommands.get(i); //<-- this is line 9086 …Run Code Online (Sandbox Code Playgroud) OrderedDict在Python中如何记住元素的所有顺序?性能开销是多少?对于诸如实现之类的问题LRU,我发现它确实非常强大且易于实现,但是这里的性能提升是多少?如何记住最初插入的键的顺序?
它是否使用Dict()和Double Linked List来记住下图所示的键?如果您能用一种简单的语言传达信息而不是分享某种研究论文,我将不胜感激。
文档是这样说的:
如果 maxsize 设置为 None,则禁用 LRU 功能,缓存可以无限制地增长。当 maxsize 是 2 的幂时,LRU 功能表现最佳。
有人会碰巧知道这个“二的幂”从何而来?我猜它必须对实现做些什么。