首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有没有IDictionary的LRU实现?

有没有IDictionary的LRU实现?
EN

Stack Overflow用户
提问于 2009-04-15 15:55:56
回答 11查看 31.4K关注 0票数 31

我想实现一个简单的内存中LRU缓存系统,我正在考虑一种基于IDictionary实现的解决方案,它可以处理哈希LRU机制。我来自java,我有过使用LinkedHashMap的经验,它可以很好地满足我的需求:我在任何地方都找不到针对.NET的类似解决方案。

有没有人开发过它,或者有人有过这样的经历?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-04-15 16:07:36

基类库中没有这样做的东西。

在免费的方面,也许像C5的HashedLinkedList这样的东西可以工作。

如果你愿意付费,也许可以看看this C# toolkit.,它包含了一个实现。

票数 9
EN

Stack Overflow用户

发布于 2010-09-15 15:44:44

这是我们为我们自己的网站开发的一个非常简单快速的实现。

我们试图尽可能地改进代码,同时保持它的线程安全。我认为代码非常简单明了,但是如果你需要一些解释或者关于如何使用它的指南,请不要犹豫。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace LRUCache
{
    public class LRUCache<K,V>
    {
        private int capacity;
        private Dictionary<K, LinkedListNode<LRUCacheItem<K, V>>> cacheMap = new Dictionary<K, LinkedListNode<LRUCacheItem<K, V>>>();
        private LinkedList<LRUCacheItem<K, V>> lruList = new LinkedList<LRUCacheItem<K, V>>();

        public LRUCache(int capacity)
        {
            this.capacity = capacity;
        }

        [MethodImpl(MethodImplOptions.Synchronized)]
        public V get(K key)
        {
            LinkedListNode<LRUCacheItem<K, V>> node;
            if (cacheMap.TryGetValue(key, out node))
            {
                V value = node.Value.value;
                lruList.Remove(node);
                lruList.AddLast(node);
                return value;
            }
            return default(V);
        }

        [MethodImpl(MethodImplOptions.Synchronized)]
        public void add(K key, V val)
        {
            if (cacheMap.TryGetValue(key, out var existingNode))
            {
                lruList.Remove(existingNode);
            }
            else if (cacheMap.Count >= capacity)
            {
                RemoveFirst();
            }

            LRUCacheItem<K, V> cacheItem = new LRUCacheItem<K, V>(key, val);
            LinkedListNode<LRUCacheItem<K, V>> node = new LinkedListNode<LRUCacheItem<K, V>>(cacheItem);
            lruList.AddLast(node);
            // cacheMap.Add(key, node); - here's bug if try to add already existing value
            cacheMap[key] = node;
        }

        private void RemoveFirst()
        {
            // Remove from LRUPriority
            LinkedListNode<LRUCacheItem<K,V>> node = lruList.First;
            lruList.RemoveFirst();

            // Remove from cache
            cacheMap.Remove(node.Value.key);
        }
    }

    class LRUCacheItem<K,V>
    {
        public LRUCacheItem(K k, V v)
        {
            key = k;
            value = v;
        }
        public K key;
        public V value;
    }
}
票数 55
EN

Stack Overflow用户

发布于 2011-06-03 16:01:23

在谷歌搜索的时候找到了你的答案,还发现了这个:

http://code.google.com/p/csharp-lru-cache/

csharp-lru-cache:LRU缓存集合类库

这是一个集合类,用作最近最少使用的缓存。它实现了ICollection<T>,但也公开了其他三个成员:

  • Capacity,缓存可以包含的最大项数。一旦集合达到容量,向缓存添加新项将导致最近最少使用的项被丢弃。如果在构造时将容量设置为0,则缓存不会自动丢弃collection.
  • DiscardingOldestItem,中最旧的(即最近最少使用的)项,这是当缓存将要丢弃其最旧的项时引发的事件。这是一个非常简单的实现。虽然它的Add和Remove方法是线程安全的,但它不应该在繁重的多线程环境中使用,因为在这些方法期间整个集合都会被锁定。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/754233

