最近跟同学吃饭扯淡的时候,由技术扯到薪资,又由薪资扯到他找工作时跟面试官是怎么扯淡拿高工资的,各种技术一顿侃,总之只要啥都了解就没问题了。谈到缓存的时候,我试探性的问了问- -你还记得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. 如何迎接新的 .NET 时代

    看完.NET 基金会. Roslyn 编译器 ,应该已经能慢慢了解,现在所谓的“.NET 开源”.“.NET Open Source”并不是完全把现有的 .NET Framework 整个打开(虽然这 ...

  2. python中单下划线和双下滑线

    使用单下划线(_one_underline)开头表示方法不是API的一部分,不要直接访问(虽然语法上访问也没有什么问题). 使用双下划线开头(__two_underlines)开头表示子类不能覆写该方 ...

  3. lnmp环境 开启pathinfo

    thinkphp url访问模式中 默认的pathinfo不起作用? 1.检查你的tp配置文件config.php URL模式 'url_model'=> '1', //URL模式 即pathi ...

  4. 代码积累-Common

    新建Common类库 /// <summary> /// string的扩展 /// </summary> public static class StringExt { // ...

  5. JDBC中处理事务,小Demo

    事务的四大特性(ACID):  原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败.  一致性(Consistency):事务执行 ...

  6. ARCGIS 10.0破解版安装过程error 1606 和error 1316问题 及安装流程

    来自:http://blog.csdn.net/don_lvsml/article/details/8681100 楼主今天安装ESRI.ArcGIS.10.CS时,由于第一次接触该软件,将其按照一般 ...

  7. Android 解决NestedScrollView 嵌套 RecyclerView出现的卡顿,上拉刷新无效

    解决卡顿的方法最简单的就是设置RecyclerView的android:nestedScrollingEnabled="false",放弃自己的滑动,交给外部的NestedScro ...

  8. Android LinkedList和ArrayList的区别

    LinkedeList和ArrayList都实现了List接口,但是它们的工作原理却不一样.它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向链接串列(doub ...

  9. 如何安装window7 语言包

    很多下载的语言包都是.exe文件,双击后生成lp.cab文件. 这时马上把文件复制到另外一个文件夹中,直接拖最快. 这是 window7 sp1 的很多语言包下载地址(企业版和旗舰版通用):http: ...

  10. 求最大公约数和最大公倍数(Java算法)

    最大公约数(最大公因数):指某几个整数共有约数中最大的一个. 求两个整数最大公约数主要的方法: 列举法:各自列出约数,再找出最大的公约数. 素因数分解法:两数各作素因数分解,然后取出共有的项乘起来. ...