Guava Cache、LoadingCache本地缓存的使用

article/2025/10/4 4:50:03

前言:由于用户系统重构存在新老版本,网关对部分数据进行路径写死,所以为了避免频繁请求接口对网关日志记录进行本地缓存处理,学习过程中有Cache和LoadingCache两种模式,一番测试下都可以正常使用,特此记录

准备工作

  • 添加依赖
<!-- guava -->
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>27.1-jre</version>
</dependency>

Cache的使用

在这里插入图片描述

构造之后直接使用cache.get以及cache.put把它当成一个map来使用就行,也可以自己封装一个工具类来使用,这里不做过多赘述。

LoadingCache 的使用

  • 使用前先介绍下三种过期规则

expireAfterAccess: 当缓存项在指定的时间段内没有被读或写就会被回收。

expireAfterWrite:当缓存项在指定的时间段内没有更新就会被回收(移除key),需要等待获取新值才会返回。

refreshAfterWrite:当缓存项上一次更新操作之后的多久会被刷新。第一个请求进来,执行load把数据加载到内存中(同步过程),指定的过期时间内比如10秒,都是从cache里读取数据。过了10秒后,没有请求进来,不会移除key。再有请求过来,才则执行reload,在后台异步刷新的过程中,如果当前是刷新状态,访问到的是旧值。刷新过程中只有一个线程在执行刷新操作,不会出现多个线程同时刷新同一个key的缓存。在吞吐量很低的情况下,如很长一段时间内没有请求,再次请求有可能会得到一个旧值(这个旧值可能来自于很长时间之前),这将会引发问题。(可以使用expireAfterWrite和refreshAfterWrite搭配使用解决这个问题)

  • 由于我的需求是5分钟加载(load方法)一次,所以我仅仅使用了expireAfterWrite
    private LoadingCache<String, String> cache = CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES)      // 设置访问后5min的过期时间.initialCapacity(100).maximumSize(4000).build(new CacheLoader<String, String>() {@Override   // 加载缓存的方法, 必须实现public String load(String key) throws Exception{return selector();}});/*** 版本选择器-老版tu和新版ks用户体系选择* @return*/private String selector(){// 为空或者异常或者"value":"0" 都为falseboolean succ = false;try {succ = ksService.versionSelector();} catch (Exception e) {}return succ ? "/ks-prj" : "/tu-prj";}public String getAppend(){try {// 获取本地缓存设置的值,当前缓存定制化,随意传参return cache.get("1");} catch (ExecutionException e) {log.error("本地缓存异常:{}",e);}return selector();}
测试
 // 随机设置selector的值,验证缓存是否生效和过期时间是否重新加载public String selector() {Random random = new Random();return String.valueOf(random.nextInt());}public static void main(String[] args) throws ExecutionException, InterruptedException {CacheBuildUtils utils = new CacheBuildUtils();while (true){String s = utils.dataLoadingCache.get("111");System.out.println(s);Thread.sleep(5000);}}

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

相关文章

YYCache,TMCache,SDImageDiskCache的比较以及二级缓存分析

YYCache传送门 点击打开链接 内存缓存 通常一个缓存是由内存缓存和磁盘缓存组成&#xff0c;内存缓存提供容量小但高速的存取功能&#xff0c;磁盘缓存提供大容量但低速的持久化存储。相对于磁盘缓存来说&#xff0c;内存缓存的设计要更简单些&#xff0c;下面是我调查的一些…

EVCache

EVCache介绍 EVCache是一个开源、快速的分布式缓存&#xff0c;是基于Memcached的内存存储和Spymemcached客户端实现的&#xff0c;是Netflix&#xff08;网飞&#xff09;公司开发的 E&#xff1a;Ephemeral&#xff1a;数据存储是短暂的&#xff0c;有自身的存活时间V&#…

cache 缓存

缓存原理 测试样例 验证码 获取验证码 验证 验证码是否正确 idea 启动缓存 手机验证码 idea 手机 获得验证码 ehchace 数据淘汰策略 使用redis 然后启动 redis 服务器 redis-server.exe redis.windows.conf 启动redis 客户端redis-cli.exe time-to-live 最大活动时间 缓…

YYCache源码解读 (一)

YYCache YYCache是 ibireme 大神在2015年设计的一个IOS缓存工具。   通常来讲&#xff0c;一个缓存包括内存缓存和磁盘缓存。YYCache在磁盘缓存的设计上使用数据库sqlite映射和文件系统映射的方式进行存储&#xff0c;内存中设计了一个双向链表的结构存储数据结点。内存和磁盘…

Guava Cache本地缓存

目录 本地缓存 回顾 Guava Cache介绍 Guava Cache使用 创建 删除 Guava Cache底层实现 本地缓存与分布式缓存对比 缓存三大问题 本地缓存 实现&#xff1a;CurrentHashMap、Guava Cache 缓存在应用服务器&#xff0c;全局变量&#xff0c;JVM缓存 回顾 JVM内存 方…

缓存(ehcache/guavaCache使用)

单机缓存 ehcache&#xff1a;单独使用&#xff1a;与spring集成&#xff1a;编程式操作&#xff1a;注解式使用&#xff1a; 与springboot集成&#xff1a; guava cache&#xff1a;单独使用&#xff1a;spring/springboot集成&#xff1a;自定义KeyGenerator&#xff1a; 自定…

iOS 缓存框架YYCache学习

