java 非常好用的一个缓存(Google Guava的Cache)

         基本每个web项目都少不了缓存,通常很时候都会选择redis作缓存,或者自己用map轻松实现,但上面这两种缓存有时满足不了需求,有时觉得redis作缓存有点重,而map手功实现又太轻或功能不足时(缓存时过期实现),此时选googleCache是一个不错的选择,它不仅使用简单而且功能也丰富。

1 引入googleCache包:

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

2 googleChache代码:

  代码实现很简单,参数根据自己的项目情况调整 如下: 

/*** MemCacheServiceImpl用于提供内存缓存服务的实现类* 使用Google Guava库中的CacheBuilder创建缓存对象*/
@Service
public class MemCacheServiceImpl {// 内存缓存对象,使用Google Guava的CacheBuilder进行配置和构建private static Cache<String, Object> cache = CacheBuilder.newBuilder().initialCapacity(500)              // 初始容量.maximumSize(2000)                 // 最大容量,超过时按LRU(最近最少使用)算法清除缓存项.concurrencyLevel(8)               // 并发级别,用于并发访问控制.expireAfterWrite(2, TimeUnit.MINUTES) // 写入后过期时间,单位为分钟.build();/*** 将键值对存入缓存** @param key   缓存键* @param value 缓存值*/public void put(String key, Object value) {cache.put(key, value);}/*** 根据键获取缓存值** @param key 缓存键* @return 对应的缓存值,如果不存在则返回null*/public Object get(String key) {return cache.getIfPresent(key);}
}

3 应用场景

      在项目本身项目已使用redis做了全局缓存了,但redis做缓存对于小的数据量反应很快,大一点的数据会相对慢一些,如果拿来来的数据还要做处理,如还原对象,这本般也浪费时间,在这过程再加多一个内存缓存就更完美了,如以下代码:

/*** 获取所有充电桩枪关系列表** @return ChargePoleRelationGun对象列表*/
public List<ChargePoleRelationGun> getGunList() {// 定义缓存键String cacheKey = "All_GNG";List<ChargePoleRelationGun> list;// 从缓存中获取对象Object obj = MemCacheServiceImpl.getObj(cacheKey);// 如果缓存中有对象并且不为空,则直接返回if (obj != null && !(list = (List<ChargePoleRelationGun>) obj).isEmpty()) {return list;}// 从Redis中获取所有符合模式的keySet<String> keys = stringRedisTemplate.keys("t_chargePoleRelationGun:*");// 如果Redis中没有符合模式的key,则返回空列表if (keys.isEmpty()) {return Collections.emptyList();}// 将获取的key集合转为列表,然后通过Redis模板批量获取对应的值列表List<String> keyList = new ArrayList<>(keys);List<String> values = stringRedisTemplate.opsForValue().multiGet(keyList);// 初始化结果列表list = new ArrayList<>();// 记录开始时间,用于性能统计long xStart = System.currentTimeMillis();// 遍历获取的值列表,解析为ChargePoleRelationGun对象并加入结果列表for (int i = 0; i < keyList.size(); i++) {//String key = keyList.get(i);String storedValue = values.get(i);// 解析JSON字符串为ChargePoleRelationGun对象ChargePoleRelationGun value = JSONObject.parseObject(storedValue, ChargePoleRelationGun.class);// 如果解析成功且枪号不为空,则将对象加入结果列表if (value != null) {if (StringUtil.isNotNull(value.getGunNo())) {list.add(value);}}}// 打印性能统计信息System.out.println("time -> " + (System.currentTimeMillis() - xStart));// 根据充电桩ID排序结果列表list.sort(Comparator.comparing(ChargePoleRelationGun::getPoleId));// 将结果列表放入缓存MemCacheServiceImpl.putObj(cacheKey, list);// 返回结果列表return list;
}

4 扩展资料

         Guava 是一个 Google 开发的开源 Java 库,包含了大量工具类和常用功能,可以帮助开发人员提高开发效率和代码质量。Guava 的工具类可以分为以下几类:

  • 集合工具类:包含了 Lists、Sets、Maps 等集合工具类,提供了丰富的集合操作方法,可以简化集合操作的代码。
  • 缓存工具类:包含了 CacheBuilder、CacheLoader 等缓存工具类,可以帮助开发人员实现高效的缓存。
  • 原生类型支持:包含了 Primitives、Longs、Ints 等原生类型支持类,提供了原生类型的常用操作方法。
  • 并发性工具类:包含了 ConcurrentMap、Semaphore、CountDownLatch 等并发性工具类,可以帮助开发人员实现安全、高效的并发编程。
  • 常见注解:包含了 NotNull、Nullable 等常见注解,可以帮助开发人员进行代码规范检查。
  • 字符串处理:包含了 Joiner、Splitter 等字符串处理工具类,可以帮助开发人员简化字符串处理的代码。
  • IO 流工具类:包含了 Files、Resources、ByteStreams 等 IO 流工具类,可以帮助开发人员简化 IO 流操作的代码。

