java中的本地缓存,工作后陆续用到,一直想写,一直无从下手,最近又涉及到这方面的问题了,梳理了一下。自己构造单例、guava、ehcache基本上涵盖了目前的大多数行为了。
为什么要有本地缓存?
在系统中,有些数据,数据量小,但是访问十分频繁(例如国家标准行政区域数据),针对这种场景,需要将数据搞到应用的本地缓存中,以提升系统的访问效率,减少无谓的数据库访问(数据库访问占用数据库连接,同时网络消耗比较大),但是有一点需要注意,就是缓存的占用空间以及缓存的失效策略。
为什么是本地缓存,而不是分布式的集群缓存?
目前的数据,大多是业务无关的小数据缓存,没有必要搞分布式的集群缓存,目前涉及到订单和商品的数据,会直接走DB进行请求,再加上分布式缓存的构建,集群维护成本比较高,不太适合紧急的业务项目。
这里介绍一下缓存使用的三个阶段(摘自info架构师文档)
本地缓存在那个区域?
目前考虑的是占用了JVM的heap区域,再细化一点的就是heap中的old区,目前的数据量来看,都是一些小数据,加起来没有几百兆,放在heap区域最快最方便。后期如果需要放置在本地缓存的数据大的时候,可以考虑在off-heap区域,但是off-heap区域的话,需要考虑对象的序列化(因为off-heap区域存储的是二进制的数据),另外一个的话就是off-heap的GC问题。其实,如果真的数据量比较大,那其实就可以考虑搞一个集中式的缓存系统,可以是单机,也可以是集群,来承担缓存的作用。
搞一个单例模式,里面有个Map的变量来放置数据
关于单例模式,一个既简单又复杂的模式(http://iamzhongyong.iteye.com/blog/1539642)
非常典型的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class SingletonMap {
//一个本地的缓存Map
private Map<String,Object> localCacheStore = new HashMap<String,Object>();
//一个私有的对象,非懒汉模式
private static SingletonMap singletonMap = new SingletonMap();
//私有构造方法,外部不可以new一个对象
private SingletonMap(){
}
//静态方法,外部获得实例对象
public static SingletonMap getInstance(){
return singletonMap;
}
//获得缓存中的数据
public Object getValueByKey(String key){
return localCacheStore.get(key);
}
//向缓存中添加数据
public void putValue(String key , Object value){
localCacheStore.put(key, value);
}
} |
这种能不能用?可以用,但是非常局限
1
2
3
4
5
6
7
8
|
但是这种的就是本地缓存了吗? 答案显然不是,为啥呢?
1 、 没有缓存大小的设置,无法限定缓存体的大小以及存储数据的限制(max size limit);
2 、 没有缓存的失效策略(eviction policies);
3 、 没有弱键引用,在内存占用吃紧的情况下,JVM是无法回收的(weak rererences keys);
4 、 没有监控统计(statistics);
5 、 持久性存储(persistent store);
所以,这种就直接废掉了。。。 |
引入EhCache来构建缓存(详细介绍: http://raychase.iteye.com/blog/1545906)
EhCahce的核心类:
A、CacheManager:Cache的管理类;
B、Cache:具体的cache类信息,负责缓存的get和put等操作
C、CacheConfiguration :cache的配置信息,包含策略、最大值等信息
D、Element:cache中单条缓存数据的单位
典型的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public static void main(String[] args) {
//EhCache的缓存,是通过CacheManager来进行管理的
CacheManager cacheManager = CacheManager.getInstance();
//缓存的配置,也可以通过xml文件进行
CacheConfiguration conf = new CacheConfiguration();
conf.name( "cache_name_default" ); //设置名字
conf.maxEntriesLocalHeap( 1000 ); //最大的缓存数量
conf.memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LRU); //设置失效策略
//创建一个缓存对象,并把设置的信息传入进去
Cache localCache = new Cache(conf);
//将缓存对象添加到管理器中
cacheManager.addCache(localCache);
localCache.put( new Element( "iamzhongyong" , new Date()));
System.out.println(localCache.getSize());
System.out.println(localCache.getStatistics().toString());
System.out.println(localCache.getName());
System.out.println(localCache.get( "iamzhongyong" ).toString());
System.out.println(localCache.get( "iamzhongyong" ).getObjectValue());
}
|
当然,Cache的配置信息,可以通过配置文件制定了。。。
优点:功能强大,有失效策略、最大数量设置等,缓存的持久化只有企业版才有,组件的缓存同步,可以通过jgroup来实现
缺点:功能强大的同时,也使其更加复杂
引入guava的cacheBuilder来构建缓存
这个非常强大、简单,通过一个CacheBuilder类就可以满足需求。
缺点就是如果要组件同步的话,需要自己实现这个功能。
典型的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public class GuavaCacheBuilderTest {
public static void main(String[] args) throws Exception{
GuavaCacheBuilderTest cache = new GuavaCacheBuilderTest();
cache.getNameLoadingCache( "bixiao" );
}
public void getNameLoadingCache(String name) throws Exception{
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize( 20 ) //设置大小,条目数
.expireAfterWrite( 20 , TimeUnit.SECONDS) //设置失效时间,创建时间
.expireAfterAccess( 20 , TimeUnit.HOURS) //设置时效时间,最后一次被访问
.removalListener( new RemovalListener<String, String>() { //移除缓存的监听器
public void onRemoval(RemovalNotification<String, String> notification) {
System.out.println( "有缓存数据被移除了" );
}})
.build( new CacheLoader<String, String>(){ //通过回调加载缓存
@Override
public String load(String name) throws Exception {
return name + "-" + "iamzhongyong" ;
}
});
System.out.println(cache.get(name));
//cache.invalidateAll();
}
} |
缓存预热怎么搞?
A、全量预热,固定的时间段移除所有,然后再全量预热
适用场景:
1、数据更新不频繁,例如每天晚上3点更新即可的需求;
2、数据基本没有变化,例如全国区域性数据;
B、增量预热(缓存查询,没有,则查询数据库,有则放入缓存)
适用场景:
1、 数据更新要求缓存中同步更新的场景
集群内部,缓存的一致性如何保证?
如果采用ehcache的话,可以使用框架本身的JGroup来实现组内机器之间的缓存同步。
如果是采用google的cacheBuilder的话,需要自己实现缓存的同步。
A、非实时生效数据:数据的更新不会时时发生,应用启动的时候更新即可,然后定时程序定时去清理缓存;
B、需要实时生效数据:启动时可预热也可不预热,但是缓存数据变更后,集群之间需要同步
至此,告一段落。。。。
相关推荐
### JAVA本地文件下载知识点 #### 一、概述 在Java编程中,经常需要处理文件的上传与下载。本文档将详细介绍如何使用Java实现基于HTTP协议的本地文件下载功能。主要聚焦于通过文件名及文件的全路径来实现本地文件...
- 缓存:OceanBase支持二级缓存,MyBatis的本地缓存可以配合使用,提高查询效率。 - 分布式事务:OceanBase支持分布式事务,MyBatis可以通过编程方式控制事务的提交和回滚。 5. 测试与调优 在实际开发中,需要...
名称:Click&Clean 清除浏览...GoogleGears认证数据删除-删除所有Flash本地共享对象(LSO)-移除所有SilverlightCookies-清潔的Java緩存-清空回收站-安全删除文件,BruceSchneier的算法(7传递)高级:-浏览器关闭时运行
JetCache 支持多种缓存实现,包括本地缓存(如 Guava Cache)和分布式缓存(如 Redis、Memcached),并且提供了丰富的配置选项,可以根据实际需求进行定制。 **核心特性** 1. **统一的 API 和注解**:JetCache ...
- **一级缓存**:也称为本地会话缓存,它的生命周期是伴随着一次会话(SqlSession)的开始和结束。一级缓存默认开启且无法关闭,主要用于减少同一个会话内的多次数据库访问。 - **二级缓存**:也称为全局会话缓存,...
当直接访问成本较高时(如远程过程调用),使用代理模式可以提供本地缓存等功能,提高性能。 - **装饰器模式**:动态地给一个对象添加一些额外的职责,就增加功能而言,装饰器模式相比生成子类更加灵活。 - **外观...
通过以上介绍可以看出,“最新Java电商项目实战-青橙商城”不仅涵盖了电商系统开发中的多个关键技术点,还提供了丰富的学习资源,非常适合希望深入了解电商系统开发流程和技术栈的同学进行学习和实践。无论是对于...
一、Android缓存概述 Android提供多种缓存机制,包括内存缓存、磁盘缓存以及更复杂的数据库缓存。内存缓存如LruCache,适用于小量、高频的数据;磁盘缓存如SQLite数据库、SharedPreferences、文件系统等,适用于大量...
**FileMap 概述** FileMap 是一个专为 Java 平台设计的高效本地 Key-Value 存储系统。它的核心理念是利用文件系统作为存储介质,提供类似于内存映射文件(Memory-Mapped File)的功能,但同时也兼顾了持久化和高...
一、Webview缓存概述 Webview的缓存机制主要包括两种类型:内存缓存(Memory Cache)和磁盘缓存(Disk Cache)。内存缓存用于临时存储最近访问过的网页数据,当用户再次访问时可以从内存中快速加载。磁盘缓存则将...
### Java对象持久化技术概述 #### 一、Java对象持久化技术概览 Java对象持久化技术是指将Java对象的状态保存到外部存储介质的过程。这种技术对于任何基于Java的应用程序都至关重要,因为它允许应用程序在断电或...
**缓存概述** 缓存的基本思想是将经常访问的数据暂存到高速、易访问的地方,以便下次请求时能快速获取。根据其部署位置和工作方式,缓存主要分为四类:CDN缓存、反向代理缓存、本地应用缓存和分布式缓存。 **CDN...
再次访问同一页面时,可以直接从本地缓存中加载页面,无需重新请求服务器,显著提升了加载速度。浏览器缓存可通过设置HTTP头部信息进行控制。 ```plaintext HTTP/1.1 200 OK Date: Fri, 30 Oct 1998 13:19:41 ...
### Java最新面试宝典知识点概览...通过以上总结,可以看出《Java最新面试宝典》覆盖了Java开发人员面试中可能遇到的各种知识点,不仅包括基础知识,还有高级主题,旨在帮助求职者全面准备面试,提高通过面试的成功率。
EHCache支持多种缓存模式,包括本地缓存、分布式缓存等,并且提供了丰富的配置选项来满足不同场景的需求。它的特点还包括: - **多级缓存**:支持多个级别的缓存结构,可以根据业务逻辑灵活配置。 - **异步刷新**:...
本地缓存是指在应用程序本身的内存中存储数据;而分布式缓存则是指将缓存分布在多个服务器上,通常用于处理大规模的数据访问需求。 - **缓存策略**:常见的缓存策略包括LRU(Least Recently Used,最近最少使用)、...
本部分主要介绍Java的一些基础知识,并且强调了这些知识是作者在日常实践中总结提炼出来的。 - **Java的特点**: - 跨平台性:Java程序可以运行在任何安装了Java虚拟机(JVM)的操作系统上。 - 安全性:Java提供...
#### JMF (Java Media Framework) 概述 JMF 是 Java 平台上用于处理实时音频、视频和其他形式的流媒体的标准框架。它提供了一种简单的方法来捕获、播放、处理、存储以及传输多媒体数据。JMF 包含了大量的类和接口,...