本地缓存的几种框架

简介: 我们在项目上一般使用的缓存都是redis,提高接口性能。在一些场景下,我们可以牺牲内存来速度,当然缓存内容有限,不会超过内存空间的值。在项目上有选择的使用一下比较成熟的缓存框架!

Guava Cache

Google Guava Cache是一种非常优秀本地缓存解决方案,提供了基于容量,时间和引用的缓存回收方式。

怎么用?

引入依赖

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>18.0</version></dependency>

相关加载缓存代码

publicclassGiteaUserServiceImplimplementsGiteaUserService {
// 缓存的listprivateLoadingCache<String, Optional<CommonUserDto>>emailUserList;
// 在项目启动的时候构造缓存@PostConstructpublicvoidinit() {
// 设置两小时的过期时间emailUserList=CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.HOURS).build(newCacheLoader<String, Optional<CommonUserDto>>() {
// 缓存失效之后的重新加载逻辑@OverridepublicOptional<CommonUserDto>load(Stringemail) {
CommonUserDtocommonUserDto=null;
try {
commonUserDto=giteaExService.qryUserDtoByEmail(email);
                }
catch (Exceptione) {
logger.error("LoadingCache Portal User error...", e);
                }
returnOptional.ofNullable(commonUserDto);
            }
        });
// 加载缓存this.loadUserDtoList();
    }
/*** 查询并且构造用户集合*/privatevoidloadUserDtoList() {
// 查询全量用户List<CommonUserDto>userDtoList=giteaExService.qryUserDtoList();
// 加载缓存userDtoList.stream()
                .filter(commonUserDto->!ObjectUtils.isEmpty(commonUserDto) &&StringUtils.isNotEmpty(commonUserDto.getEmail()))
                .forEach(commonUserDto-> {
// 构造email缓存emailUserList.put(commonUserDto.getEmail(), Optional.of(commonUserDto));
                });
    }
}   

load方法是缓存失效之后的重新加载逻辑,因为guava cache不允许出现null,所以使用Optional作为容器,设置null;

ehcache

Ehcache主要基于内存缓存,磁盘缓存为辅的,使用起来方便。支持缓存内容存储在磁盘中。

使用方式

引入依赖

<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>2.10.4</version></dependency>

在项目资源目录下新建一个ehcache.xml文件,文件内容参考如下:

<ehcache><diskStorepath = "./cache"/><!-- 默认的管理策略 --><defaultCacheeternal = "false"maxElementsInMemory = "10000"overflowToDisk = "true"diskPersistent = "false"timeToIdleSeconds = "604800"timeToLiveSeconds = "7200"diskExpiryThreadIntervalSeconds = "120"memoryStoreEvictionPolicy = "LRU"/><!-- 此缓存最多可以存活timeToLiveSeconds秒,如果期间超过timeToIdleSeconds秒未访问,缓存失效 --><cachename = "defaultCache"eternal = "false"maxElementsInMemory = "80000"overflowToDisk = "true"diskPersistent = "false"timeToIdleSeconds = "604800"timeToLiveSeconds = "604800"memoryStoreEvictionPolicy = "LRU"/><!-- maxElementsInMemory 内存中最大缓存对象数,看着自己的heap大小来搞 --><!-- eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false --><!-- maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大 --><!-- overflowToDisk:true表示当内存缓存的对象数目达到了maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。--><!-- diskSpoolBufferSizeMB:磁盘缓存区大小,默认为30MB。每个Cache都应该有自己的一个缓存区。--><!-- diskPersistent:是否缓存虚拟机重启期数据  --><!-- diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为120秒 --><!-- timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态 --><!-- timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义 --><!-- memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。--></ehcache>

注入bean的方式构造cacheManager

@ConfigurationpublicclassEhCacheConfig {
/*** 据shared与否的设置,Spring分别通过CacheManager.create()或new CacheManager()方式来创建一个ehcache基地.*/@BeanpublicEhCacheManagerFactoryBeanehCacheManagerFactoryBean() {
EhCacheManagerFactoryBeancacheManagerFactoryBean=newEhCacheManagerFactoryBean();
cacheManagerFactoryBean.setConfigLocation(newClassPathResource("ehcache.xml"));
cacheManagerFactoryBean.setShared(true);
returncacheManagerFactoryBean;
    }
}

写一个缓存工具类

