Google Guava Cache的使用

news2024/12/27 10:47:20

1、前言

Google Guava Cache是Google Guava库中的一个缓存框架,用于缓存计算结果、数据或资源,提高程序访问效率和响应速度。Guava Cache具有以下特点:

①可配置性:Guava Cache支持多种缓存参数的配置,例如缓存大小、过期时间、访问策略等,可以根据应用场景进行灵活配置。

②基于引用计数的回收策略:Guava Cache使用基于引用计数的回收策略,当缓存对象的引用计数为0时自动回收,避免了内存泄漏。

③多线程安全:Guava Cache是线程安全的,支持并发读写,保证多个线程能安全地访问和操作缓存数据。

④易于使用:Guava Cache提供简单易用的API,可以方便地进行缓存数据的读取、添加、删除和更新操作,降低了开发的难度和复杂度。

2、依赖引入

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>32.1.2-jre</version>
</dependency>

3、缓存

3.1 LoadingCache

import com.google.common.cache.*;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

public class LoadingCacheTest {

    private static final RemovalListener<String,String> listener = notification -> System.err.println("remove key:" + notification.getKey());

    private static LoadingCache<String, String> loadingCache = CacheBuilder
            .newBuilder()
            .maximumSize(2) // 缓存的个数
            .removalListener(listener) // 移除缓存时的监听事件
            .build(new CacheLoader<String, String>() {
                @Override
                public String load(String key) {  
                    return key.toUpperCase(Locale.ROOT);
                }
            });
    
    public static void main(String[] args) throws Exception {
        System.out.println("a的缓存:" + loadingCache.get("a"));
        System.out.println("b的缓存:" + loadingCache.get("b"));
        loadingCache.put("c", "C");
        System.out.println("c的缓存:" + loadingCache.get("c"));
    }

}

运行结果:

 

 这里设置的最大缓存个数是2,当缓存第三个的时候,就会出发移除缓存的监听事件,因此结果打印了remove key。

可以设置缓存过期时间expireAfterWrite:

import com.google.common.cache.*;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

public class LoadingCacheTest {

    private static final RemovalListener<String,String> listener = notification -> System.err.println("remove key:" + notification.getKey());

    private static LoadingCache<String, String> loadingCache = CacheBuilder
            .newBuilder()
            .maximumSize(5)
            .removalListener(listener)
            .expireAfterWrite(2,TimeUnit.SECONDS)
            .build(new CacheLoader<String, String>() {
                @Override
                public String load(String key) {
                    return key.toUpperCase(Locale.ROOT);
                }
            });

    public static void main(String[] args) throws Exception {
        System.out.println("a的缓存:" + loadingCache.get("a"));
        System.out.println("b的缓存:" + loadingCache.get("b"));
        Thread.sleep(3000);
        loadingCache.put("c", "C");
        System.out.println("c的缓存:" + loadingCache.get("c"));
    }

}

运行结果:

 

 

3.2 Cache

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.concurrent.ExecutionException;

public class CacheTest {

    private static Cache<String, String> cache = CacheBuilder.newBuilder().
            maximumSize(10).build();


    public static void main(String[] args) throws ExecutionException {
        cache.put("a", "A");
        System.out.println("cache key a value:" + cache.getIfPresent("a"));
        // 删除值
        cache.invalidate("a");
        System.out.println("invalidate后cache.getIfPresent(a):" + cache.getIfPresent("a"));
        // 添加值
        cache.put("b", "B");
        System.out.println("put后cache.getIfPresent(b):" + cache.getIfPresent("b"));
    }
}

运行结果:

 Cachey也可以设置监听、过期时间等:

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

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

public class CacheTest {
    private static final RemovalListener<String,String> listener = notification -> System.err.println("remove key:" + notification.getKey());


    private static Cache<String, String> cache = CacheBuilder.newBuilder()
            .maximumSize(10)
            .expireAfterWrite(2, TimeUnit.SECONDS)
            .removalListener(listener)
            .build();