Guava 工具类的一些常用用例:

  • 使用集合工具类简化集合操作的代码。例如,使用 Lists.newArrayList() 方法可以创建一个空的 List,使用 Lists.asList() 方法可以将一个数组转换为一个 List。
  • 使用缓存工具类实现高效的缓存。例如,使用 CacheBuilder 可以创建一个缓存,使用 CacheLoader 可以实现缓存数据的自动加载。
  • 使用原生类型支持简化原生类型的操作。例如,使用 Longs.compare() 方法可以比较两个 long 值。
  • 使用并发性工具类实现安全、高效的并发编程。例如,使用 ConcurrentMap 可以实现线程安全的 Map。
  • 使用常见注解进行代码规范检查。例如,使用 NotNull 注解可以检查方法参数是否为非空。
  • 使用字符串处理工具类简化字符串处理的代码。例如,使用 Joiner.on(", ") 方法可以将多个字符串用逗号连接起来。
  • 使用 IO 流工具类简化 IO 流操作的代码。例如,使用 Files.readAllBytes() 方法可以读取一个文件的所有字节。

Guava 工具类可以帮助开发人员提高开发效率和代码质量,是 Java 开发人员必备的工具。

 

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

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

相关文章

NB-IOT、4G-LTE信号优劣判定参考指标

名词释意 &#xff08;1&#xff09;RSRP&#xff1a;信号接收功率&#xff0c;反映当前路径信道损耗程度&#xff0c;主要作为小区覆盖的测量和小区重选重要依据. &#xff08;2&#xff09;RSRQ&#xff1a;信号接收质量&#xff0c;反映当前路径网络负荷及干扰变化点&#x…

【XML】TinyXML 详解

1、简介 优点&#xff1a; TinyXML 是一个简单、小型的 C XML 解析器&#xff0c;可以轻松集成到项目中。 TinyXML 解析 XML 文档&#xff0c;并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的&#xff0c;因此可以在开源或商业代码中…

【Flink-Kafka-To-ClickHouse】使用 Flink 实现 Kafka 数据写入 ClickHouse

【Flink-Kafka-To-ClickHouse】使用 Flink 实现 Kafka 数据写入 ClickHouse 1&#xff09;导入相关依赖2&#xff09;代码实现2.1.resources2.1.1.appconfig.yml2.1.2.log4j.properties2.1.3.log4j2.xml2.1.4.flink_backup_local.yml 2.2.utils2.2.1.DBConn2.2.2.CommonUtils2.…

zynqmp Linux + 裸机 (A53-0 Linux,A53-1 2 3 裸机大数据量实时处理,R5-0 协议处理,R5-1 屏幕显示逻辑等)填坑笔记

fpga 和arm 采用预留内存的方式&#xff0c;采用neon 协处理器只能做到 250M/S 的速度&#xff0c;预留内存采用mmap的方式&#xff0c;当读取内存页的时候采用缺页中断的方式&#xff0c;导致速度拖沓而且预留内存没有进行Linux系统的内存管理&#xff08;在系统内 memcpy的速…

使用代理服务器和Beautiful Soup爬取亚马逊

概述 Beautiful Soup 是一个用于解析 HTML 和 XML 文档的 Python 库&#xff0c;它能够从网页中提取数据&#xff0c;并提供了一些简单的方法来浏览文档树、搜索特定元素以及修改文档的内容。在本文中&#xff0c;我们将介绍如何使用代理服务器和Beautiful Soup库来爬取亚马逊…

融资项目——vue之双向数据绑定

上一篇文章中使用的v-bind是单向绑定方法&#xff0c;即数据改变&#xff0c;网页相应的视图发生改变&#xff0c;但是网页视图发生改变其相关联的数据不会发生改变。但是双向数据绑定不同之处在于网页视图发生改变其相关联的数据也会发生改变。Vue可以使用v-model进行双向数据…

【SpringBoot快速入门】(1)SpringBoot的开发步骤、工程构建方法以及工程的快速启动详细讲解

目录 SpringBoot简介1 SpringBoot快速入门1.1 开发步骤1.1.1 创建新模块1.1.2 创建 Controller1.1.3 启动服务器1.1.4 进行测试 2 对比3 官网构建工程3.1 进入SpringBoot官网3.2 选择依赖3.3 生成工程 4 SpringBoot工程快速启动4.1 问题导入4.2 打包4.3 启动 之前我们已经学习的…

C++20形式的utf-8字符串转宽字符串,不依赖编译器编码形式

