操作系统的磁盘操作已经提供了page cache,比如Linux会把所有未使用的内存用作page cache,那么我们为什么还需要加那么多层缓存?DB有自己的缓存,为什么我们还需要像memcached这样的应用层缓存?
1
简单说,OS提供了一个通用的选择,没办法针对应用做个性化定制。kafka基本是顺序读写,这点是OS缓存可以很好的处理的情况;但是对于更多应用层系统来说,存在数据热点分布不均的情况,这些OS就不能很好的处理了。例如MySQL的innoDB缓存,如果采用OS的缓存策略,来一次全表扫描那么就可以让InnoDB辛辛苦苦热起来的数据冷了。但是InnoDB自己维护缓存情况下,就可以处理得很好,例如MySQL的InnoDB会对缓冲数据拆分为young以及old数据;会在整个缓存空间中腾出3/8的数据来用缓存这种多次访问的热点数据;这样全表扫描情况下,至少大多数热点数据还在内存中。甚至应用层可以在程序中直接指定热点数据,直接缓存起来;还有一个问题,OS缓存单位是页,不够应用层灵活。
2
所说的缓存 都是操作系统或软件服务在不能得知业务的情况下默认做的优化根据目标数据的热度来决定放在内存中还是放入外存(比如LRU)page cache是假定开发者的io操作是顺序读 不是随机读 所以替开发者做了预判(再者读取单位是页啊… 有个设计原因 在这里不解释了 类似行式存储和列式存储 很多事情是结合场景来做选择的 没人说默认的方式就很好啊)没有人说不能直接操数据库 可是那一次请求 走了很多实际不需要走的逻辑啊 通过降级功能 用更简单的方式实现缓存借此提升性能、节约资源 Kafka也是一样 假设你要是用Kafka玩消息事务 那不是脑袋有病么…
本文探讨了操作系统提供的pagecache虽然高效,但在面对应用层数据热点分布不均时的局限性。通过对比OS缓存与如MySQL InnoDB、memcached等应用层缓存,阐述了后者如何针对特定需求优化性能,如维护热点数据、灵活缓存单位,以及直接缓存指定数据。
742

被折叠的 条评论
为什么被折叠?