复制
相关文章
LRU算法的实现
LRU算法全称为Least Recently Used,也就是最近最少使用,操作系统的页面置换算法中就有LRU算法,用来将内存中的页换出,下面我们用JAVA代码来实现这样一个算法,其实在JDK中已经有LinkedHashMap集合来实现LRU算法。本文也是使用链表+HashMap来实现。使用链表来实现如下:
用户6055494
2019/10/31
6050
实现LRU算法
计算机的缓存容量有限,如果缓存满了就要删除一些内容给新的内容腾出位置,而删除哪些内容,就有不同的策略,LRU算法是其中一种策略。
Defu Li
2020/09/08
8550
LRU——LinkedListMap的实现原理
LRU是Least Recently Used的缩写,即最近最少使用,当超过容量时,自动删除最近最少使用的项目。
BennuCTech
2022/04/12
2420
LinkedHashMap实现LRU算法
LinkedHashMap是比HashMap多了一个链表的结构。与HashMap相比LinkedHashMap维护的是一个具有双重链表的HashMap,LinkedHashMap支持2中排序一种是插入排序,即插入是什么顺序,读出来的就是什么顺序。一种是使用排序,最近使用的会移至尾部例如
大发明家
2021/12/05
2920
LRU的理解与Java实现
LRU(Least Recently Used)直译为“最近最少使用”。其实很多老外发明的词直译过来对于我们来说并不是特别好理解,甚至有些词并不在国人的思维模式之内,比如快速排序中的Pivot,模拟信号中的Analog 等等。笔者认为最好的理解方式就是看他诞生的原因,看这个概念的出现如何一步一步演变为现在的样子。假如说你自己对某个问题想到了一个解决办法,于是你按照语义给他起了个名字,假如你直接将这个词儿说给别人,不知道这个词儿来历的人大概很难理解。所以为了力求方便理解,下面我们先来看看LRU是什么,主要是为了解决什么问题。
凯哥Java
2022/12/16
4480
js实现 LRU 算法
方式一:map实现 class LRU { constructor(size) { this.size = size; this.cache = new Map(); } get(key) { if (this.cache.has(key)) { const value = this.cache.get(key); this.cache.delete(key); t
蓓蕾心晴
2022/09/24
1.3K0
LRU算法——python实现
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.
py3study
2020/01/06
6760
实现 LRU 缓存算法
LRU 算法全称是最近最少使用算法(Least Recently Use),是一种简单的缓存策略。顾名思义,LRU 算法会选出最近最少使用的数据进行淘汰。
Se7en258
2022/06/24
9730
实现 LRU 缓存算法
LinkedHashMap实现简单的LRU缓存
一般而言,缓存容量有限,不能无限存储所有数据,如果缓存满了,当需要存储新数据时,就需要一定的策略将一些老的数据清理出去,这个策略一般称为替换算法。LRU是一种流行的替换算法,它的全称是Least Recently Used,最近最少使用,它的思路是,最近刚被使用的很快再次被用的可能性最高,而最久没被访问的很快再次被用的可能性最低,所以被优先清理。
java干货
2021/02/19
3570
使用LinkedHashMap实现LRU算法
LRU算法,最近最少使用原则,如果要实现该算法,可以借助LinkedHashMap数据结构,LinkedHashMap继承HashMap,底层使用哈希表和双向链表来保存所有元素,使用LinkedHashMap可以确保元素按照顺序进行存储。
全栈程序员站长
2022/06/29
4060
Redis的LRU缓存淘汰算法实现
LRU,最近最少使用(Least Recently Used,LRU),经典缓存算法。
JavaEdge
2021/12/27
1.3K0
Redis的LRU缓存淘汰算法实现
lru算法和redis的lru
LRU-K中的K代表最近使用的次数,因此LRU可以认为是LRU-1。LRU-K的主要目的是为了解决LRU算法“缓存污染”的问题,其核心思想是将“最近使用过1次”的判断标准扩展为“最近使用过K次”。
earthchen
2020/09/24
4060
LRU实现基于map和双向链表实现
前面我们已经看到了单链表的数据结构:数据域和节点域node。而双向链表则是:数据域和节点域(包含前驱节点和后继节点)。
路行的亚洲
2021/04/09
5680
如何实现LRU缓存淘汰算法
LRU:Least recently used,最近最少使用。缓存算法根据数据最近被访问的情况来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
s_在路上
2018/12/06
6920
redis key的删除策略及LRU的实现
Redis配置项hz定义了serverCron任务的执行周期,默认每次清理时间为25ms,每次清理会依次遍历所有DB,从db随机取出20个key,如果过期就删除,如果其中有5个key过期,那么就继续对这个db进行清理,否则开始清理下一个db。
MickyInvQ
2020/09/27
6280
用functools.lru_cache实现Python的Memoization
用functools.lru_cache实现Python的Memoization 现在你已经看到了如何自己实现一个memoization函数,我会告诉你,你可以使用Python的functools.lru_cache装饰器来获得相同的结果,以增加方便性。 我最喜欢Python的原因之一就是它的语法的简洁和美丽与它的哲学的美丽和简单性并行不悖。Python被称作“内置电池(batteries included)”,这意味着Python捆绑了大量常用的库和模块,这些只需要一个import声明! 我发现funct
企鹅号小编
2018/01/19
9970
单链表实现LRU缓存淘汰算法
LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是如果数据最近被访问过,那么将来被访问的几率也更高,相反如果很长时间未被访问,则它在最近一段时间内也不会被访问。实现方式有很多种,这里先介绍基于数组和单链表的实现方式。
WindCoder
2020/02/10
5440
动手实现一个 LRU cache
LRU 是 LeastRecentlyUsed 的简写,字面意思则是 最近最少使用。
crossoverJie
2022/08/19
2260
动手实现一个 LRU cache
Java和Android的LRU缓存及实现原理
Android提供了LRUCache类,可以方便的使用它来实现LRU算法的缓存。Java提供了LinkedHashMap,可以用该类很方便的实现LRU算法,Java的LRULinkedHashMap就是直接继承了LinkedHashMap,进行了极少的改动后就可以实现LRU算法。
哲洛不闹
2018/09/18
9180
Java和Android的LRU缓存及实现原理
设计实现一个LRU Cache1 什么是LRU Cache2 实现思路
1 什么是LRU Cache 在LeetCode上有一个LRU Cache实现的题目 Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set. get(key) - Get the value (will always be positive) of the key if the key exists
JavaEdge
2018/05/16
1.2K0

相似问题

实现GetEnumerator的IDictionary

13

LRU算法的实现

11

LinkedHashSet实现LRU

22

Simplescalar缓存LRU实现

31

并发LRU缓存实现

512
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文