Guava cache

Guava cache
1. 什么是Guava cache
Guava是google开源的一个java框架包,其中有很多java工具包,Guava cache就是该框架包中的一个工具包,通过Guava cache包可以实现一些简单的缓存功能,可以将一些常用数据进行本地缓存。

2. Guava cache的案例使用
如当我们在做web开发的时候,有些固定数据更新的不频繁(如系统配置,模板数据等),为了提高系统性能,往往我们都会讲这些数据预加载到本地内存中,这样做可以减少系统访问数据库或读取本地文件数据的io操作时间,从而提高系统性能,降低数据库访问压力。

有这样一个场景,当web应用前台发生一个事件后需要系统给相应人员一个邮件通知,传统做法就是事件发生后调用通知功能,通知功能加载邮件模板数据(假设从数据库中查取),根据模板数据构建好邮件内容,在调用邮件通知功能发送邮件。在上面的应用场景中,我不谈你的事件调用如何去优化,如何去自动监听事件通知,我在这里只是想要一个不能在普通的场景来说明Guava cache的使用。在该场景中,通知功能查取邮件模板数据,这个步骤我们可以使用Guava cache将数据库数据查取到本地缓存中,这样做有两个好处,一是程序执行效益更高,直接访问内存数据,二是减少数据库访问压力,数据访问的时候就不在去频繁的访问数据库,只有cache不存在该数据的时候才去访问数据库,当然我们也可以根据自己的需要构建不同策略的cache。听起来有点像memcached,但是他比memcached轻量级多了,只需要在你的工程中加入一个jar,就可以像使用java API一样优雅。当然有的同学也会使用Map做缓存,但是Map做缓存是不可控的,如什么时候去刷新缓存,如何控制缓存策略等Map都不能提供这些功能,但Guava cache可以做到。听到这里是不是很心动啊,废话就不多了,下面就进入Guava cache正题。

Guava cache的缓存实现有两种方式:
(1) CacheLoader
(2) Callable

CacheLoder实现cache

package com.test.cache;

/**
*
* @author xmong
* 缓存配置常量接口
*
*/
public interface CacheConfig {

//配置缓存条目的大小
public int maximumSize = 10;
//配置数据加载到缓存后的刷新时间
public int refreshAfterWrite = 12;
//配置数据加载到缓存后的移除时间
public int expireAfterWrite = 12;


}


package com.test.cache;

import java.util.concurrent.TimeUnit;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

/**
*
* @author xmong
* 缓存存储的数据形式是key,value存储,
* 为了使缓存比较通用,构建了一个抽象缓存父类,实现了一个缓存的模板
* key和value都使用泛型,使得子类可以缓存多种类型的数据
* 子类只需要实现getCacheData(key)方法,获取缓存数据即可
* @param <K> 缓存的key类
* @param <V> 缓存的value类
*/
public abstract class AbstractLoadCache <K, V>{


/**
* 数据缓存的构建
*/
LoadingCache<K, V> cache = CacheBuilder.newBuilder()
//设计缓存条目
.maximumSize(CacheConfig.maximumSize)
//设计刷新时间
.refreshAfterWrite(CacheConfig.refreshAfterWrite, TimeUnit.HOURS)
.build(new CacheLoader<K, V>(){

@Override
public V load(K key) throws Exception {
//执行缓存数据方法获取数据
return getData(key);
}

});

/**
* 抽象方法,执行缓存数据
* @param key
* @return
*/
public abstract V getData(K key);


public LoadingCache<K, V> getCache() {
return cache;
}

public void setCache(LoadingCache<K, V> cache) {
this.cache = cache;
}



}



package com.test.cache;

import java.util.concurrent.ExecutionException;

