关于java中的本地缓存-总结概

Posted zbuger

tags:

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

为什么要有本地缓存?

在系统中,有些数据,数据量小,但是访问十分频繁(例如国家标准行政区域数据),针对这种场景,需要将数据搞到应用的本地缓存中,以提升系统的访问效率,减少无谓的数据库访问(数据库访问占用数据库连接,同时网络消耗比较大),但是有一点需要注意,就是缓存的占用空间以及缓存的失效策略。

 

为什么是本地缓存,而不是分布式的集群缓存?

         目前的数据,大多是业务无关的小数据缓存,没有必要搞分布式的集群缓存,目前涉及到订单和商品的数据,会直接走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());          关于JVM了解学习心得总结记录

Java体验的重点难点-----总结

java内存区域总结

LocalCache本地缓存分享

android缓存机制怎样做交互更好

Java内存区域

(c)2006-2024 SYSTEM All Rights Reserved IT常识