最近跟同学吃饭扯淡的时候,由技术扯到薪资,又由薪资扯到他找工作时跟面试官是怎么扯淡拿高工资的,各种技术一顿侃,总之只要啥都了解就没问题了。谈到缓存的时候,我试探性的问了问- -你还记得LRU怎么写吗,他说啥完?我说没事。。

 写完这篇文章发给他- -鄙视完他让他请我再吃饭,标准的缓存LRU实现为哈希表+链表,这是热乎的双向链表,也是C#版本的。。C#实现双向链表 

代码:

    public class LRUCache<T>
{
private int _size;//链表长度
private int _capacity;//缓存容量
private Dictionary<int, ListNode<T>> _dic;//key +缓存数据
private ListNode<T> _linkHead;
public LRUCache(int capacity)
{
_linkHead = new ListNode<T>(-, default(T));
_linkHead.Next = _linkHead.Prev = _linkHead;
this._size = ;
this._capacity = capacity;
this._dic = new Dictionary<int, ListNode<T>>();
} public T Get(int key)
{
if (_dic.ContainsKey(key))
{
ListNode<T> n = _dic[key];
MoveToHead(n);
return n.Value;
}
else
{
return default(T);
}
}
public void Set(int key, T value)
{
ListNode<T> n;
if (_dic.ContainsKey(key))
{
n = _dic[key];
n.Value = value;
MoveToHead(n);
}
else
{
n = new ListNode<T>(key, value);
AttachToHead(n);
_size++;
}
if (_size > _capacity)
{
RemoveLast();// 如果更新节点后超出容量,删除最后一个
_size--;
}
_dic.Add(key, n);
}
// 移出链表最后一个节点
private void RemoveLast()
{
ListNode<T> deNode = _linkHead.Prev;
RemoveFromList(deNode);
_dic.Remove(deNode.Key);
}
// 将一个孤立节点放到头部
private void AttachToHead(ListNode<T> n)
{
n.Prev = _linkHead;
n.Next = _linkHead.Next;
_linkHead.Next.Prev = n;
_linkHead.Next = n;
}
// 将一个链表中的节点放到头部
private void MoveToHead(ListNode<T> n)
{
RemoveFromList(n);
AttachToHead(n);
}
private void RemoveFromList(ListNode<T> n)
{
//将该节点从链表删除
n.Prev.Next = n.Next;
n.Next.Prev = n.Prev;
}
} public class ListNode<T>
{
public ListNode<T> Prev;
public ListNode<T> Next;
public T Value;
public int Key; public ListNode(int key, T val)
{
Value = val;
Key = key;
this.Prev = null;
this.Next = null;
}
}

测试:

          LRUCache<int> cache = new LRUCache<int>();
cache.Get();
cache.Set(, );
cache.Set(, );
cache.Get();
cache.Set(, );
cache.Set(, );
cache.Get();

C#简单实现LRU缓存的更多相关文章

  1. 使用go语言的list实现一个简单的LRU缓存

    package main; import ( "container/list" "errors" "sync" "fmt" ...

  2. Java:手写幼儿园级线程安全LRU缓存X探究影响命中率的因素

    最近遇到一个需求,需要频繁访问数据库,但是访问的内容只是 id + 名称 这样的简单键值对. 频繁的访问数据库,网络上和内存上都会给数据库服务器带来不小负担. 于是打算写一个简单的LRU缓存来缓存这样 ...

  3. LRU缓存实现(Java)

    LRU Cache的LinkedHashMap实现 LRU Cache的链表+HashMap实现 LinkedHashMap的FIFO实现 调用示例 LRU是Least Recently Used 的 ...

  4. 简单的LRU Cache设计与实现

    要求: 设计并实现一个LRU缓存的数据结构,支持get和set操作 get(key):若缓存中存在key,返回对应的value,否则返回-1 set(key,value):若缓存中存在key,替换其v ...

  5. 简单的java缓存实现

    扫扫关注"茶爸爸"微信公众号 坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活. 提到缓存,不得不提就是缓存算法(淘汰算法),常见算法有LRU.LFU和FIFO等算法 ...

  6. 【转】简单的java缓存实现

    本文转自 http://my.oschina.net/u/866190/blog/188712 提到缓存,不得不提就是缓存算法(淘汰算法),常见算法有LRU.LFU和FIFO等算法,每种算法各有各的优 ...

  7. 面试挂在了 LRU 缓存算法设计上

    好吧,有人可能觉得我标题党了,但我想告诉你们的是,前阵子面试确实挂在了 RLU 缓存算法的设计上了.当时做题的时候,自己想的太多了,感觉设计一个 LRU(Least recently used) 缓存 ...

  8. Java集合详解5:深入理解LinkedHashMap和LRU缓存

    今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存. 摘要: HashMap和双向链表合二为一即是LinkedHashMap.所谓Linke ...

  9. 04 | 链表(上):如何实现LRU缓存淘汰算法?

    今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是+LRU+缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...

随机推荐

  1. csharp: Double Convert To String

    /// <summary> /// /// </summary> /// <param name="fl"></param> /// ...

  2. JavaWeb学习总结(九):Cookie进行会话管理

    一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...

  3. jsp页面乱码

  4. JavaScript中的__proto__

    实例中的__proto__ 箭头函数的__proto__ 需要注意的是箭头函数的__proto__并没有指向Function构造函数的的原型对象 MDN上的资料显示,箭头函数不绑定Arguments ...

  5. 【javascript】javascript设计模式之单例模式

    单例模式: 定义:单例模式之所以这么叫,是因为它限制一个类只能有一个实例化对象. 实现方法:判断实例是否存在,如果存在则直接返回,如果不存在就创建了再返回.(确保一个类只有一个实例对象) 特点: 命名 ...

  6. Java快速入门-05-数组循环条件 实例《延禧攻略》

    <延禧攻略>如此火爆,蹭蹭热度,用 JAVA 最基础的数组,循环,条件,输入/输出,做了一个简单的小游戏,帮助初学者巩固 JAVA 基础,注释非常详细 动态图展示: xuanfei.jav ...

  7. Android图片处理--缩放

    PS:在开发中我们会遇到一些图片处理问题,比如说缓存图片了.限制图片大小了.查看图片了等.上一篇文章介绍了图片的全景效果查看,今天介绍一个图片缩放,我们如果有时间的话,可以自己写一个属于自己的库,里面 ...

  8. asp.net mvc4 小问题

    最近在学习mvc4中间出现一些问题.留作记录.. 1.新建立的项目在vs2013中运行后会出现一个长轮询..这个叫browserLink 是vs2013中新加入的东西.至于更多解释.直接百度.. 关闭 ...

  9. Angular5中提取公共组件之radio list

    上一篇说到了Checkbox List的公共组件提取,现在说一下Radio List的公共组件提取. Radio List组件提取起来很方便,不想Checkbox那么复杂. radio-list.co ...

  10. winform ComboBox控件反选

    winform ComboBox控件反选:int index = comboBox1.FindString(textBox2.Text); comboBox1.SelectedIndex = inde ...