    public static void main(String[] args) throws ExecutionException, InterruptedException {
        cache.put("a", "A");
        System.out.println("cache key a value:" + cache.getIfPresent("a"));
        Thread.sleep(3000);
        // 添加值
        cache.put("b", "B");
        System.out.println("put后cache.getIfPresent(b):" + cache.getIfPresent("b"));
    }
}

运行结果:

相关文档:https://github.com/google/guava/wiki/CachesExplained

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/913834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全流程R语言Meta分析核心技术教程

详情点击链接&#xff1a;全流程R语言Meta分析核心技术教程 一&#xff0c;Meta分析的选题与检索 1、Meta分析的选题与文献检索 1)什么是Meta分析&#xff1f; 2)Meta分析的选题策略 3)精确检索策略&#xff0c;如何检索全、检索准 4)文献的管理与清洗&#xff0c;如何制定文…

【Winform学习笔记(八)】通过委托实现跨窗体传值

通过委托实现跨窗体传值 前言正文1、委托及事件2、通过委托实现跨窗体传值的步骤1.在子窗体中定义委托2.在子窗体中声明一个委托类型的事件3.调用委托类型事件4.在实例化子窗体后&#xff0c;子窗体订阅事件接受方法5.实现具体的事件 3、具体示例4、完整代码5、实现效果 前言 …

cesium官网链接打不开

经常遇到cesium官网的某些链接打不开的情况 比如下面是一个cesium官网的blog链接 https://cesium.com/blog/2015/08/10/Introducing-3D-Tiles/ 可是打不开 解决办法&#xff1a; 把url中所有大写的字母都改成小写 大写的地方用黑体标出&#xff1a;Introducing-3D-Tiles …

SAP SPL(Special Ledger)之注释行项目-Noted Items

财务凭证过账里常见的SPL特殊总账标识根据业务主要有三种&#xff0c;BoE-billing of exchange: 汇票业务&#xff0c;包括商业汇票和银行汇票&#xff1b;Down Payment&#xff0c;预付款业务&#xff0c;包括供应商和客户预付款和申请&#xff1b;其它&#xff0c;一般是保证…

