缓存的收益和成本以及进程缓存讲解

缓存是什么?

起源于CPU,原始意义是指访问速度⽐⼀般随机存取存储器(RAM)快的⼀种RAM,通常它 不像系统主存那样使⽤DRAM技术,⽽使⽤昂贵但较快速的SRAM技术

缓存类别

CPU L1/L2/L3 Cache、Linux page Cache加速硬盘读写、浏览器缓存、堆内缓存(进程缓存)、分布式缓 存
离CPU越近的速度越快

缓存触发条件

1.用户访问触发:用户第一次进来走数据库,数据加入缓存,第二次进来如果缓存没过期返回。但弊端也暴露出来了,如果用户恰恰每次访问都是等过期了才触发,这样缓存就没什么意义了

2.异步刷缓存:用户访问读多写少的业务场景,不管多少用户获取的都是相同数据,比如设置2分钟刷新,主动去刷新缓存

但以上方法都有弊端,异步刷数据,如果你数据太多,但你用户访问数都是不确定的,可能今天就100个人访问,明天可能100万个人访问,只是举例子。所以一切方式都是看场景

缓存带来的回报

高速读写:缓存加速读写速度

降低后端负载:后端服务器通过前端缓存降低负载-业务端使用Redis降低后端MySQL负载等

缓存带来的代价

数据不一致:缓存层和数据层有时窗口不一致,和更新策略有关

代码维护成本:原本只需读写MySQL就能实现功能,但加入了缓存之后就要去维护缓存的数据,增加代码复杂度

堆内存可能带来内存溢出的风险影响用户进程:如ehcache、loadingCache、xmx

堆内存一般性能更好,远程缓存需要套接字传输

用户界别缓存尽量采用远程缓存

大数据量尽量采用远程缓存,服务节点化原则

进程缓存

也可以叫进程内缓存或本地缓存,以EhCache、GauvaCache为例。没有网络开销,节省了内网宽带,响应延时更低。

进程缓存优势

1.减轻数据存储服务器压力

2.减少与数据存储服务器的通讯,提高相应速度

进程缓存缺点

1.现在应用多是集群部署,进程缓存是在每个节点内,数据存储多分,一致性难以保障。比如你部署100台节点,进程缓存都是用户级的,他每次访问的节点可能都是不一样的,这样命中率就会很短,而且数据冗余且一致性难以保障

2.集群部署下缓存分散,管理、同步的成本比较高

分布式缓存就不做介绍了,一搜一大堆

至于什么情况下适合应用进程内缓存?

  1. 相同的请求或者设置的相同缓存key的请求每次都是同一个服务器上的同一个程序去处理,这样这个请求的缓存正常情况下只会产生一份。 如果每次请求都会路由到不同的服务器,便会产生多个缓存的副本,维护这些缓存数据的一致性是需要代价的。
  2. 当有新的服务器节点加入或者服务器节点退出的时候,不能发生雪崩现象,所有缓存请求都穿透到达数据库,那是比较要命的。
  3. 如果缓存的处理服务器发生变化,比如:由于某种原因,开始请求是由服务器A来处理,后来A服务器down了,现在由服务器B来处理,在缓存转移的过程中,必须能保证数据的正确性和一致性。
  4. 程序的进程内缓存必须有过期策略,在有限内存大小的情况下,合理的使用。推荐使用LRU淘汰算法来保证内存不会撑爆。
  5. 系统的并发量及其大,对性能的要求及其高,可以考虑使用进程内缓存。
  6. 如果是小部分只读数据,并且访问量比较大,例如经常使用的字典数据等,可以考虑使用进程内缓存。

相对于分布式缓存,比如Redis,进程内缓存有哪些优势?

  1. 进程内缓存性能比较高,延迟会更小,更节省带宽,毕竟分布式缓存网络调用的性能和本地调用比起来慢太多,
  2. 由于和应用程序位于同一进程,共享相同的虚拟内存,所以在状态维护上更容易一些,
  3. 其次进程内的缓存不设计到网络传输,所以没有序列化的过程,在性能上更胜一筹。
  4. 进程内缓存的数据类型几乎可以是语言级别支持的任意类型,数据类型设计上比大多数分布式缓存设备支持要灵活许多。

个人理解

  1. 首先把数据从磁盘加载到内存做缓存,这个是对的。毕竟磁盘的IO速度比内存要慢的多。就拿我们现在使用的大多数PC机以及服务器来说,磁盘往往是性能的瓶颈。
  2. 如果有条件或者框架支持可以实现进程内缓存,我还是推荐使用进程内缓存,毕竟类似Redis这样的kv存储和应用程序多数情况不在一台服务器上,虽然局域网的速度肉眼看起来非常快,但是对于cpu来讲,还是让cpu休了一个大假。
  3. 在应对高并发的情况下,如果有适当的环境还是觉得进程内缓存为首选,另外一点程序要尽量避免线程切换,尽量异步化。如果可以最好能预估出缓存数据的大小,避免内存泄漏等现象发生。
  4. 当然分布式缓存有自己的优势,在监控,容灾,扩展性,易用性等方面更胜一筹。至于用进程内还是分布式缓存,没有定论,能解决业务痛点就是最好的结果

猜你喜欢

转载自blog.csdn.net/q736317048/article/details/113729487