@Component@EnableCachingpublicclassCacheUtils {
privatestaticCachecache;
privatestaticfinalStringCACHE_NAME="defaultCache";
@AutowiredprivateEhCacheCacheManagerehCacheCacheManager;
publicstaticvoidput(Stringkey, Objectvalue) {
put(CACHE_NAME, key, value);
    }
publicstaticObjectget(Stringkey) {
Elementelement=cache.get(key);
if (null!=element) {
returnelement.getObjectValue();
        }
returnelement;
    }
@PostConstructprivatevoidinit() {
EhCacheCacheManagerehCacheCacheManager=ApplicationContextHelper.getBean(EhCacheCacheManager.class);
CacheManagercacheManager=ehCacheCacheManager.getCacheManager();
try {
cache=cacheManager.getCache(CACHE_NAME);
if (cache==null) {
thrownewRuntimeException("当前系统中没有定义“"+CACHE_NAME+"”这个缓存。");
            }
        } catch (Exceptionex) {
ex.printStackTrace();
        }
    }
/*** 写入缓存 通用方法** @param cacheName* @param key* @param value*/privatestaticvoidput(StringcacheName, Stringkey, Objectvalue) {
Elementelement=newElement(key, value);
cache.put(element);
    }
}

以上是两种本地缓存的框架的简单使用,个人使用来看Google的缓存更加简单实用。

相关文章
|
缓存 Java Spring
Spring框架(四) 三级缓存与循环依赖
首先我们需要明白什么是循环依赖 , 打个比方 , 就是说A对象在创建的过程中 , 需要依赖注入B对象 , 但是B对象没有 , 就需要去创建 , 而在创建B对象的过程中又需要注入A对象 , A对象此时还在创建中,所以就构成了一个死循环 , A,B相互依赖 这样的关系被成为循环依赖(当然 , 可能还会有其他的情况),下面我们就来看看Spring是如何让解决循环依赖的
415 0
|
缓存 NoSQL Java
微服务框架(十二)Spring Boot Redis 缓存
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现。 本文为Spring Boot集成Redis。 在这篇文章中,我们将配置一个Spring Boot应用程序示例,并将其与Redis Cache 集成。虽然Redis是一个开源是一个开源内存数据结构存储,用作数据库,缓存和消息代理,但本文仅演示缓存集成。
|
4月前
|
存储 缓存 NoSQL
Spring Cache缓存框架
Spring Cache是Spring体系下的标准化缓存框架,支持多种缓存(如Redis、EhCache、Caffeine),可独立或组合使用。其优势包括平滑迁移、注解与编程两种使用方式,以及高度解耦和灵活管理。通过动态代理实现缓存操作,适用于不同业务场景。
413 0
|
12月前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
749 0
|
8月前
|
缓存 NoSQL Java
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
522 16
Redis应用—8.相关的缓存框架
|
11月前
|
存储 缓存 自然语言处理
SCOPE:面向大语言模型长序列生成的双阶段KV缓存优化框架
KV缓存是大语言模型(LLM)处理长文本的关键性能瓶颈,现有研究多聚焦于预填充阶段优化,忽视了解码阶段的重要性。本文提出SCOPE框架,通过分离预填充与解码阶段的KV缓存策略,实现高效管理。SCOPE保留预填充阶段的关键信息,并在解码阶段引入滑动窗口等策略,确保重要特征的有效选取。实验表明,SCOPE仅用35%原始内存即可达到接近完整缓存的性能水平,显著提升了长文本生成任务的效率和准确性。
575 3
SCOPE:面向大语言模型长序列生成的双阶段KV缓存优化框架
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
1240 24
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
缓存 NoSQL Java
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
Spring Cache 是 Spring 提供的简易缓存方案,支持本地与 Redis 缓存。通过添加 `spring-boot-starter-data-redis` 和 `spring-boot-starter-cache` 依赖,并使用 `@EnableCaching` 开启缓存功能。JetCache 由阿里开源,功能更丰富,支持多级缓存和异步 API,通过引入 `jetcache-starter-redis` 依赖并配置 YAML 文件启用。Layering Cache 则提供分层缓存机制,需引入 `layering-cache-starter` 依赖并使用特定注解实现缓存逻辑。
2810 1
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
|
缓存 分布式计算 Java
详细解读MapReduce框架中的分布式缓存
【8月更文挑战第31天】
275 1
|
存储 缓存 NoSQL
【缓存】J2Cache —— 基于内存和 Redis 的两级 Java 缓存框架的使用方法
【缓存】J2Cache —— 基于内存和 Redis 的两级 Java 缓存框架的使用方法
771 0