应用缓存

应用级别的缓存

  • 基本概念
  • 回收策略
  • java缓存类型
  • 多级缓存

基本概念

缓存命中率:从缓存查到的次数 / 查询总次数(缓存查询次数+快慢设备中读取的次数)
SOR:system of record记录系统、或者可以叫数据源、即实际存储原始数据的系统
Cache:缓存、是SOR的快照数据、cache的访问速度比SOR要快、放入cache的目的是提升访问速度、减少回源到SOR的频次
回源:cache未命中时、需要从SOR读取数据、这个过程叫回源

回收策略

1. 基于空间:指缓存设置了存储空间、eg.设置10MB、当达到存储空间上限时、按照一定的策略移除数据

2. 基于时间:
   1) TTL(Time to Live): 存活期、即缓存数据从创建开始直到到期的一个时间段(不管在这个时间段内有没有被访问、缓存数据都将过期)
   2) TTI(Time To Idle): 空闲期、即缓存数据多久没被访问后会被删除

3. 基于容量:指缓存设置了最大大小、当缓存的条目超过最大大小时、按照一定的策略移除旧数据

4. 基于java对象引用
   1) 软引用:若一个对象是软引用、那么当JVM堆内存不足时、垃圾回收器可以回收这些对象、
             比较适合做缓存、这样当jvm堆内存不足时、可以回收这些对象、供强引用对象使用、从而避免OOM
   2) 弱引用:当垃圾回收器回收内存时、若发现弱引用、会立即回收、相对软引用、弱引用的生命周期会更短
   注意:只有当没有其它对象引用该弱引用/软引用对象时、垃圾回收才会回收改引用

5. 回收算法:使用基于空间和基于容量的缓存会使用一定的策略移除旧数据、常用的如下:
   1) FIFO(First in first out): 先进先出
   2) LRU(Least Recently Used): 最近最少使用算法、使用时间距离现在最久的那个会被移除
   3) LFU(Least Frequency Used): 最不常用算法、一定时间段内使用次数(频率)最小的被移除

java缓存类型

堆缓存:使用java堆缓存来存储缓存对象、无需序列化/反序列化、是最快的缓存、缺点也很明显、当缓存的数据量很大时、GC暂停的时间会变长、存储容量受限于堆空间大小、一般通过软引用/弱引用来存储缓存对象、即当堆内存不足时、可以强制回收这部分内存释放堆内存空间、一般使用堆缓存存储较热的数据、可以使用Guava Cache、Ehacache 3.x、MapDB来实现

堆外缓存:即使用缓存数据存储在堆外缓存、可以减少GC暂停时间(堆对象转移到堆外、GC扫描和移动的对象变少了)、可以支持更大的缓存空间(只受机器大小限制、不受堆空间的影响)、但是读取数据时要序列化和反序列化、会比堆缓存慢

磁盘缓存:即缓存数据存储在磁盘上、在jvm重新启动时、缓存数据依然存在、而堆缓存/堆外缓存的数据会丢失、需要重新加载、可以使用Ehacache 3.x、mapdb来实现

分布式缓存:上边提到的缓存是进程内缓存和磁盘缓存、在多jvm实例的情况下、会存在2个问题:
1. 单机容量问题  2. 数据一致性问题(多台据jvm实例的缓存数据不一致怎么办?)--短时间内数据不一致可以接受
3. 缓存命不中时、需要多次回源请求(每个实例都会回源一次)、可以使用一致性hash分片算法解决
   可以使用分布式缓存来解决、eg. 使用ehcache-clustered(配个terracotta server)来实现进程间分布式缓存、也可以使用如redis等实现分布式缓存

多级缓存

可以使用本地缓存 + 分布式缓存来提升缓存性能

你可能感兴趣的:(缓存,无事闲翻书)