阅读 24

缓存基本知识

缓存详解

缓存

缓存在维基百科的定义是这样:高速缓存(cache)简称缓存,原始意义是指访问速度比一般随机存取存储器(RAM)快的一种RAM。

撇开这些计算机的概念,所谓缓存,一般都是指内存的访问性能明显优于磁盘,我们把数据放入内存中,可以提供更快的读取效率,把数据放入内存中就是缓存。因为在内存中,所以缓存是暂时性的存储,如果断电,程序结束等情况都会让缓存清空,所以必要情况下我们会对缓存做持久化处理,也就是存入硬盘中。

仅此而已,我们在使用中也是这样,一般Java中对缓存的应用分为两种:应用内缓存和使用缓存应用。

应用内缓存就是通过Map或者EHcache(java缓存工具)等手段将数据缓存在JVM内部,这样的缓存和应用在一个JVM中,会占据JVM的内存空间,并且缓存间是不能够通信的。

使用缓存应用是指使用memcache ,redis这样的应用,将应用和缓存分开部署,可以单机部署也可以分布式部署,多个应用可以使用同一台缓存服务器,这样的缓存应用具有强一致性,高可用等优点。

为什么要使用缓存

之所以使用缓存,一定缓存对我们有了正向的收益,那么缓存有什么用呢?在讲解缓存的概念的时候我们说过,缓存能够提高一些数据的访问速度。而在系统使用缓存也是从效率的角度出发,将一些需要频繁访问的数据放置到缓存中,提高查询的效率,是一种以空间换时间的策略。

缓存的优缺点

在使用中,我们一般都会选择Cache+DB的结构,这样做的好处就是将高频访问的数据,放入缓存中,提高系统整体的承载能力,提高了读写的能力。

加速读写:通常来说加速是明显的,因为缓存通常都是全内存的系统,而后端(可能是mysql、甚至是别人的HTTP, RPC接口)都有速度慢和抗压能力差的特性,通过缓存的使用可以有效的提高用户的访问速度同时优化了用户的体验。

降低后端负载:通过缓存的添加,如果程序没有什么问题,在命中率还可以的情况下,可以帮助后端减少访问量和复杂计算(join、或者无法在优化的sql等),在很大程度降低了后端的负载。

同时使用缓存的缺点也很明显,会带来数据不一致性,代码维护复杂等问题。

数据不一致性:无论你的设计做的多么好,缓存数据与后端数据源一定存在着一定时间窗口的数据不一致性,这个时间窗口的大小可大可小,具体多大还要看一下你的业务允许多大时间窗口的不一致性。

代码维护成本:加入缓存后,代码就会在原数据源基础上加入缓存的相关代码,例如原来只是一些sql, 现在要加入k-v缓存,必然增加了代码的维护成本。

什么情况下需要使用缓存

  1. 复杂开销大的计算、降低后端负载

    以Mysql为例子,一些复杂的操作或者计算(例如大量联表操作、一些分组计算),如果不加缓存,大量流量将在这些复杂计算的执行。

  2. 加速请求响应

    即使单条后端数据足够快(例如select * from table where id=?),那么依然可以利用redis/memcache将这些操作进行merge做优化(例如:cache(select * from table where id in(id1,id10....idK))),从而优化整个IO链的相应时间。

  3. 一些会被频繁操作的数据

    session的共享会使用redis作为缓存服务器

我不能保证每一个地方都是对的,但是可以保证每一句话,每一行代码都是经过推敲和斟酌的。希望每一篇文章背后都是自己追求纯粹技术人生的态度。 永远相信美好的事情即将发生。

关注下面的标签,发现更多相似文章
评论