java本地缓存简介

article/2025/9/1 18:22:34

60247376e4a34b69970092896e464193.jpgjava中的本地缓存,工作后陆续用到,一直想写,一直无从下手,最近又涉及到这方面的问题了,梳理了一下。自己构造单例、guava、ehcache基本上涵盖了目前的大多数行为了。

 

 

为什么要有本地缓存?

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

 

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

         目前的数据,大多是业务无关的小数据缓存,没有必要搞分布式的集群缓存,目前涉及到订单和商品的数据,会直接走DB进行请求,再加上分布式缓存的构建,集群维护成本比较高,不太适合紧急的业务项目。

         这里介绍一下缓存使用的三个阶段(摘自info架构师文档)

          

 

本地缓存在那个区域?

         目前考虑的是占用了JVM的heap区域,再细化一点的就是heap中的old区,目前的数据量来看,都是一些小数据,加起来没有几百兆,放在heap区域最快最方便。后期如果需要放置在本地缓存的数据大的时候,可以考虑在off-heap区域(direct-memory 或者 big-memory),但是off-heap区域的话,需要考虑对象的序列化(因为off-heap区域存储的是二进制的数据),另外一个的话就是off-heap的GC问题。其实,如果真的数据量比较大,那其实就可以考虑搞一个集中式的缓存系统,可以是单机,也可以是集群,来承担缓存的作用。

 

搞一个单例模式,里面有个Map的变量来放置数据

