LRU LFU FIFO 转载】的更多相关文章

-------------------------------------->href--------------------------> http://blog.chinaunix.net/uid-13246637-id-5185352.html 最近在做笔试题,其中虚拟存储管理中几种缺页中断算法经常考到,虽然这类题可说非常简单,但概念上却容易混淆而且如果不掌握正确的做法很容易出错,因此觉得有必要把这三种算法的实现过程理一遍,并从源代码级别去思考它们的实现. 首先推荐一个博客,对这两个算法…
LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换算法.该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最长的页面给予淘汰. FIFO置换算法有这样一个奇怪现象:内存空间块数越多,缺页中断率可能相反的越高(缺页中断次数越高). LFU(Least Frequently Used)最近最少使用算法,它是基于"如果一个数据在最近一段时间内使用次…
这篇博客主要介绍LRU LFU 算法,因为在Mybatis的缓存中会用到,所以放到这个系列中了.此外,这是我翻译的一篇文章,觉得原文已经写的很好了,所以就直接翻译一下,留作知识整理. 英文原文出处如下: https://xuri.me/2016/08/13/lru-and-lfu-cache-algorithms.html 鼓励大家多读读英文的资料.好处不多说.自己体会. 在此声明,文章只是翻译了一个大体意思,有些词汇翻译的不准确,不要砸我. 最少最近使用(LRU) 丢弃掉最近期间最少使用的项目…
当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据.常用的淘汰算法有下面几种: 1. FIFO:First In First Out,先进先出.判断被存储的时间,离目前最远的数据优先被淘汰. 2. LRU:Least Recently Used,最近最少使用.判断最近被使用的时间,目前最远的数据优先被淘汰. 3. LFU:Least Frequently Used,最不经常使用.在一段时间内,数据被使用次数最少的,优先被淘汰.…
今天是2013-09-09,时别n久的一篇经典文章,有被我在google发现了,再次转载一下.学习一下. 一.LRU链: 任何缓存的大小都是有限制的,并且总不如被缓存的数据多.就像Buffer cache用来缓存数据文件,数据文件的大小远远超过Buffer cache.因此,缓存总有被占满的时候.当缓存中已经没有空闲内存块时,如果新的数据要求进入缓存,就只有从缓存中原来的数据中选出一个牺牲者,用新进入缓存的数据覆盖这个牺牲者.这一点我们在共享池中曾提及过,这个牺牲者的选择,是很重要的.缓存是为了…
大家对这段代码肯定很熟悉吧: public List<UserInfo> SearchUsers(string userName) { string cacheKey=string.Format("SearchUsers_{0}", userName); List<UserInfo> users = cache.Find(cacheKey) as List<UserInfo>; if (users == null) { users = reposit…
  原文地址: http://flychao88.iteye.com/blog/1977653 http://blog.csdn.net/cjfeii/article/details/47259519 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高". 1.2. 实现 最常见的实现是使用一个链表保存缓存数据,详细算法实现如下: 1. 新数据插入到链表头部: 2. 每当…
前言 我们常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量到达上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来.缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据.常用淘汰算法有 LRU,LFU,FIFO,这篇文章我们聊聊 LRU 算法. LRU 简介 LRU 是 Least Recently Used 的缩写,这种算法认为最近使用的数据是热门数据,下一次很大概率将会再次被使用.而最近很少被使用的数据,很大概率下一次不再用到.当缓存容量的满时候,优先淘汰最近很少使用…
JAVA 读取配置文件: Properties props= new Properties();//文件在src目录下,编译会被加载到classpath下. Props.load(Test.class.getClassLoader().getResourceAsStream(‘observer.properties’); String temp = Props.getproperty(‘observers’); HTML 非表单标签: b粗体  u 下划线  i 斜体 del 删除效果 a 超链…
1.缓存的受益和成本 1.1 受益 1.可以加速读写:Redis是基于内存的数据源,通过缓存加速数据读取速度 2.降低后端负载:后端服务器通过前端缓存降低负载,业务端使用Redis降低后端数据源的负载等 1.2 成本 1.数据不一致:后端数据源中的数据缓存到Redis,如果后端数据库中的数据被更新时,根据更新策略不同,Redis缓存层中的数据和数据源的数据有时间窗口不一致 2.代码维护成本:多了一层缓存逻辑,以前只需要读取后端数据库,现在还需要维护缓存的读写以及Redis与数据库的连接等 3.运…
Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.下面会介绍缓存使 用技巧和设计方案,包含如下内容:缓存的收益和成本分析.缓存更新策略的选择和使用场景.缓存粒度控制法.穿透问题优化.无底洞问题优化.雪崩问题优化.热点key重建优化. 缓存的收益和成本分析 下图左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构. 缓存加入后带来的收益和成本. 收益: ①加速读写:因为缓存通常都是全内存的,而存储层通常读写性能不够强悍…
缓存 就是把本来应该放在硬盘里的东西放在内存里  将来存内存里读 一级缓存: session缓存 二级缓存: sessionFactory级别的   (适合经常访问,数据量有限,改动不大) 很多的session缓存  找不到再去数据库拿 开启二级缓存 查询缓存 比如说 我查的是2-8的数据 然后呢我又查了3-9的数据 则3-8的数据就是查询缓存,三级缓存 缓存算法 内存对象满了 拿走什么 Lru Lfu fifo 1.最近很少被使用 2.最近不常被使用 3.缓存对象设置一个数组 来一个把第一个推…
缓存能够有效加速应用的访问速度,同时可以降低后端负载,在应用架构中起着至关重要的作用,本文主要介绍缓存使用的一些技巧. 缓存更新策略 LRU/LFU/FIFO算法剔除 场景:数据一致性要求较低 原理:缓存使用量超过了预设值,使用maxmemory-policy来选择何种剔除策略对现有数据进行删除 问题:数据清理由算法决定,开发人员只能选择使用哪种算法,数据一致性最差 超时剔除 场景:数据一致性要求低 原理:给缓存设置过期时间(expire),自动删除 问题:一段时间窗口内存在一致性问题 主动更新…
马士兵hibernate(原始笔记) 课程内容 1        HelloWorld a)   Xml b)   annotation 2        Hibernate原理模拟 - 什么是O/R Mapping以及为什么要有O/R Mapping 3        常见的0/R框架(了解) 4        hibernate基础配置(重点) 5        ID生成策略(重点 AUTO) 6        Hibernate核心开发接口介绍(重点) 7        对象的三种状态(了…
Hibernate工作原理及为什么要用?原理:1.读取并解析配置文件2.读取并解析映射信息,创建SessionFactory3.打开Sesssion4.创建事务Transation5.持久化操作6.提交事务7.关闭Session8.关闭SesstionFactory 为什么要用:1.    对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. 2.    Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现.他很大程度的简化DAO层的编码工作 3. …
1:redis 是用c语言来实现的,速度快 持久化 单线程 复杂的数据类型有bitmap和hyperloglog和geo地理信息2:高可用.分布式 v2.8开始支持Redis-Sentinel(哨兵)高可用 v3.0开始支持Redis-Cluster 分布式3:典型应用场景 缓存系统 计数器(如微博评论数,转发数以及点赞数) 消息队列 排行榜(sortset) 社交网络(set并集交集差集) 实时系统 4:可执行文件说明 redis-server Redis服务器 redis-cli Redis…
EHCache 是一个纯java的在进程中的缓存,它具有下面特性:高速,简单,为Hibernate2.1充当可插入的缓存,最小的依赖性,全面的文档和測试.官方站点http://ehcache.sourceforge.net/ 毫无疑问,差点儿全部的站点的首页都是訪问率最高的,而首页上的数据来源又是很广泛的,大多数来自不同的对象,并且有可能来自不同的db ,所以给首页做缓存是一个不错的主意,那么主页的缓存策略是什么样子的呢,我觉得应该是某个固定时间之内不变的,比方说2 分钟更新一次.那么这个缓存应…
1.缓存更新策略 1.LRU/LFU/FIFO算法剔除:例如maxmemory-policy 2.超时剔除,过期时间expire,对于一些用户可以容忍延时更新的数据,例如文章简介内容改了几个字 3.主动更新:代码控制生命周期,对于一些必须实时更新的数据,例如金额 策略 一致性 维护成本 LRU/LFU/FIFO算法剔除 最差 低 超时剔除 较差 低 主动更新 强 高 2.缓存粒度问题 1.通用性:全量属性最好 2.占用空间:部分属性最好 3.代码维护:表面上看全量属性最好 大部分应用来说都是缓存…
一.缓存的收益和成本 左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构, 缓存加入后带来的收益如下: 加速读写:因为缓存通常都是全内存的(例如Redis.Memcache),而存储层通常读写性能不够强悍(例如MySQL),通过缓存的使用可以有效地加速读写,优化用户体验. 降低后端负载:帮助后端减少访问量和复杂计算(例如很复杂的SQL语句),在很大程度降低了后端的负载. 缓存加入后带来的成本如下: 数据不一致性:缓存层和存储层的数据存在着一定时间窗口的不一致性,时间窗口跟更新策…
最近在学习本地缓存发现,在 Spring 技术栈的开发中,既可以使用 Spring Cache 的注解形式操作缓存,也可用各种缓存方案的原生 API.那么是否 Spring 官方提供的就是最合适的方案呢?那么本文将通过一个案例来为你揭晓. Spring Cache Since version 3.1, the Spring Framework provides support for transparently adding caching to an existing Spring appli…
Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析.缓存更新策略的选择和使用场景.缓存粒度控制法.穿透问题优化.无底洞问题优化.雪崩问题优化.热点key重建优化. 缓存的收益和成本分析 下图左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构. 缓存加入后带来的收益和成本. 收益:①加速读写:因为缓存通常都是全内存的,而存储层通常读写性能不够强悍(例…
性能优化 1.注意session.clear() 的运用,尤其在不断分页的时候 a) 在一个大集合中进行遍历,遍历msg,取出其中额含有敏感字样的对象 b) 另外一种形式的内存泄漏( //面试题:Java有内存泄漏吗?语法级别没有,但是可由java引起,例如:连接池不关闭,或io读取后不关闭) 2.1+N 问题(典型的面试题) 举例:当存在多对一关系时,多的一方默认是可以取出一的一方的 @ManyToOne 中 默认为fetch=FetchType.Eager 当load多的一方时,也会加载一的…
1.注意session.clear()的运用,尤其是不断分页循环的时候 A 在一个大集合中进行遍历,取出其中含有敏感字的对象 B 另一种形式的内存泄露. 2.1+N问题 问题描述:如@ManyToOne时,两个类分别是User与Group,取User时,本想发一条SQL语句,结果顺带发了N条语句,将每个User对应的Group也查询了. 解决方法有三种: (1)设为@ManyToOne(fetch=FetchType.LAZY) (2)在Group类中的@Entity下面加一条@BatchSiz…
Redis作为缓存中间件,被广泛应用在各类系统,用来提升系统性能和吞吐,下面总结几点开发人员在使用Redis时需要考虑的几个关键点: 一. key的设计 1. key命名规范:为了避免不必要的麻烦,我们要给系统定义一套key的设计规范.通俗点举个例子,我们在电脑上写好了一篇文章,需要保存起来,这时候我们会找个合适目录并且取个合适的文件名,以便后续要找它的时候,能想起它的名字并找到它,key的命名就好比给你要保存的文件命名和选目录,好的命名,能让你很容易想起它.找到它.大多缓存场景,是将需高频读取…
最近工作没有那么忙,有时间来写写东西.今年的系统分析师报名已经开始了,面对历年的真题,真的难以入笔,所以突然对未来充满了担忧,还是得抓紧时间学习技术. 同事推了一篇软文,看到了这个Ehcache,感觉简单又好用,所以在自己这边也做个记录. 先来谈谈什么是Ehcache缓存,我们从实际场景出发,支撑一个系统最直接的东西就是数据库,针对数据库我们最常用的操作就是查询.反复的查询数据库会导致数据库压力变大,传统的数据库查询效率就不高(网络.sql语句复杂),导致查询体验不好.尤其当我们查询的语句还是类…
缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.但是将缓存加入应用架构后也会带来一些问题,本章将针对这些问题介绍缓存使用技巧和设计方案,包含如下内容: □ 缓存的收益和成本分析. □ 缓存更新策略的选择和使用场景. □ 缓存粒度控制方法. □ 穿透问题优化. □ 无底洞问题优化. □ 雪崩问题优化. 口 热点key重建优化. 1.缓存的收益和成本 图11-1左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+ 存储层架构,下面分析一下缓存加入带来的收益和…
一.双写一致性 双写一致性,也就是说 Redis 和 mysql 数据同步 双写一致性数据同步的方案有: 1.先更新数据库,再更新缓存 这个方案一般不用: 因为当有两个请求AB先后更新数据库后,A应该先更新缓存,但是因为网络原因,B却先更新了缓存,导致了脏数据,所以不考虑用. 2.先删缓存,再更新数据库 这个方案也不是很好: 缓存删了,数据库还没存完,又来了一个请求,又去数据库拿,然后缓存又有了(在存数据的时候,请求来了,缓存不是最新的) 3.先更新数据库,再删缓存 推荐用这个方案: 更新了数据…
一.FIFO算法 FIFO(First in First out),先进先出.其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度(先来先服务),为什么这个原则在很多地方都会用到呢?因为这个原则简单.且符合人们的惯性思维,具备公平性,并且实现起来简单,直接使用数据结构中的队列即可实现. 在FIFO Cache设计中,核心原则就是:如果一个数据最先进入缓存中,则应该最早淘汰掉.也就是说,当缓存满的时候,应当把最先进入缓存的数据给淘汰掉.在FIFO Cache中应该支持以下操作;…
前篇在此: 操作系统笔记(五) 虚拟内存,覆盖和交换技术 操作系统 笔记(三)计算机体系结构,地址空间.连续内存分配(四)非连续内存分配:分段,分页 内容不多,就不做index了. 功能:当缺页中断发生时,需要调入新的页面而内存已满时,需要选择哪个物理页面被置换? 目标:尽可能减少缺页中断(页面的换入换出)次数.在局部性原理下根据过去的数据统计预测. 页面锁定(frame locking):用于描述必须常驻内存的操作系统的关键部分,或时间关键的应用进程(time-critical).需要在页表中…
考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6 当内存块数量分别为3时,试问FIFO.LRU.OPT这三种置换算法的缺页次数各是多少? 答:缺页定义为所有内存块最初都是空的,所以第一次用到的页面都产生一次缺页. FIFO法: 因为FIFO表示先进先出,它们的执行流程是这样的,如果该值在内存块中,则内存块的值不变:如果该值不在内存块,则将该值放入出栈口地址.当内存块数量为3时,FIFO的演示图如下图所示,其中蓝色标记表示将被替换的单元(也即出栈口…