/**
*
* @author xmong
* 实现缓存数据类
*/
public class CacheLoadData extends AbstractLoadCache<String, String> {

@Override
public String getData(String key) {
//执行获取缓存数据方法体
System.out.println("getData method...");
//返回缓存数据
return "{key:"+key+",value:"+key+"}";
}

public static void main(String[] args) {
CacheLoadData cacheLoadData = new CacheLoadData();
try {
/**
* 循环多次调用缓存数据
*/
for (int i = 0; i < 5; i++) {
String str = cacheLoadData.cache.get("xmong");
System.out.println(str);
}
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}


执行结果:
getData method...
{key:xmong,value:xmong}
{key:xmong,value:xmong}
{key:xmong,value:xmong}
{key:xmong,value:xmong}
{key:xmong,value:xmong}


从执行结果可以看出获取数据方法体只在第一次调用缓存的时候执行了一次,后面的多次的调用都是取缓存中的数据。


Callable实现cache

package com.test.cache;


import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

/**
*
* @author xmong
*
* @param <K> 缓存的key类
* @param <V> 缓存的value类
* @param <T> 缓存的数据参数类
*/
public abstract class AbstractCallCache<K, V, T>{


/**
* 创建缓存,设置缓存数据大小,设置缓存刷新时间
*/
public Cache<K, V> cache = CacheBuilder.newBuilder()
//缓存数据的条目
.maximumSize(CacheConfig.maximumSize)
//根据键值对被创建或值被替换后多少时间后移除
.expireAfterWrite(CacheConfig.expireAfterWrite, TimeUnit.HOURS)
.build();

/**
* 根据key获取缓存数据
* @param key
* @param t
* @return
*/
public V getCacheData(final K key, final T t){
try {
return cache.get(key, new Callable<V>() {

public V call() throws Exception {
//执行缓存数据方法
return getData(key, t);
}
});
} catch (ExecutionException e) {
e.printStackTrace();
return null;
}
}

/**
* 抽象方法,根据参数加载数据
* @param key 缓存的key值
* @param t 加载数据的参数
* @return v
*/
public abstract V getData(K key, T t);



public Cache<K, V> getCache() {
return cache;
}

public void setCache(Cache<K, V> cache) {
this.cache = cache;
}

}



package com.test.cache;

/**
* callcache的实现
* @author xmong
*
*/
public class CacheCallData extends AbstractCallCache<String, String, String>{

@Override
public String getData(String key, String t) {
//执行获取缓存数据方法体
System.out.println("getData method...");
//返回缓存数据
return "{key:"+key+", value:"+key+", args:"+t+"}";
}

public static void main(String[] args) {
CacheCallData cacheCallData = new CacheCallData();
//循环多次调用缓存数据
for (int i = 0; i < 5; i++) {
String str = cacheCallData.getCacheData("xmong", "args");
System.out.println(str);
}
}

}


执行结果:

getData method...
{key:xmong, value:xmong, args:args}
{key:xmong, value:xmong, args:args}
{key:xmong, value:xmong, args:args}
{key:xmong, value:xmong, args:args}
{key:xmong, value:xmong, args:args}



3.Guava cache相关说明
Springboot集成Guava Cache 一、首先导入依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.6-jre</version> </dependency> 二、guava的配置,那个24指的是24小时 阅读详情

相关推荐

Caffeine 与 Guava Cache

Caffeine 与 Guava Cache 一、概要 1.1 背景 在项目开发中,为提升系统性能,减少 IO 开销,本地缓存是必不可少的。最常见的本地缓存是 Guava 和 Caffeine,Caffeine 是基于 Google Guava Cache 设计经验改进的结果,相较于 Guava 在性能和命中率上更具有效率。 1.2 应用场景 愿意消耗一些内存空间来提升速度 预料到某些键会被多次查询 缓存中存放的数据总量不会超出内存容量 二、Guava Cache 2.1 Guava Cache缓存回收 (

weixin_44131265的博客 1792

Guava Cache的使用方式

介绍了Guava的使用方式,以及它的核心类的介绍

凉茶铺的博客 6527

Caffeine Cache 和 Guava Cache的对比

Spring Boot 1.x版本中的默认本地缓存是Guava Cache。在 Spring5 (SpringBoot 2.x) 后,Spring 官方放弃了 Guava Cache 作为缓存机制,而是使用性能更优秀的 Caffeine 作为默认缓存组件,这对于Caffeine来说是一个很大的肯定。

程序员野蛮成长 1450

Guava Cache基本使用

前言: Guava 学习笔记,参考自Google Guava官方文档。 Guava Cache 文章目录前言:Guava CacheCache的回收机制基于容量回收基于定时回收基于引用类型回收具体功能使用加载 CacheLoaderCallable显式插入元素移除监听器 removalListenerasMap视图测试代码 Cache的回收机制 既然是缓存,那么总会存在没有足够的内存缓存所有数据。Cache提供三大类回收机制。 基于容量回收 如果要规定缓存项的数目不超过固定值,只需使用CacheBu

awake_lqh的博客 1091

guava cache 缓存Demo

今天项目,老大让我写个缓存机制,又不让用Spring自带的,于是乎我就自己疯狂的找了一下,先说下缓存的原理把 缓存:咱们就大白话把,缓存存在的意义是时间换空间,用内存来换取时间的速度,加快查找,等速度, 如果往深了说,就会涉及到高速缓存区,CPU缓存等等,这个有兴趣的人可以去学习一下,我就给大家放一张我认为符合的图把 这个呢,是CPU和内存之间,其实内存缓存和数据库交互也是这样的道理,就...

天才周的博客 1093

guava之guava cache

caffine的原文翻译 https://segmentfault.com/a/1190000008751999 细读这个:https://www.chinacion.cn/article/5629.html Count-Min Sketch算法,就是BloomFilter的升级版本,BloomFilter是判断一个对象存在or不存在的,Count-Min Sketch是用来记录一个对象的次数的。BloomFilter的问题,也同样存在Count-.

sinat_14913533的博客 1807

缓存分享(1)——Guava Cache原理及最佳实践

Guava Cache最佳实践

麦田里的码农 7588

Java工具库Guava本地缓存Cache的使用、回收、刷新、统计等示例

在上面引入Guava的基础上。学习其本地缓存Cache的使用。缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存。通常来说,Guava Cache 适用于:1、你愿意消耗一些内存空间来提升速度。2、你预料到某些键会被查询一次以上。3、缓存中存放的数据总量不会超出内存容量。(Guava Cache 是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。)注:博客:关注公众号霸道的程序猿。

BADAO_LIUMANG_QIZHI的博客 6477

Guava Cache之Cache接口

1、通过put或putAll手动向Cache中添加数据,guava不缓存value是null的key。我们可以在系统启动的时候,就将某些数据手动放入缓存中,这样就可以避免系统启动后,第一个用户访问缓存不能命中的情况。2、通过getIfPresent/getAllPresent/get读取缓存中的数据。3、如果明确知道某些缓存无用,我们可以通过invalidate/invalidateAll删除。4、通过调用cleanUp执行缓存清理操作,比如删除过期的key。

aty 5453

VMware虚拟机安装MS-DOS 7.10教程

dos安装教程dos版本7.10附下载链接。

Minecraft_xiaole的博客 1万+

STM32F103中GPIO_Remap1_CAN1与GPIO_Remap2_CAN1的配置差异与应用场景解析

本文深入解析了STM32F103中GPIO_Remap1_CAN1与GPIO_Remap2_CAN1的配置差异与应用场景。通过剖析AFIO_MAPR寄存器,明确了两者在引脚映射(PB8/PB9 vs PD0/PD1)和适用封装上的区别,并提供了详细的配置步骤、常见陷阱排查及基于项目需求的选型指南,帮助开发者高效完成CAN引脚重映射。

u6v7w8x的博客 394

guava cache详细介绍

官方文档:https://github.com/google/guava/wiki/CachesExplained guava cache是google开源的一款本地缓存工具库,它的设计灵感来源于ConcurrentHashMap,使用多个segments方式的细粒度锁,在保证线程安全的同时,支持高并发场景需求,同时支持多种类型的缓存清理策略,包括基于容量的清理、基于时间的清理、基于引用的清理等。 <dependency> <groupId>com.google.gua

赶路人儿 1万+

从OSGB到3DTiles:倾斜摄影数据高效转换实战指南

本文提供了将倾斜摄影OSGB数据高效转换为Web友好的3DTiles格式的完整实战指南。详细介绍了使用开源工具进行转换的步骤,包括环境搭建、核心命令、参数调优及在Cesium中加载与问题排查,旨在帮助GIS开发者和三维应用工程师打通数据到Web展示的最后一公里,实现大规模三维模型的流畅网络发布。

u0v1w2x3的博客 570

高并发之——Guava Cache

最近需要用到缓存来存放临时数据,又不想采用Redis,Java自带的Map功能太少,发现Google的Guava提供的Cache模块功能很强大,于是选择使用它。 本地缓存 本地缓存作用就是提高系统的运行速度,是一种空间换时间的取舍。它实质上是一个做key-value查询的字典,但是相对于我们常用HashMap它又有以下特点: 1.并发性:由于目前的应用大都是多线程的,所以缓存需要支持并发的写...

冰河的专栏 6823

VN1640 CH5 I/O通道终极指南:【从硬件原理—>工程实战—>自动化测试实战】

摘要:本文详细解析Vector VN1640 CH5 I/O通道的硬件原理与工程应用,涵盖模拟输入(AIN)、数字输入(DIN)和数字输出(DOUT)三大功能模块的配置指南。通过硬件隔离设计实现高精度信号采集与驱动控制,重点分析开漏输出特性及保护机制。提供PWM控制、ECU上电时序测试、传感器闭环控制等实战案例的CAPL脚本代码,并强调多设备同步采集的精准性(时间偏差<1µs)。适用于汽车电子HIL测试、ECU信号监测等场景,所有方案均通过实际项目验证。

汽车控制器系统开发、VIL测试、HIL测试、MIL测试、EMS电喷系统标定与开发、热管理系统标定 760

SpringBoot实战教程-springboot概论

Spring Boot 是一个快速开发框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,以及自动配置。内置web容器,帮助开发者能够实现快速开发,简化了应用系统的初始搭建以及开发过程。

鸟哥哥的专栏 4155

Guava Cache用法介绍

一、Guava是什么 Guava是一种基于开源的Java库,Google Guava源于2007年的"Google Collections Library"。这个库是为了方便编码,并减少编码错误。这个库用于提供集合,缓存,支持原语句,并发性,常见注解,字符串处理,I/O和验证的实用方法。 二、Guava Cache是什么 Guava cache是谷歌的Guva提供的cache模块,目前被常用...

格色情调的博客 1364

AXI2APB_bridge 设计

此处研究AHB Slave到 APB master的桥接器,实现接口转化,例如下图之后是参数描述

Starry__的博客 4037

深入解析 Guava Cache

通过解析 Guava Cache 的实现原理,我们发现 Guava LocalCache 与 ConcurrentHashMap 有以下不同:ConcurrentHashMap ”分段控制并发“是隐式的(实现中没有Segment对象),而 LocalCache 是显式的。在 JDK 1.8 之后,ConcurrentHashMap 采用实现:当 put 的元素在哈希桶数组中不存在时,直接 CAS 进行写操作;在发生哈希冲突的情况下使用 synchronized 锁定头节点。

Program_san的博客 2401

Slow waitForAckedSeqno took 64873ms (threshold=30000ms). File being written

Slow waitForAckedSeqno took 64873ms (threshold=30000ms). File being written

zhengzaifeidelushang的博客 2011

OpenHarmony之Histreamer引擎深度解析:pipeline_core架构如何全面取代GStreamer,一统音视频播放与录制

Histreamer是OpenHarmony多媒体框架的核心媒体引擎,采用架构设计。一个轻量级的媒体引擎组件,提供播放、录制等场景的媒体数据流水线处理。1.播放场景分为如下几个节点:数据源读取、解封装、解码、输出;2.录制场景分为如下几个节点:数据源读取、编码、封装、输出。该引擎从OH5.0开始取代了原有的媒体引擎gstreamer(部分文档还保留较老架构的讲解),提供统一的音视频播放、录制、元数据解析等能力。

m0_67505153的博客 333

Guava Cache

本文介绍了本地缓存与远程缓存的区别,重点分析了Guava Cache的特性与使用方法。Guava Cache是Google提供的本地缓存解决方案,支持自动加载、过期策略和多种淘汰机制。文章详细说明了其核心配置参数,包括容量控制(初始容量、最大条目数/权重)、并发级别、过期策略(写入/访问后过期)、引用类型(弱/软引用)以及统计功能。通过代码示例展示了如何初始化缓存、设置容量限制、添加移除监听器,并详细讲解了四种缓存清除策略:基于存活时间(写入/访问后过期)、基于容量(LRU淘汰)、基于权重(通过Weighe

小熙的博客 1280

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Guava cache缓存实践

在我们日常开发中,如果某些数据会频繁的进行读取,并且很少会做修改,我们一般会对这些数据进行缓存,来提高读取的速度。 使用缓存之所以能提高性能,是因为读取的速度比从磁盘或数据库中读取的速度更高。 但是使用缓存并不是全部都是好处,因为存放缓存数据的空间一般都是CPU内存,或者Redis等,它们的空间更宝贵,是典型的空间换时间,所以需要放到缓存中的数据应该是.

小黑说Java 598

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Guava Cache的创建方法

Guava -Cache   概述 缓存是日常开发中经常应用到的一种技术手段,合理的利用缓存可以极大的改善应用程序的性能。  Guava官方对Cache的描述连接  缓存在各种各样的用例中非常有用。例如,当计算或检索值很昂贵时,您应该考虑使用缓存,并且不止一次需要它在某个输入上的值。  缓存ConcurrentMap要小,但不完全相同。最根本的区别在于一个ConcurrentMap坚持所有添加到...

见习程序员的成长之路! 676

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: java annotation注解
下一篇: Memo class备注类信息
xmong
博客等级 码龄19年 33粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值