2022年12月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;鸡兔同笼 一个笼子里面关了鸡和兔子(鸡有2只脚&#xff0c;兔子有4只脚&#xff0c;没有例外)。已经知道了笼子里面脚的总数a&#xff0c;问笼子里面至少有多少只动物&#xff0c;至多有多少只动物。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入…

高压放大器在液晶弹性体中的应用研究

液晶弹性体是一种有机高分子材料&#xff0c;具有良好的可控变形性能和反应速度&#xff0c;因此在显示器、光学器件等领域得到了广泛的应用。高压放大器作为一种电子设备&#xff0c;可以将输入信号进行放大&#xff0c;从而为液晶弹性体的驱动提供足够的强度。下面安泰电子将…

安捷伦DSO9404A示波器

DSO9404A DSO9404A 是 Agilent 的 4 GHz、4 通道数字示波器。随时间测量电子电路或组件中的电压或电流信号&#xff0c;以显示幅度、频率和上升时间等。应用包括故障排除、生产测试和设计。 壹捌叁贰零玖壹捌陆伍叁 附加的功能&#xff1a; 带宽&#xff1a;4 GHz 4个频道 大…

连接校园网或需要认证的网,认证页面弹不出来解决方案

网络设置 在设置中&#xff0c;找到网络和Internet&#xff1b; 左侧选择状态&#xff0c;右侧选择更改适配器选项&#xff1b; 选择需要认证的那个适配器 右键打开属性 勾上ipv4 和 ipv6 (ipv6 不是必须的) 打开ipv4的属性 按照如下进行设置 关闭代理 发现认证…

MySQL详细安装与配置

免安装版的Mysql MySQL关是一种关系数据库管理系统&#xff0c;所使用的 SQL 语言是用于访问数据库的最常用的 标准化语言&#xff0c;其特点为体积小、速度快、总体拥有成本低&#xff0c;尤其是开放源码这一特点&#xff0c;在 Web 应用方面 MySQL 是最好的 RDBMS(Relation…

lab5 lazy

文章目录 Eliminate allocation from sbrk()Lazy allocationtaskhints实现 Lazytests and Userteststaskhints实现 Eliminate allocation from sbrk() 第一个任务是去阻止sysproc.c中的sys_sbrk()函数真的分配内存&#xff0c;只需要增p->sz即可 一行代码注释即可 uint64…

mysql between and 和 大于小于的区别

1&#xff09;表达式 between 下界值 and 上界值 ——限定"表达式"的值介于"下界值"到"上界值"之间的所有值&#xff0c;并且包含"下界值"和"上界值"&#xff1b; 2&#xff09;表达式 >下界值 and 表达式<上界值 ——…

Win11点击鼠标右键,“新建”选项消失的解决方法

更新了Win11后&#xff0c;我发现当我想在桌面新建一个文件夹、文本文档或者Word、Excel的时候&#xff0c;却没有“新建”选项&#xff0c;很是苦恼&#xff0c;只能通过文件资源管理器进行新建操作。 试了很多方法&#xff0c;终于找到个有用的。 以管理员运行cmd&#xff…

电脑怎么设置智能提醒?如何让电脑自动提醒我?

对于大多数上班族来说&#xff0c;因为日常的工作任务比较繁琐&#xff0c;且和各种琐事交织在一起&#xff0c;非常容易造成日程安排的混乱&#xff0c;这时候容易忘记各种工作任务也就是司空见惯了。为了尽可能不遗漏重要的工作任务&#xff0c;把每天的工作日程安排的井井有…

运维作业6

1.安装docker服务&#xff0c;配置镜像加速器 1&#xff09;添加docker-ce源信息 [rootserver ~]# yum install yum-utils device-mapper-persistent-data lvm2 -y [rootserver ~]# yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/cento…

# Lua与C++交互(二)———— 交互

C 调用lua 基础调用 再来温习一下 myName “beauty girl” C想要获取myName的值&#xff0c;根据规则&#xff0c;它需要把myName压入栈中&#xff0c;这样lua就能看到&#xff1b;lua从堆栈中获取myName的值&#xff0c;此时栈顶为空&#xff1b;lua拿着myName去全局表中查…

经纬恒润再次入选教育部产学研合作协同育人企业

近日&#xff0c;教育部高等教育司组织的产学合作协同育人项目组公布了2023年度产学合作协同育人项目指南通过企业名单。经纬恒润再次入选&#xff0c;此次共获批37个项目&#xff0c;其中有25个师资培训项目&#xff0c;12个实践条件建设和实践基地建设项目。 产学合作协同育人…

【C++】UDP通信,实现文件的传输

目录 1 TCP与UDP比较 2 UDP 3 通信流程 4 实践 5 运行结果 1 TCP与UDP比较 2 UDP简介 UDP通信是无连接的,因此不需要

8-模板复用

一. 模板复用方法和前置条件 1. 语法: {% block 名字 %}{% endblock %} 2. 三种方法: (1). 模板继承 * (2). include (3). 宏 3. 前置条件: (1). 多个模板具有相同的顶部和底部 (2). 多个模板具有相同的模板内容,但是内容中部分不一样 (3). 多个模板具有完全…

MAYA粒子基础_发射器和粒子碰撞

创建nParticle泛向发射器 创建nParticle方向发射器 体积发射器 创建火花 曲面发射器 曲线发射 粒子碰撞 碰撞层 碰撞 碰撞层都是0 不碰撞 白0 红1 1 0

关于ros工作空间devel下setup.bash的理解

在创建了ros的工作空间之后 在工作空间的devel文件夹中存在几个setup.*sh形式的环境变量设置脚本 使用source命令运行这些脚本文件&#xff0c;则工作空间的环境变量设置可以生效&#xff08;如可以找到该工作空间内的项目&#xff09;。 source devel/setup.bash 设置环境变量…