16 | 缓存策略:如何使用缓存来减少磁盘IO?
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
现代高性能系统中,缓存是不可或缺的组成部分。缓存设计需要考虑数据一致性和命中率等问题。对于只读缓存,更新策略可以选择同步更新、定时全量更新或设置数据过期时间。在缓存置换策略方面,根据业务需求定制化策略是最佳选择,同时通用的LRU算法也是一个不错的选择。总的来说,只读缓存适用范围广,实现简单,而缓存更新和置换策略需要根据具体业务需求进行选择和设计。文章深入探讨了缓存策略的选择和设计,为读者提供了缓存策略的技术特点和应用指导。 文章标题:现代高性能系统中的缓存策略选择与设计 现代高性能系统中,缓存是必不可少的组成部分。缓存的设计需要考虑数据一致性和命中率等问题。对于只读缓存,更新策略可以选择同步更新、定时全量更新或设置数据过期时间。而在缓存置换策略方面,根据业务需求定制化策略是最佳选择,同时通用的LRU算法也是一个不错的选择。总的来说,只读缓存适用范围广,实现简单,而缓存更新和置换策略需要根据具体业务需求进行选择和设计。文章深入探讨了缓存策略的选择和设计,为读者提供了缓存策略的技术特点和应用指导。
《消息队列高手课》,新⼈⾸单¥59
全部留言(47)
- 最新
- 精选
- 大白给小白讲故事”⻚⾯位置与尾部的距离。因为越是靠近尾部的数据,被访问的概率越⼤“ 不大理解这句话,尾部指的是啥?当某个客户端正在从很旧的位置开始向后读取⼀批历史数据,是怎么判断与尾部的距离,从而减少这部分的缓存。
作者回复: 与尾部的距离=最后一个一条消息的尾部位置 - 页面的位置 这个值越小,说明请求的数据与尾部越近,置换的时候被留下的概率也就越大。 对于历史数据,由于距离远,这个值会很大,那这些页面在置换的时候被留下的概率就很小,所以很快就会被从内从中置换出去。
2019-08-2918 - Yasir交作业,双向链表实现 https://github.com/tuhao/leetcode/blob/master/src/mqexercise/LRUTest.java
作者回复: 👍👍👍
2019-11-0729 - 奕文中说SSD硬盘的访问速度每秒几千次,内存是硬盘的10万倍,那就是亿这个数量级了,运行那么快呢?CPU的缓存假如说是内存的千倍那就到了千亿的数据级了,会有那么快吗?
作者回复: 这个是理论上的数据,实际上取决于随机顺序读写还是顺序读写,读写数据大小,差别还是非常大的。像CPU和内存,他们标称的速度都是多少多少Hz,这个赫兹Hz的意思就是每秒钟多少次,其实就是它的极限tps。 但实际我们执行一次数据读写或者一行代码,编译成CPU指令可能是几条指令,这样你就大概能推断出这条指令的执行速度应该是个什么量级的了。
2019-08-298 - fomy老师,我在github上写了一个lru的实现。https://github.com/fomeiherz/code-snippet/tree/master/lru 使用了HashMap和Queue一起实现的。使用HashMap保存键值对可以实现O(1)复杂查询,使用队列保存key,头部出队,尾部入队。更新比较复杂,需要删除对应的元素后,才可以再入队,这里是O(n) 复杂度。 老师,更新队列顺序时是否会有更快办法?或者有更快的实现办法呢?求指导
作者回复: 你这个实现中,命中缓存后“移动元素到尾部”这个操作,同时会移动其它无关的元素的位置(从队头移到队尾),这样就不满足LRU的原则了,可以试试将队列换成链表这种可以支持随机写的数据结构。
2019-11-285 - 13761642169PageCache是OS提供的能力,用户程序调用什么API才能使用到PageCache,为什么说kafka大量使用到PageCache,因为mmap?
作者回复: 对应的几个写文件的系统调用都会经过PageCache,比如write pwrite还有mmap
2019-09-223 - A9JMQ是如何使用自定义的LRU算法的?即使使用DirectBuffer不是也要经过PageCache吗?
作者回复: DirectBuffer确实也需要经过PageCache,但是它有更好的批量大小,写入时的系统调用次数也会更少,所以性能更好一些。
2019-10-272 - 约书亚来晚了,根据jms和kafka这两节,我试着猜想一下jms的机制,顺便提个问题: 1. 老师这节提到的jms实现的缓存机制,都是基于direct buffer自己实现的一个内存池,并实现了变种的LRU对么?这个缓存就是前面提到的journal cache,被writeThread/RelicationThread/FlushThread使用? 2. 这个内存池看起来并没有借助于netty的direict buffer pool是吧? 3. 那原谅我对比一下jms和rocket,jms没有基于mmap去做而选择direct buffer,看起来是为了: a. 减少GC的压力 b. 比mmap更容易控制,就更容增加缓存的命中率 这样? 4. 另外,有个概念我很模糊,有资料说direct buffer在写磁盘/socket时并不能真的节省一次cpu copy?那这样的话jms可以说并没有利用zero copy? 望解惑
作者回复: A1:是的。 A2:是的。 对于问题3和4,你可以看一下关于JMQ的这篇文章: https://www.jiqizhixin.com/articles/2019-01-21-19
2019-09-012 - 77老师问个问题,关于读写缓存和只读缓存第一种的区别是不是 读写缓存是更新缓存然后异步去更新磁盘文件,只读缓存是先更新磁盘在更新缓存呢?
作者回复: 读写缓存和只读缓存的区别是,数据在更新的时候,是否去更新缓存。 至于是先更新缓存,还是先更新磁盘文件,这个取决于不同的缓存策略。
2020-04-291 - 明日Java实现: https://gist.github.com/imgaoxin/ed59397c895b5a8a9572408b98542015
作者回复: 👍👍👍
2019-09-033 - humor我感觉读写缓存和只读缓存的第一种更新策略(更新数据的同时更新缓存)是一样的吧?因为它们都需要同时更新数据和缓存,区别可能是读写缓存以更新缓存为主,只读缓存的第一种更新策略是以更新数据为主吗
作者回复: 还有就是,读写缓存可以为写入加速,但牺牲了数据可靠性。
2019-08-30