缓存分类,应用缓存、分布式缓存

 

 

一、应用缓存(本地缓存)

java中的本地缓存,主要包括,构造单例map、guava、ehcache 三类。
 
为什么要有本地缓存?
在系统中,有些数据,数据量小,但是访问十分频繁(例如国家标准行政区域数据),针对这种场景,需要将数据写到应用的本地缓存中,以提升系统的访问效率,减少无谓的数据库访问(数据库访问占用数据库连接,同时网络消耗比较大),但是有一点需要注意,就是缓存的占用空间以及缓存的失效策略。
 
为什么是本地缓存,而不是分布式的集群缓存?
         一些和业务无关的小数据缓存,没有必要搞分布式的集群缓存,目前涉及到订单和商品的数据,会直接走DB进行请求,再加上分布式缓存的构建,集群维护成本比较高,不太适合紧急的业务项目。

 

本地缓存作用就是提高系统的运行速度,是一种空间换时间的取舍。它实质上是一个做key-value查询的字典。 

 

分类:

1. java jdk map/ConcurrentMap

 

适用场景:数据量小,数据没有失效时间要求

 

 jdk map局限性:

1、  没有缓存大小的设置,无法限定缓存体的大小以及存储数据的限制(max sizelimit);
2、  没有缓存的失效策略(eviction policies);
3、  没有弱键引用,在内存占用吃紧的情况下,JVM是无法回收的(weakrererences keys);
4、  没有监控统计(statistics);
5、  持久性存储(persistent store);

 

 

2. ehcache

 

优点:功能强大,有失效策略、最大数量设置等,缓存的持久化只有企业版才有,组件集群的缓存同步,可以通过jgroup来实现
缺点:功能强大的同时,也使其更加复杂

 

ehcache有集群的功能,但是ehcache还是适合一些简单的应用缓存,比如方法级别的,缓存方法的返回值。或者当作一个Map来存储不由GC管理的、可以持久化的数据,比如爬虫url的存储。

 

ehcache对并发的支持

       在高并发的情况下,使用Ehcache缓存时,由于并发的读与写,我们读的数据有可能是错误的,我们写的数据也有可能意外的被覆盖。所幸的是Ehcache为我们提供了针对于缓存元素Key的Read(读)、Write(写)锁。当一个线程获取了某一Key的Read锁之后,其它线程获取针对于同一个Key的Read锁不会受到限制,但其它线程(包括获取了该Key的Read锁的线程)如果想获取针对同一个Key的Write锁就不行,它需要等到针对于该Key的Read锁释放后才能获取其Write锁;当一个线程获取了某一Key的Write锁之后,其它线程获取同一个Key的Read锁或者Write锁的请求将等待针对于该Key的Write锁释放后才能继续进行,但是同一个线程获取该Key对应的Read锁或者Write锁将不需要等待。获取了对应的锁之后,记得在不再需要该锁后释放该锁。并且需要注意不要引起死锁。

 

配置文件依赖:ehcache.xml 

 

 

3. Guava Cache 

 Guava Cache 是单个应用运行时的本地缓存。

 Guava Cache 与 ConcurrentMap很相似,但也不完全一样。最基本的区别是 ConcurrentMap 会一直保存所有添加的元素,直到显式地移除。相对地,Guava Cache 为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管 LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。

Guva是google开源的一个公共java库,类似于Apache Commons,它提供了集合,反射,缓存,科学计算,xml,io等一些工具类库。

cache只是其中的一个模块。使用Guva cache能够方便快速的构建本地缓存。

 

缺点就是如果要组件集群同步的话,需要自己实现这个功能。

 

 

二、分布式缓存

 

1. memcache

 

 

 

2. redis

Redis的特点
  • KV NoSQL
  • 缓存在内存
  • 支持多种数据结构
  • 可持久化:AOF / RDB
  • 高性能、高可靠
  • 支持主从复制

 

 

 

3. mongodb

 

 

 

 

4. Apache Cassandra

Apache Cassandra 是一种分布式非关系型数据库,具有高性能、可扩展、无中心化等特征。Cassandra 是适用于社交网络业务场景的数据库,适合实时事务处理和提供交互型数据。以 Amazon 完全分布式的 Dynamo 数据库作为基础,结合 Google BigTable 基于列族(Column Family)的数据模型,实现 P2P 去中心化的存储。

 

 

 

 

 

三、缓存一致性

缓存预热?
A、全量预热,固定的时间段移除所有,然后再全量预热
适用场景:
1、数据更新不频繁,例如每天晚上3点更新即可的需求;
 2、数据基本没有变化,例如全国区域性数据;
B、增量预热(缓存查询,没有,则查询数据库,有则放入缓存)
适用场景:
1、  数据更新要求缓存中同步更新的场景
 
​集群内部,缓存的一致性如何保证?
如果采用ehcache的话,可以使用框架本身的JGroup来实现组内机器之间的缓存同步。
如果是采用google的cacheBuilder的话,需要自己实现缓存的同步。
A、非实时生效数据:数据的更新不会时时发生,应用启动的时候更新即可,然后定时程序定时去清理缓存;
B、需要实时生效数据:启动时可预热也可不预热,但是缓存数据变更后,集群之间需要同步
posted @ 2018-08-08 15:59  panchanggui  阅读(660)  评论(0编辑  收藏  举报