常用的缓存技术

Posted 霓裳梦竹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用的缓存技术相关的知识,希望对你有一定的参考价值。

前言

缓存,在我们日常开发中是必不可少的一种解决性能问题的方法。简单的说,cache 就是为了提升系统性能而开辟的一块内存空间。

  缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用。在日常开发的很多场合,由于受限于硬盘IO的性能或者我们自身业务系统的数据处理和获取可能非常费时,当我们发现我们的系统这个数据请求量很大的时候,频繁的IO和频繁的逻辑处理会导致硬盘和CPU资源的瓶颈出现。缓存的作用就是将这些来自不易的数据保存在内存中,当有其他线程或者客户端需要查询相同的数据资源时,直接从缓存的内存块中返回数据,这样不但可以提高系统的响应时间,同时也可以节省对这些数据的处理流程的资源消耗,整体上来说,系统性能会有大大的提升。

一、常见的缓存技术

1、CPU缓存
2、操作系统缓存

3、HTTP缓存

4、数据库缓存

5、本地缓存:不需要序列化。速度快、缓存的数量与大小受限于本地内存

6、分布式缓存:需要序列化,速度相较于本地缓存较慢,但是理论上缓存的数据与大小不受限制(缓存机器可以进行扩展)

二、本地缓存

google guava cache:全内存的本地缓存实现。它实现了线程安全的实现机制,是本地缓存的不二之选

Ehcache:Spring默认集成的一个缓存,以Spring cache的底层缓存实现类形式去操作缓存的话,非常方便,但是欠缺灵活,如果要是想灵活使用的话,还是要单独使用Ehcache

Oscache:最经典简单的页面缓存,可以缓存任何对象,拥有全面的API可以全面使用程序来控制所有的OSCache特性,支持集群可以设置过期时间。

三、分布式缓存

memcache:分布式缓存的标配

Redis:新一代的分布式缓存

四、memcached

经典的一致性hash算法

基于slab的内存模型有效防止内存碎片的产生(但同时也需要估计好启动参数,否则会浪费很多的内存)

集群中机器之间互不通信(相较于Jboss cache等集群中机器之间的相互通信的缓存,速度更快<--因为少了同步更新缓存的开销,且更适合于大型分布式系统中使用)

使用方便(这一点是相较于Redis在构建客户端的时候而言的,尽管redis的使用也不困难)

很专一(专做缓存,这一点也是相较于Redis而言的)

五、Redis

可以存储复杂的数据结构(5种)

      strings-->即简单的key-value,就是memcached可以存储的唯一的一种形式,接下来的四种是memcached不能直接存储的四种格式(当然理论上可以先将下面的一些数据结构中的东西封装成对象,然后存入memcached,但是不推荐将大对象存入memcached,因为memcached的单一value的最大存储为1M,可能即使采用了压缩算法也不够,即使够,可能存取的效率也不高,而redis的value最大为1G)

     hashs-->看做hashTable

     lists-->看做LinkedList

     sets-->看做hashSet,事实上底层是一个hashTable

     sorted sets-->底层是一个skipList

有两种方式可以对缓存数据进行持久化

    RDB

    AOF

事件调度

发布订阅等

六、集成缓存

专指spring cache,spring cache自己继承了ehcache作为了缓存的实现类,我们也可以使用guava cache、memcached、redis自己来实现spring cache的底层。当然,spring cache可以根据实现类来将缓存存在本地还是存在远程机器上。

七、页面缓存

在使用jsp的时候,我们会将一些复杂的页面使用Oscache进行页面缓存,使用非常简单,就是几个标签的事儿;但是,现在一般的企业,前台都会使用velocity、freemaker这两种模板引擎,本身速度就已经很快了,页面缓存使用的也就很少了。

八、综述

在实际生产中,我们通常会使用guava cache做本地缓存+redis做分布式缓存+spring cache就集成缓存(底层使用redis来实现)的形式

guava cache使用在更快的获取缓存数据,同时缓存的数据量并不大的情况

spring cache集成缓存是为了简单便捷的去使用缓存(以注解的方式即可),使用redis做其实现类是为了可以存更多的数据在机器上

redis缓存单独使用是为了弥补spring cache集成缓存的不灵活

就我个人而言,如果需要使用分布式缓存,那么首先redis是必选的,因为在实际开发中,我们会缓存各种各样的数据类型,在使用了redis的同时,memcached就完全可以舍弃了,但是现在还有很多公司在同时使用memcached和redis两种缓存。

以上是关于常用的缓存技术的主要内容,如果未能解决你的问题,请参考以下文章

页面优化常用技术

PHP常用的缓存技术汇总

常用的缓存技术

前端常用缓存技术

什么是Java缓存技术Cache

JAVA几种缓存技术介绍说明