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

    本文来自https://www.jianshu.com/p/04127d74d88c,并非本人原创,只是作为自己学习使用的资料,如有浏览者请点击地址自行到原作者页面浏览 有时候我们需要将json数据直 ...

  2. border-radius圆角兼容方案

    1.下载ie-css3.htc 2.CSS代码段 box { -moz-border-radius: 15px; /* Firefox */ -webkit-border-radius: 15px; ...

  3. 手动替换WORDPRESS的GOOGLE字体等加速【非插件】

    手动替换WORDPRESS的GOOGLE字体等加速[非插件] 179 看过 | 2015年3月4日 | Linux, 随意Coding | 暂无评论 查找需要替换的地方 Linux下,在网站文件夹中, ...

  4. 使用NodeJs搭建的小型web应用

    原文英文链接:http://www.nodebeginner.org 中文翻译链接:http://www.nodebeginner.org/index-zh-cn.html 学习链接:一本全面的Nod ...

  5. centos下安装ipython(minglnghang命令行)

    下载文件 wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 执行安装 python get-pip.py 这就安装好了 ...

  6. 远程管理客户端--SCCM

    远程控制客户端(设备--启动--远程控制): 1.将该用户在SCCM中赋予 远程工具操作人员 权限后,可以通过ccm控制台连接客户端,即可以使用远程控制工具 客户端设置策略设置--远程工具--管理远程 ...

  7. Exchange2016 & Skype for business 集成之三统一联系人存储

    Exchange2016&Skype for business集成之二统一联系人存储 利用统一的联系人存储库,用户可以维护单个联系人列表,然后使这些联系人适用于多个应用程序,包括 Skype ...

  8. 沉淀再出发:web服务器和应用服务器之间的区别和联系

    沉淀再出发:web服务器和应用服务器之间的区别和联系 一.前言 关于后端,我们一般有三种服务器(当然还有文件服务器等),Web服务器,应用程序服务器和数据库服务器,其中前面两个的概念已经非常模糊了,但 ...

  9. 微软Charting图表控件 System.Web.UI.DataVisuliztion.Charting

    一.概述 基于.NET Framework 3.5 SP1的图表控件--Chart,可在WinForm和WebForm下使用!需要引入System.Web.DataVisualization.dll ...

  10. Kafka生产者producer简要总结

    Kafka producer在设计上要比consumer简单,不涉及复杂的组管理操作,每个producer都是独立进行工作的,与其他producer实例之间没有关联.Producer的主要功能就是向某 ...