最近跟同学吃饭扯淡的时候,由技术扯到薪资,又由薪资扯到他找工作时跟面试官是怎么扯淡拿高工资的,各种技术一顿侃,总之只要啥都了解就没问题了。谈到缓存的时候,我试探性的问了问- -你还记得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. axios中设置post请求,后台却无法识别参数

    场景:在使用iview时,定义api请求时,代码如下 export const delWord = (data) => { return axios.request({ url: '/words ...

  2. Java设计模式—命令模式

    命令模式是一个高内聚的模式. 定义如下:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 通用类图如下: 角色说明: ● Re ...

  3. Android GridView异步加载图片和加载大量图片时出现Out Of Memory问题

    我们在使用GridView或者ListView时,通常会遇到两个棘手的问题: 1.每个Item获取的数据所用的时间太长会导致程序长时间黑屏,更甚会导致程序ANR,也就是Application No R ...

  4. Web前端和后端开发的区别和要求

    Web前端和后端开发的区别和要求 有时候自己会分不清,其实是因为前后端都了解,类似于全栈工程师,但又什么都不是很精通.那到底什么是前端.后端呢,我整理了一些企业要求级别的前端/后端基础,开发框架等. ...

  5. Python爬虫教程-05-python爬虫实现百度翻译

    使用python爬虫实现百度翻译功能 python爬虫实现百度翻译: python解释器[模拟浏览器],发送[post请求],传入待[翻译的内容]作为参数,获取[百度翻译的结果] 通过开发者工具,获取 ...

  6. Css3中拖拽效果的实例(带有注释~欢迎指教)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Jmeter————监控服务器性能

    1. 下载jmeter插件 上面2个是jmeter插件,第3个要放在监控的服务器中. 2. 解压压缩包 找到解压包中的JAR文件,并拷贝到jmeter的lib/ext目录下,这里下载的1.4版本的插件 ...

  8. C++类知识总结

    c++类 1.初始化const或引用类型数据成员的唯一机会是在构造函数初始化列表中. 2.使用成员初始化列表时成员初始化的次序:第一个成员首先被初始化.然后是第二个,依次类推. 构造函数初始化列表为类 ...

  9. 宝塔面板 + Rancher + 阿里云镜像仓库 + Docker + Kubernetes,添加集群、部署 web 应用

    目录 一,安装宝塔面板(V 6.8) 二,使用宝塔安装 Docker,配置阿里云容器服务 三,安装 Rancher (Server) 四,管理 Rancher.添加集群 五,添加 Rancher 应用 ...

  10. 10G client连接数据库

    tnsnames.ora文件中的名字一定要顶格写(前面不留空格),不然连接时会如下报错. 已使用的参数文件:F:\oracle\product\10.2.0\client_1\network\admi ...