一.缓存的产生与发展

1.1 什么是缓存?

缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器。Cache一词来源于1967年的一篇电子工程期刊论文,用于电脑工程领域。

1.2 缓存的发展?

问题:最开始的PC机处理器CPU没有Cache,CPU直接访问内存数据,访问数据的速度匹配不上CPU的处理速度。

手段:后来英特尔公司对CPU增加了对可选的Cache的支持,当CPU处理数据时,它会先到Cache中去寻找,如果数据因之前的操作已经读取而被暂存其中,就不需要再从随机存取存储器(Main memory)中读取数据,从而加快读取数据速度。

优化:在CPU内核增加L2 Cache(二级缓存),甚至三级缓存,超高速缓存等。

1.3 缓存概念的扩充

如今我们知道缓存的概念不仅仅限于在CPU和主内存之间,在硬盘与 *** 之间、在软件与硬件之间、在系统应用与数据库之间等也有某种意义上的Cache。

总之,凡是位于处理数据速度相差较大的两种介质之间,用于协调两者数据传输速度差异的结构,均可称之为Cache。

1.4 缓存在应用服务中的发展

随着 *** 发展及普及,用户量级增长,我们的应用服务器及数据库服务器同时需要处理大量的请求及数据计算,而我们的应用服务器资源有限、数据库同时可处理请求能力也有瓶颈,如何利用有限的资源承载更高的并发提高应用的吞吐能力呢?其中一个较为有效的方式就是引入缓存。即通过缓存快速访问需要数据并返回,减少系统交互,提高计算响应能力。

总之,尽可能将数据放在最近最直接最快速获取的地方,协调应用获取数据与存储数据返回之间速度的差异。

二.缓存的应用

2.1 缓存的分类

在目前的应用服务框架中,根据应用服务于缓存之间的耦合程度,比较常见的分为local cache(本地缓存)和remote cache(分布式缓存/共享缓存)。

本地缓存

存在于应用中的,能够直接访问获取数据,无 *** 开销的存储介质。

优点:其存储位置与应用在同一上下文环境中或者在同一进程中,无需过多 *** 开销,访问速度非常快。

缺点:1)每个应用实例都要维护一套缓存数据,数据不共享;2)数据一致性问题,由于更新不及时,缓存中维护的数据可能不正确;3)无法进行大数据存储,数据无持久化随着应用重启而丢失。

应用场景:1)缓存的数据一般为静态不常变更的只读数据;2)短时间变更对业务影响不敏感的数据;

本地缓存的实现:

缓存一般是一种key-value的键值对数据结构,所以需要使用字典数据结构来实现,在 J百思特网ava 编程中,常用的字典实现包括 HashMap 和 ConcurretHashMap。

如果本地缓存需要被不同的服务端线程并发读写,则需要保证线程安全。一般会使用线程安全的ConcurrentHashMap 来作为 Java 编程中的本地缓存实现。

除此之外,也有其他更加智能的本地缓存实现,如可以定时失效,访问重新加载等特性,典型实现如 Google 的 guava 工具包的 Cache 实现。

分布式共享缓存

缓存与应用分离,缓存本身即为一种应用,如常见的Redis、Memcached、美团的Cellar都属于共享缓存或者共享缓存的实现。

优点:1)数据共享,保证数据一致性,各节点通过统一的分布式缓存进行数据存取操作,保证了不同节点的应用进程的数据一致性问题;2)数据读写分离,高性能,高可用;3)支持大数据量存储,不受应用进程重启影响;

缺点:1)数据跨 *** 传输,性能低于本地缓存

应用场景:具体场景具体分析,一般适合数据结构简单、需要高性能读写且具备分布式共享的数据存储。

2.2 常见框架组件对缓存的应用

2.2.1 MyBatis的缓存

一级缓存

一级缓存:在执行多次查询条件完全相同的SQL时,MyB百思特网atis提供了一级缓存的方案优化查询性能,如果是相同的SQL语句,会优百思特网先命中一级缓存,避免直接对数据库进行查询,提高性能。

一级缓存的共享级别:在MyBatis *** 有两个选项,SESSION或者STATEMENT,默认是SESSION级别,即在一个MyBatis会话中执行的所有语句,都会共享这一个缓存。一种是STATEMENT级别,可以理解为缓存只对当前执行的这一个

推荐内容