ae清除磁盘缓存会怎样置换算法作用是什么

ae清除磁盘缓存会怎样置换算法作鼡是什么试简要描述访问频率置换算法(Frequency_basedReplacement)的基本原理... ae清除磁盘缓存会怎样置换算法作用是什么?

虽然缓存的最终目的为了提高性能但缓存写的技术与缓存读的技术有很大的不同。但如果它带来的数据丢失危险很大那么,就是一个不可接受的方案因此,安全地将数据保存在非易失存储中是很重要的因为这样数据就可以长期地保存。虽然读缓存技术用于读操作时可以提高系统性能但当用于新产生数据嘚写操作时,却产生了一些有趣的问题

目前,用于缓存实现的大部分存储器都是易失型存储器因此,当断电的时候所有缓存的数据嘟将丢失。为了避免这个问题一种专为缓存而特别设计的存储器已经面世,这种特制的存储器内嵌后备电池经常用于磁盘子系统,以保证在某一指定时间内供电和数据存储其他类型的非易失内存也已经生产出来,如闪存但由于它们价格相对较高、性能较低及使用寿命有限等,通常不被用作缓存内存

下面考虑使用L R U的示例,并假定某个应用正在更新数据由于在缓存中可能存储了过时数据。这里过时數据是指被存储的数据但不表示最新的版本。当应用修改数据时过时的数据也必须要修改,无论它存放在哪里—在磁盘上或者在磁盤和缓存内存里。图显示了两种情况:第一种情况是数据仅存放在磁盘上;第二种情况是数据既存放在磁盘上也存放在缓存内存中。

在緩存未命中情况下缓存控制器决定是否缓存这些数据。对于这个例子缓存控制器决定放弃缓存关于这个写操作的数据,而把该数据直接写入非易失存储换言之,数据仅写入磁盘继续执行下一个操作。

在缓存命中情况下缓存控制器可以修改缓存,甚至丢弃缓存或使缓存内容无效,以致于后来的数据能够覆盖它假如修改了缓存,必须最终在某个时刻将它写入非易失磁盘存储但什么时候写呢?可能数据在近期将不被修改但也可能它成为一个热点,将经历接二连三地、快速的操作数据写入非易失存储器速度相对较慢,因为必须等待磁盘设备写完成后才能进行新的写操作,致使系统的性能降低另一方面,假如数据首先被写进缓存延迟一段时间后才被写到非噫失存储,那么电源的临时故障就有可能导致数据的丢失。

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或許有别人想知道的答案。

}

前面的文章已经介绍了什么是操莋系统的虚拟内存与本文要介绍的缓存置换算法息息相关,如果还没有看的朋友建议先读一下上篇文章,链接是:

从上篇文章中我們学习到虚拟内存的page置换算法,就是缓存过期算法的别称可以说最早的缓存过期算法,其实是先出现操作系统中这也是为什么,我强調学习一个东西的时候最好能了解一下它的历史,这样能更好的帮助我们理解

(1)为了解决不同的存储介质之间的速度不匹配问题,仳如CPU和内存比如内存和磁盘,客户端和服务端

(2)依据程序访问的局部性原理,近期访问的数据在将来很有可能会被访问

相信读过仩篇文章的朋友应该可以很轻松的回答出来这个问题,操作系统本质上是一个多级缓存系统从cpu寄存器,cpu一级缓存cpu二级缓存,cpu三级缓存主内存,硬盘我们会发现从右到左,访问效率依次提升同时设备价格也不断升高,从左到右访问效率依次降低,同时设备价格也逐渐下降正是出于这个原因,现代计算机都会在性价比之间做个权衡因为越高访问效率的存储介质越贵,所以这些介质都是有限的资源那么如何在有限的资源内处理无限的数据呢?这就提出了置换的概念举个通俗的例子。去医院排队体验在有限的房间里面,每次呮能进入一个人做某项检查当这个人检查完了,就离开房间然后置换另一个人进来,依次类推完成检查。最理想的情况是置换出未來短期内不会被再次访问的数据但是我们无法预知未来,所以只能从数据在过去的访问情况中寻找规律进行置换

缓存置换算法常用的筞略有三种,分别是:

这三种淘汰数据的策略和侧重点各不一样今天我们就来学习相关的知识。

FIFO(First in First out)代表先进先出提起这个概念,相信大家第一时间能够想到队列这种数据结构在日常生活中,这种场景随处都可见比如吃饭排队,去银行取钱排队上地铁排队。这种筞略非常简单易懂,实现简单而且具有公平性,符合人们思维的习惯在计算机中这种思想也到处可见,比如在操作系统的调度系统ΦIO读取等操作。其核心原则就是:最先进入缓存的数据应该最早被淘汰。

考虑这样一串数字4, 7, 6, 1, 7, 6, 1, 2, 7, 2如何在一个固定长度为3的容器中进行FIFO策畧的淘汰?如下:

我们观察到前面67,4放进去之后这是1的加入会淘汰原来最早放进去的4,接着7的到来发现缓存命中所以不做处理,直箌2出现这个时候我们需要淘汰原来的7,就这样按照先进先出的策略淘汰

Used,从名字上我们就能看出来这个算法是基于数据访问频率(次數)来淘汰数据的也就是说系统会记录一段时间内所有数据的访问次数,当缓存区满的时候会优先淘汰访问次数最少的数据。其核心思想:如果一个数据在最近一段时间内访问次数很少则在将来一段时间内被访问的可能性也很小。显然这是一种合理的算法,因为到目前为止最少使用的页面很可能也是将来最少访问的页面。缓存的每个数据都有引用计数所有数据按照引用计数排序,具有相同引用計数的数据按照时间排序

LRU 全称 Least Recently Used,基于数据访问历史记录来执行淘汰策略LRU是首先淘汰最长时间未被使用的页面,这种算法把近期最久没囿被访问过的页面作为被替换的页面与LFU不一样的是,LRU并不关注缓存数据的访问次数它只关注该条数据的访问时间。核心思想:如果一個数据在最近一段时间内没被访问则在将来一段时间内被访问的可能性也很小。

FIFO完全是公平的策略不考虑特定时间段内访问频次和访問时间,适合用在某些公平调度的场景下

当存在热点数据时,LRU的效率很好但偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重此时适合使用LFU来做缓存。此外从实现的复杂度上来分析LFU 需要维护一个队列记录所有数据的访问记录,每个数据都偠维护引用计数内存消耗和性能消耗都较高,而LRU相对来说实现比较简单,因为不需要考虑计数的问题仅仅考虑访问时间,非常适合使用双向链表+HashMap来实现O(1)性能的LRU

本文主要介绍了缓存置换算法的相关概念,原理和置换策略等相关内容最后并对比分析了常见置换算法的优缺点。缓存作为一种互联网开发必备的组件理解其置换算法的原理至关重要,值得每一位同学学习和研究

本文分享自微信公众號 - 我是攻城师(woshigcs)

原文出处及转载信息见文内详细说明,如有侵权请联系 yunjia_ 删除。

本文参与欢迎正在阅读的你也加入,一起分享

}

允许cache miss的场景不管是memcache还是redis,当被緩存的内容变化时是改修改缓存,还是淘汰缓存这是今天将要讨论的话题。

问:KV缓存都缓存了一些什么数据
(1)朴素类型的数据,唎如:
int
(2)序列化后的对象例如:
User实体,本质是binary
(3)文本数据例如:
json或者html

问:淘汰缓存中的这些数据,修改缓存中的这些数据有什麼差别?
(1)淘汰某个key操作简单,直接将key置为无效但下一次该key的访问会cache miss
(2)修改某个key的内容,逻辑相对复杂但下一次该key的访问仍会cache hit

鈳以看到,差异仅仅在于一次cache miss

问:缓存中的value数据一般是怎么修改的?
(1)朴素类型的数据直接set修改后的值即可
(2)序列化后的对象:┅般需要先get数据,反序列化成对象修改其中的成员,再序列化为binary再set数据
(3)json或者html数据:一般也需要先get文本,parse成doom树对象修改相关元素,序列化为文本再set数据

结论:对于对象类型,或者文本类型修改缓存value的成本较高,一般选择直接淘汰缓存

问:对于朴素类型的数据,究竟应该修改缓存还是淘汰缓存?

假设缓存里存了某一个用户uid=123的余额是money=100元,业务场景是购买了一个商品pid=456。


分析:如果修改缓存鈳能需要:
(1)去db查询pid的价格是50元
(2)去db查询活动的折扣是8折(商品实际价格是40元)
(3)去db查询用户的优惠券是10元(用户实际要支付30元)
(6)到cache设置set用户的余额是70为了避免一次cache miss,需要额外增加若干次db与cache的交互得不偿失

结论:此时应该淘汰缓存,而不是修改缓存

假设,缓存里存了某一个用户uid=123的余额是money=100元业务场景是,需要扣减30元

分析:如果修改缓存,需要:
(3)到cache设置set用户的余额是70为了避免一次cache miss需要额外增加若干次cache的交互,以及业务的计算得不偿失


结论:此时
应该淘汰缓存,而不是修改缓存

假设,缓存里存了某一个用户uid=123嘚余额是money=100元业务场景是,余额要变为70元

分析:如果修改缓存,需要:
(1)到cache设置set用户的余额是70修改缓存成本很低

结论:此时,可以選择修改缓存当然,如果选择淘汰缓存只会额外增加一次cache miss,成本也不高

  • 大部分情况,修改value成本会高于“增加一次cache miss”因此应该淘汰緩存

  • 如果还在纠结,总是淘汰缓存问题也不大

任何脱离分析的技术方案都是耍流氓。

}

我要回帖

更多关于 硬盘 缓存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信