缓存基本知识

缓存详解

缓存

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

撇开这些计算机的概念,所谓缓存,通常都是指内存的访问性能明显优于磁盘,咱们把数据放入内存中,能够提供更快的读取效率,把数据放入内存中就是缓存。由于在内存中,因此缓存是暂时性的存储,若是断电,程序结束等状况都会让缓存清空,因此必要状况下咱们会对缓存作持久化处理,也就是存入硬盘中。mysql

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

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

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

为何要使用缓存

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

缓存的优缺点

在使用中,咱们通常都会选择Cache+DB的结构,这样作的好处就是将高频访问的数据,放入缓存中,提升系统总体的承载能力,提升了读写的能力。服务器

加速读写:一般来讲加速是明显的,由于缓存一般都是全内存的系统,然后端(多是mysql、甚至是别人的HTTP, RPC接口)都有速度慢和抗压能力差的特性,经过缓存的使用能够有效的提升用户的访问速度同时优化了用户的体验。session

下降后端负载:经过缓存的添加,若是程序没有什么问题,在命中率还能够的状况下,能够帮助后端减小访问量和复杂计算(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做为缓存服务器

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

相关文章
相关标签/搜索