默认的char[]编码都是要看编译器编译选项的&#xff0c;你选了ANSI那它就是ANSI&#xff0c;你选了UTF8那它就是UTF8. 【注意&#xff1a;经典DevC只支持ANSI编码&#xff08;痛苦&#xff09;&#xff1b;上图是小熊猫DevC&#xff0c;则有这个选项】 这一点对我的代码造成了…

DevOps系列文章 : 使用dpkg命令打deb包

创建一个打包的目录&#xff0c;类似rpmbuild&#xff0c;这里创建了目录deb_build mkdir deb_build目标 我有一个hello的二进制文件hello和源码hello.c, 准备安装到/opt/helloworld目录中 步骤 在deb_build目录创建一个文件夹用于存放我的安装文件 mkdir helloworld在he…

js中实现vue2-org-tree添加自定义拖拽功能

一. 主要思路 1.1通过绑定自定义的指令&#xff0c;获取需要拖动的父子元素&#xff0c; 1.2.添加鼠标按下事件onmousedown&#xff0c;计算出鼠标的相对位置odiv.offsetLeft与odiv.offsetTop&#xff0c; 1.3.鼠标移动事件onmousemove当鼠标移动时触发&#xff0c;移动的时…

前端面试题(计算机网络):options请求方法及使用场景

OPTIONS请求方法及使用场景 回答思路&#xff1a;什么是options请求-->options请求方法-->options使用场景什么是options请求&#xff1f;&#xff08;浅入&#xff09;扩展&#xff1a;常见的HTTP请求有什么&#xff1f;扩展&#xff1a;常见的HTTP请求的作用&#xff1…

ADS学习笔记(二)——更新中

八、中途容性负载的时延累加 1.原理简述 中途容性负载产生的第一位影响就是下冲噪声&#xff0c;第二位影响是远端信号的接收时间被延迟。电容器与传输线的组合就像一个RC滤波器&#xff0c;所以传输信号10&#xff05;&#xff5e;90&#xff05;上升边将增加&#xff0c;信…

Java-Secruity-2

可以先看这篇文章 Secruity-1&#x1f448; 1、授权 1.1 权限管理 在日常使用的系统中都会涉及到权限相关的操作&#xff0c;管理员有管理员的操作&#xff0c;用户有用户的操作&#xff0c;不同的用户可以使用不同的功能&#xff0c;这需要使用到权限管理。 所以在写接口…

iOS中宿主APP与录屏扩展进程数据传递方式

背景 在iOS生态系统中&#xff0c;应用程序的功能不再局限于单一的宿主应用&#xff0c;而是可以通过扩展进程实现更丰富的用户体验和功能。其中一种引人注目的扩展是录屏功能&#xff0c;它使用户能够捕捉设备屏幕上的活动&#xff0c;无论是游戏过程、教育演示还是其他应用场…

μC/OS-III 里面的环形表

文章目录 1、时钟节拍任务2、定时器列表 μC/OS-III 里面两个地方用到了环形表&#xff0c;时钟节拍任务&#xff0c;定时器列表&#xff0c;通过排序后&#xff0c;效率是非常高的。 以下内容整理自 嵌入式实时操作系统uC/OS-Ⅲ 1、时钟节拍任务 2023/12/21 18:04:16 (1) 该…

【数论】约数

试除法求约数 时间复杂度 O(sqrt(n))。 核心思路是求到较小的约数时&#xff0c;将其对应的较大约数也可以直接求出来&#xff0c; 例如&#xff1a;a/bc&#xff0c;b是a的余数&#xff0c;c也是a的余数 ps&#xff1a;注意bc的情况&#xff0c;要注意去重 void solve() …

JavaGUI(但期末速成版)之事件监听和处理

点击返回标题->JavaGUI期末速成版-CSDN博客 前言 依旧先声明&#xff0c;本篇记录的JavaGUI编程都是十分精简的&#xff0c;内容只取常用的、套路的、应付期末考试的。 我先放两张ppt的原内容。。。 看完&#xff08;我觉得你可能都没看完&#xff09;&#xff0c;摊牌了&a…

赴日IT培训课程 程序员新思路!

先说好&#xff0c;跟国内相比&#xff0c;日本IT并不发达。日本IT是依托着日本传统强势的制造业和政府机关发展的&#xff0c;所以开发的大多数软件也是面向这些的&#xff0c;由于日本人的严谨态度&#xff0c;各种文档的编写层出不穷&#xff0c;不像国内程序员每天没日没夜…

android 新版studio gradle 里面没有offline 勾选项

studio 右边 gradle 上面有个图标可以点击切换

【深度学习】注意力机制(七)Agent Attention

本文介绍Agent Attention注意力机制&#xff0c;Transformer中的Attention模块可以提取全局语义信息&#xff0c;但是计算量太大&#xff0c;Agent Attention是一种计算非常有效的Attention模块。 论文&#xff1a;Agent Attention: On the Integration of Softmax and Linear…