关于单例模式,一个既简单又复杂的模式(http://iamzhongyong.iteye.com/blog/1539642)

非常典型的代码如下:

public class SingletonMap {

    //一个本地的缓存Map

    private Map localCacheStore = new HashMap(); 

 

    //一个私有的对象,非懒汉模式

    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、 没有缓存大小的设置,无法限定缓存体的大小以及存储数据的限制(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中单条缓存数据的单位

典型的代码如下:

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类就可以满足需求。

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

典型的代码如下:

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 cache = CacheBuilder.newBuilder()       

            .maximumSize(20)//设置大小,条目数        

            .expireAfterWrite(20, TimeUnit.SECONDS)//设置失效时间,创建时间      

            .expireAfterAccess(20, TimeUnit.HOURS) //设置时效时间,最后一次被访问       

            .removalListener(new RemovalListener() { //移除缓存的监听器

                public void onRemoval(RemovalNotification notification) {

                    System.out.println("有缓存数据被移除了");

                }})

            .build(new CacheLoader(){ //通过回调加载缓存

                @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、需要实时生效数据:启动时可预热也可不预热,但是缓存数据变更后,集群之间需要同步

 


http://chatgpt.dhexx.cn/article/TKKMvWE0.shtml

相关文章

【java缓存、redis缓存、guava缓存】java中实现缓存的几种方式

一、通过HashMap实现缓存 这种方式可以简单实现本地缓存&#xff0c;但是实际开发中不推荐使用&#xff0c;下面我们来实现一下这种方式。 首先创建一个管理缓存的类 public class LocalCache {public static HashMap<String,String> cache new HashMap<>();sta…

Java实现一个简单的缓存

cache 阅读原文请访问我的博客BrightLoongs Blog  缓存是在web开发中经常用到的&#xff0c;将程序经常使用到或调用到的对象存在内存中&#xff0c;或者是耗时较长但又不具有实时性的查询数据放入内存中&#xff0c;在一定程度上可以提高性能和效率。下面我实现了一个简单的…

java中缓存简介

外存&#xff1a; 也就是我们经常说的&#xff08;CDEF盘的大小&#xff09;外储存器是指除计算机内存及CPU缓存以外的储存器&#xff0c;此类储存器一般断电后仍然能保存数据。常见的外存储器有硬盘、软盘、光盘、U盘等&#xff0c;一般的软件都是安装在外存中 内存&#xff1…

java缓存学习

首先说一下缓存著名的开源框架&#xff1a; 最出名的当属 Redis 和 Memcached 了&#xff0c;它们因为使用简便、高性能而成为事实上的标准。还有一些是比较有名的Java开源缓存框架&#xff0c;例如Ehcache、GuavaCache 和 Caffeine 静态缓存和动态缓存&#xff1a; 所谓静态…

JAVA缓存技术

最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇,暂作保存,后面如果有用到可以参考。此为转贴,帖子来处:http://cogipard.info/articles/cache-static-files-with-jnotify-and-ehcache 介绍 JNotify:http://jnotify.sourcefor…

Java缓存机制

1 Java缓存 1.1 jvm内置缓存 Java中实现缓存的方式有很多&#xff0c;比如用static hashMap基于内存缓存的jvm内置缓存&#xff0c;简单不实用&#xff0c;保对象的有效性和周期无法控制&#xff0c;容易造成内存急剧上升。常用的有Oscache&#xff08;主要针对jsp页面&#…

java中Cache缓存的使用

java中Cache缓存 1.JSR107 缓存的整体架构&#xff1a; 2.SpringBoot的缓存抽象 几个重要概念以及缓存注解 其中想要使用缓存直接&#xff0c;就必须开启**EnableCaching**注解 开启缓存注解的步骤&#xff1a; 作为Spring框架的核心功能之缓存注解&#xff0c;该功能也继承…

JAVA缓存的实现

缓存可分为二大类: 一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上&#xff0c;不管你是以XML格式&#xff0c;序列化文件DAT格式还是其它文件格式&#xff1b; 二、内存缓存&#xff0c;也就是实现一个类中静态Map,对这个Map进行常规的增删查. 下面为一个简单的缓…

java缓存技术的介绍

一、什么是缓存 1、Cache是高速缓冲存储器 一种特殊的存储器子系统&#xff0c;其中复制了频繁使用的数据以利于快速访问 2、凡是位于速度相差较大的两种硬件/软件之间的&#xff0c;用于协调两者数据传输速度差异的结构&#xff0c;均可称之为 Cache 二、缓存的分类 1、基于we…

Java缓存介绍

一、缓存 1、什么是缓存&#xff1f; 缓存是硬件&#xff0c;是CPU中的组件&#xff0c;CPU存取数据的速度非常的快&#xff0c;一秒钟能够存取、处理十亿条指令和数据&#xff08;术语&#xff1a;CPU主频1G&#xff09;&#xff0c;而内存就慢很多&#xff0c;快的内存能够达…

Java实现本地缓存、分布式缓存及多级缓存

以下均为自己参考其它博主文章或自己理解整理而成&#xff0c;如有错误之处&#xff0c;欢迎在评论区批评指正&#xff01; 0. 缓存简介 像MySql等传统的关系型数据库已经不能适用于所有的业务场景&#xff0c;比如电商系统的秒杀场景&#xff0c;APP首页的访问流量高峰场景&a…

Java本地高性能缓存的几种实现方式

Java缓存技术可分为远端缓存和本地缓存&#xff0c;远端缓存常用的方案有著名的redis和memcache&#xff0c;而本地缓存的代表技术主要有HashMap&#xff0c;Guava Cache&#xff0c;Caffeine和Encahche。本篇博文仅覆盖了本地缓存&#xff0c;且突出探讨高性能的本地缓存。 本…

SIFT的两个版本:OpenCV和VL_SIFT

暂时记录一下 OpenCV版本&#xff1a; #include<iostream> #include<opencv2/opencv.hpp> #include<opencv2/core.hpp> #include<opencv2/features2d.hpp> #include <opencv2/xfeatures2d/nonfree.hpp>using namespace std; using namespace c…

论文阅读笔记《Matching Images With Multiple Descriptors: An Unsupervised Approach for Locally Adaptive》

核心思想 本文提出一种将多种特征描述算法融合起来实现更好图像匹配的方法。近些年来&#xff0c;图像特征的描述算法层出不穷如SIFT、LIOP 、DAISY等等&#xff0c;每种方法都有各自的优势和侧重点&#xff0c;对于不同图像其效果也各有优劣。那么能不能将多种算法的优势结合起…

LIFT: Learned Invariant Feature Transform详细笔记

LIFT: Learned Invariant Feature Transform Paper: LIFT: Learned Invariant Feature Transform | SpringerLink Code: GitHub - cvlab-epfl/LIFT: Code release for the ECCV 2016 paper 文章目录 Abstract思路来源LIFT文献来源 方法&#xff1a;LIFTPipeline网络架构训练流…

简单的倒计时shell脚本

效果如下: 代码如下: #! /bin/bash #####################倒计时################ #作者:liop #完成时间:2019.12.17 #三位数以内秒数的倒计时 ########################################## display(){case $1 in1)case $2 in1)echo "******** ";;2)echo "…

计算机视觉领域经典论文源码

计算机视觉领域经典论文源码 转载自&#xff1a;http://blog.csdn.net/ddreaming/article/details/52416643 2016-CVPR论文代码资源&#xff1a; https://tensortalk.com/?catconference-cvpr-2016 一个GitHub账号&#xff0c;里面有很多计算机视觉领域最新论文的代码实现&am…

【译文】Local Intensity Order Pattern for Feature Description

在上一篇文章【特征检测】LIOP特征描述算法中讲到了LIOP描述符&#xff0c;下面我将原文翻译如下&#xff0c;如有出入请以原文为准。 —————————————————————————————————————————————————————————————————…

[2015 Springer] Local Image Descriptor: Modern Approaches——2 Classical Local Descriptors

转载请注明链接&#xff1a; 有问题请及时联系博主&#xff1a;Alliswell_WP 第一篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103475243 第二篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103610331 翻译 本地图像描述…

[2015 Springer] Local Image Descriptor: Modern Approaches——3 Intensity Order-Based Local Descriptors

转载请注明链接&#xff1a; 有问题请及时联系博主&#xff1a;Alliswell_WP&#xff1a;Alliswell_WP 第一篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103475243 第二篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/10361…