文章目录 前言一、YYCache的来源二、YYCache的结构1. YYMemoryCache1.1 最近最少使用—LRU(Least Frequently Used)1.2 基于LRU的增删改查1.2.1 增加数据1.2.2 删除数据1.2.3 查找修改数据1.2.4 YYMemoryCache的增删改查 2.YYDiskCache 总结参考文章 前言 提示&#xff1a;这篇…

深入理解YYCache缓存策略

文章目录 前言几个主要成员类1 YYCache2 YYMemoryCache3 YYDiskCache 实例化1 实例方法2 构造器方法 查1 检查是否有缓存2 读缓存 增1 写内存缓存2 写磁盘缓存 删1 清空内存缓存2 清空磁盘缓存 YYMemoryCache 初始化做了什么总结本文完 前言 YYCache是著名iOS框架YYKit的一个组…

Unity OnDestroy 调用

Test Code private GameObject _temp;_temp Instantiate(Resources.Load("gameObject original"), parent) as GameObject;if (Input.GetMouseButtonDown(1)) {Destroy(_temp);_temp null; }试验结果&#xff08;场景中本来存在的gameObjec或Resources出来的game…

报错原因高的地图调用mapView.onDestroy() 崩溃问题

以前在android app中使用地图的项目需要使用高德地图。 按照高德地图的开发文档创建测试项目&#xff0c;导入依赖&#xff0c;很快就成功显示了地图&#xff0c;然后在退出地图Activity时&#xff0c;app立即崩溃&#xff0c;通过追踪&#xff0c;发现是在销毁地图时出现崩溃…

Android跨进程通信Client Crash后Server端onDestroy

hi&#xff0c;粉丝朋友大家好&#xff01; 好久没有给大家写blog了&#xff0c;哈哈&#xff0c;这里说声抱歉&#xff01;实在家里比较忙&#xff0c;今天就来给大家分享一个跨进程专题课中学员问的一个问题&#xff0c;blog就来解答一下这个问题。 问题背景&#xff1a; 视频…

Activity onDestroy延迟回调

前端时间工作的时候遇到了两个奇怪的问题&#xff1a; 使用百度步行导航的时候&#xff0c;开启导航后立即退出&#xff0c;再次进入的时候就会黑屏&#xff1b;使用度小满支付的时候&#xff0c;当支付成功后页面一直显示loading&#xff0c;过了10s左右才恢复正常。 这看似…

基于MFC的OpenDDS发布订阅例子(PubSubDemo)

在编译完成Message.idl,产生MessageCommon.dll和相应的MessageTypeSupport的.h头文件和.cpp文件(MessageTypeSupportImpl.h、MessageTypeSupportC.h)的基础上,新建PubSubDemo.sln和工程PubSubDemo.vcxproj,并开始编码,实现基于Message的发布和订阅流程。 1)新建基于Dia…

OPenDDS程序 的 实现+运行

标题DDS程序实现和运行 本文记录了Windows10环境下OpenDDS环境搭建&#xff0c;idl自定义&#xff0c;代码生成&#xff0c;代码编写的全过程。 一、环境搭建 1.详细情况请参考开发笔记&#xff1a;1. OpenDDS环境搭建-Windows 10.note 编译好后生成了两个文件夹“OpenDDS-3.…

OpenDDS-1

转自&#xff1a;软件开发.OpenDDS 设计智能座舱时ECU之间通信及与TSP通信选择使用OpenDDS是可以的&#xff0c;因此不少人都认为OpenDDS是属于汽车以太网&#xff08;Aumotive Ethernet&#xff0c;AE&#xff09;&#xff0c;但事实上autosar AE中定义中有SomeIP、DoIP、AVB…

Java程序调用OpenDDS

一、前言 前面我们用三篇博客介绍了 OpenDDS在WIndows上的环境配置 Windows下的OpenDDS编译&#xff08;超详细&#xff09;_山中野竹的博客-CSDN博客_opendds windows 三种方式运行发布订阅示例程序 OpenDDS运行示例&#xff08;Messenger&#xff09;程序_山中野竹的博客-C…

OpenDDS运行实例

因为OpenDDS是分布式的部署&#xff0c;所以一般发布端和订阅端都不在同一台电脑上。 我在同一台电脑上进行测试&#xff0c;所以ip地址为&#xff1a;127.0.0.1 1.发布端 1.1 新建ior文件 在根目录先新建repo.ior文件&#xff1a; IOR:010000001e00000049444c3a4f70656e44…

Java调用OpenDDS(1)-编译安装openDDS-补上了所有网络上其他文章遗漏的细节

Java调用OpenDDS过程中踩了很多坑&#xff0c;记录一下。 提纲 1、DDS简介 2、DDS协议的实现产品 3、OpenDDS安装过程 1、DDS简介 DDS指的是Data Distribution Service&#xff0c;也即数据分发服务&#xff0c;是OMG&#xff08;Object Management Group&#xff0c;对象管理…

OpenDDS自学

前言 最近做毕设要做一个DDS系统和TISA系统的网关&#xff0c;完全没有基础&#xff0c;只好对着OpenDDS的Developers’ Guide和《分布式系统实时发布/订阅数据分发技术》这本书一点一点学(顺便吐槽这本书就是guide的翻译版&#xff0c;很多语句不通)。遇到很多问题&#xff0…

VS2015编译OpenDDS

最近需要研究下OpenDDS,因此需要搭建个环境&#xff0c;下面是一点经验&#xff0c;大家可以参考。 使用版本是OpenDDS-3.12、ACETAO-6.5.10和strawberry-perl&#xff0c;之所以使用ACETAO-6.5.10是因为往后的版本没有现成的2015对应的sln了。 一.资源下载 1.可以直接使用我…