Java 本地缓存的实现:常见的四种方式
在 Java 中,常用的本地缓存实现主要有以下几种,以下是它们的代码示例及适用场景:
一、使用 ConcurrentHashMap 实现简单缓存
适合轻量级、无需复杂淘汰策略的场景。
import java.util.concurrent.ConcurrentHashMap;public class SimpleCache<K, V> {private final ConcurrentHashMap<K, V> cache = new ConcurrentHashMap<>();public V get(K key) {return cache.get(key);}public void put(K key, V value) {cache.put(key, value);}public void remove(K key) {cache.remove(key);}public void clear() {cache.clear();}
}
二、Guava Cache(推荐)
Google 提供的缓存库,支持过期策略、大小限制等。
2.1. 添加依赖(Maven):
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version>
</dependency>
2.2. 代码示例:
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.concurrent.TimeUnit;public class GuavaCacheExample {public static void main(String[] args) {// 创建缓存,设置最大容量100,写后1分钟过期Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(100) // 最大条目数.expireAfterWrite(1, TimeUnit.MINUTES) // 写入后过期时间.build();// 写入数据cache.put("key1", "value1");// 读取数据String value = cache.getIfPresent("key1");System.out.println("Value: " + value); // 输出 Value: value1// 删除数据cache.invalidate("key1");}
}
三、Caffeine(高性能替代)
Guava Cache 的现代版,性能更高,推荐 Java 8+ 使用。
3.1. 添加依赖(Maven):
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.8</version>
</dependency>
3.2. 代码示例:
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.concurrent.TimeUnit;public class CaffeineCacheExample {public static void main(String[] args) {// 创建缓存,设置最大容量500,读后30秒过期Cache<String, String> cache = Caffeine.newBuilder().maximumSize(500).expireAfterAccess(30, TimeUnit.SECONDS).build();// 写入数据cache.put("key1", "value1");// 读取数据(若不存在则返回null)String value = cache.getIfPresent("key1");System.out.println("Value: " + value); // 输出 Value: value1// 删除数据cache.invalidate("key1");}
}
四、Ehcache(支持持久化)
功能更强大,支持磁盘持久化、分布式缓存等。
4.1. 添加依赖(Maven):
<dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId><version>3.10.8</version>
</dependency>
4.2. 代码示例:
java
Copy Code
import org.ehcache.Cache;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.config.units.MemoryUnit;
import org.ehcache.core.config.DefaultConfiguration;
import org.ehcache.core.spi.service.LocalPersistenceService;
import org.ehcache.impl.config.persistence.DefaultPersistenceConfiguration;
import org.ehcache.impl.persistence.DefaultLocalPersistenceService;public class EhcacheExample {public static void main(String[] args) {// 配置持久化到磁盘LocalPersistenceService persistenceService = new DefaultLocalPersistenceService(new DefaultPersistenceConfiguration(new File("cache-data")));// 创建缓存管理器DefaultConfiguration config = new DefaultConfiguration(persistenceService, ResourcePoolsBuilder.heap(100).build());Cache<String, String> cache = CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, String.class,ResourcePoolsBuilder.newResourcePoolsBuilder().heap(100, MemoryUnit.MB) // 堆内内存.disk(1, MemoryUnit.GB) // 磁盘持久化).buildConfig(String.class);// 写入数据cache.put("key1", "value1");// 读取数据String value = cache.get("key1");System.out.println("Value: " + value); // 输出 Value: value1// 关闭资源persistenceService.close();}
}
五、缓存选择建议
场景 推荐方案 优势
简单键值对、无过期策略 ConcurrentHashMap 无依赖,轻量级
需要淘汰策略、过期时间 Guava Cache / Caffeine 功能丰富,易集成
大数据量、高性能需求 Caffeine 高吞吐量,低延迟
需要持久化到磁盘 Ehcache 支持磁盘存储,适合重启恢复数据
六、注意事项
缓存一致性:
如果数据源更新频繁,需通过 invalidate 手动清除旧缓存或设置短过期时间。
内存管理:
设置合理的 maximumSize 或 expireAfterWrite,避免内存溢出(OOM)。
并发安全:
Guava/Caffeine/Ehcache 均为线程安全,直接使用即可。
相关文章:
Java 本地缓存的实现:常见的四种方式
在 Java 中,常用的本地缓存实现主要有以下几种,以下是它们的代码示例及适用场景: 一、使用 ConcurrentHashMap 实现简单缓存 适合轻量级、无需复杂淘汰策略的场景。 import java.util.concurrent.ConcurrentHashMap;public class Simp…...
记录一次生产中mysql主备延迟问题处理
登录库: mysql -uXXXX -pXXXX -P3306 -hXXXXXX -A 备库上执行:show slave status\G 查看 seconds_Behind_Master,延迟 2705s,而且还一直在增加。 SHOW CREATE TABLE proc_i_income_temp; -- 查看表的结构 show index from proc…...
路由器原理与配置技术详解
一、路由基础原理 1.1 路由器的核心功能 网络层设备:工作在OSI参考模型第三层,实现不同网络间的互联互通智能路径选择:基于路由表为数据包选择最优传输路径协议转换:处理不同网络接口间的协议差异(如以太网与PPP&…...
第五节:React Hooks进阶篇-如何用useMemo/useCallback优化性能
反模式:滥用导致的内存开销React 19编译器自动Memoization原理 React Hooks 性能优化进阶:从手动到自动 Memoization (基于 React 18 及以下版本,结合 React 19 新特性分析) 一、useMemo/useCallback 的正确使用场景…...
STL迭代器:C++泛型编程的核心工具 [特殊字符]
在C中,STL(标准模板库)的迭代器是泛型编程的核心,它不仅解决了指针的局限性,还为算法与容器之间提供了抽象的访问接口。接下来,我们将探讨迭代器的核心作用、与指针的关键区别以及其设计哲学。 一、迭代器的…...
ffmpeg无损转格式的命令行
将ffmpeg.exe拖入命令行窗口 c:\users\zhangsan>D:\ffmpeg-2025-03-11\bin\ffmpeg.exe -i happy.mp4 -c:v copy -c:a copy 格式转换后.mkv -c:v copy 仅做拷贝视频,不重新编码 -c:a copy 仅做拷贝音频 ,不重新编码...
Monorepo 是什么?前端项目的多模块管理终极方案
前言 你是否曾经维护过多个前端项目?是否在多个项目之间来回复制粘贴组件,工具函数?是否经常被"组件更新没同步","构建时间太长","依赖版本冲突"等问题困扰? 这些问题都指向一个关键点: 项目结构和管理方式 今天,我来聊聊一种非常火但又容…...
对象池模式在uniapp鸿蒙APP中的深度应用
文章目录 对象池模式在uniapp鸿蒙APP中的深度应用指南一、对象池模式核心概念1.1 什么是对象池模式?1.2 为什么在鸿蒙APP中需要对象池?1.3 性能对比数据 二、uniapp中的对象池完整实现2.1 基础对象池实现2.1.1 核心代码结构2.1.2 在Vue组件中的应用 2.2 …...
条款05:了解C++默默编写并调用哪些函数
目录 1.默认生成的函数 2.无法生成的情况 2.1当成员函数有引用 或者 被const修饰 2.2.operator在基类被私有 1.默认生成的函数 class empty {};//相当于class empty { public:empty(){ ... } // 构造函数empty(const empty& rhs) { ... }// 拷贝构造~empty(){ ... } //…...
PythonFlask打造高效流式接口的实战
一、环境搭建与项目初始化 要使用 Flask 提供流式接口,首先得确保开发环境正确配置。在 Ubuntu 系统上,可借助 apt 包管理器便捷安装 Python 和 pip: sudo apt update sudo apt install python3 python3-pip对于 Windows 用户,推荐从官网下载安装包进行安装。安装完成后,…...
强化学习算法系列(五):最主流的算法框架——Actor-Critic算法框架
强化学习算法 (一)动态规划方法——策略迭代算法(PI)和值迭代算法(VI) (二)Model-Free类方法——蒙特卡洛算法(MC)和时序差分算法(TD) (三)基于动作值的算法——Sarsa算法与Q-Learning算法 (四…...
设计模式(结构型)-桥接模式
目录 摘要 定义 类图 角色 具体实现 优缺点 优点 缺点 使用场景 使用案例 JDBC 和桥接模式 总结 摘要 在软件开发领域,随着系统规模和复杂性的不断攀升,如何设计出具有良好扩展性、灵活性以及可维护性的软件架构成为关键挑战。桥接模式作为一…...
【MySQL】MySQL数据库 —— 简单认识
目录 1. 数据库的介绍 1.1 什么是数据库 1.2 数据库和数据结构之间关系 2. 数据库分类 2.1 关系型数据库(RDBMS) 2.2 非关系型数据库 2.3 区别 一些行内名词简单解释: 3. 关于mysql 主要学什么 4. MySQL中重要的概念 4.1 概念 4…...
RNN - 语言模型
语言模型 给定文本序列 x 1 , … , x T x_1, \ldots, x_T x1,…,xT,语言模型的目标是估计联合概率 p ( x 1 , … , x T ) p(x_1, \ldots, x_T) p(x1,…,xT)它的应用包括 做预训练模型(eg BERT,GPT-3)生成本文ÿ…...
过拟合、归一化、正则化、鞍点
过拟合 过拟合的本质原因往往是因为模型具备方差很大的权重参数。 定义一个有4个特征的输入,特征向量为,定义一个模型,其只有4个参数,表示为。当模型过拟合时,这四个权重参数的方差会很大,可以假设为。当经过这个模型后…...
【python画图】:从入门到精通绘制完美柱状图
目录 Python数据可视化:从入门到精通绘制完美柱状图一、基础篇:快速绘制柱状图1.1 使用Matplotlib基础绘制1.2 使用Pandas快速绘图 二、进阶篇:专业级柱状图定制2.1 多系列柱状图2.2 堆叠柱状图2.3 水平柱状图 三、专业参数速查表Matplotlib …...
基础知识:离线安装docker、docker compose
(1)离线安装docker 确认版本:Ubuntu 18.04 LTS - bionic 确认架构:X86_64 lsb_release -a uname -a 官方指南:https://docs.docker.com/engine/install/ 选择Ubuntu,发现页面上最低是Ubuntu20.04, 不要紧...
畅游Diffusion数字人(27):解读字节跳动提出主题定制视频生成技术Phantom
畅游Diffusion数字人(0):专栏文章导航 前言:主题定制视频生成,特别是zero-shot主题定制视频生成,一直是当前领域的一个难点,之前的方法效果很差。字节跳动提出了一个技术主题定制视频生成技术Phantom,效果相比于之前的技术进步非常显著。这篇博客详细解读一下这一工作。 …...
《Adaptive Layer-skipping in Pre-trained LLMs》- 论文笔记
作者:Xuan Luo, Weizhi Wang, Xifeng Yan Department of Computer Science, UC Santa Barbara xuan_luoucsb.edu, weizhiwangucsb.edu, xyancs.ucsb.edu 1. 引言与动机 1.1 背景 LLM 的成功与挑战: 大型语言模型 (LLMs) 在翻译、代码生成、推理等任务上取得巨大成…...
阅读分析Linux0.11 /boot/head.s
目录 初始化IDT、IDTR和GDT、GDTR检查协处理器并设置CR0寄存器初始化页表和CR3寄存器,开启分页 初始化IDT、IDTR和GDT、GDTR startup_32:movl $0x10,%eaxmov %ax,%dsmov %ax,%esmov %ax,%fsmov %ax,%gslss _stack_start,%espcall setup_idtcall setup_gdtmovl $0x1…...
android11 DevicePolicyManager浅析
目录 📘 简单定义 📘应用启用设备管理者 📂 文件位置 🧠 DevicePolicyManager 功能分类举例 🛡️ 1. 安全策略控制 📷 2. 控制硬件功能 🧰 3. 应用管理 🔒 4. 用户管理 &am…...
《前端性能优化秘籍:打造极致用户体验》
在当下,网站和应用的性能表现直接关乎用户去留。快速加载、流畅交互的页面能让用户沉浸其中,反之,缓慢的响应速度则会让他们毫不犹豫地离开。对于前端开发者而言,性能优化不仅是技术追求,更是提升用户体验、增强产品竞…...
微信小程序实现table样式,自带合并行合并列
微信小程序在代码编写过程好像不支持原生table的使用,在开发过程中偶尔又得需要拿table来展示。 1.table效果展示 1.wxml <view class"table-container"><view class"table"><view class"table-row"><view cla…...
学习笔记十二——Rust 高阶函数彻底入门(超详细过程解析 + 每步数值追踪)
💡 彻底搞懂 Rust 高阶函数!新手最容易卡住的语法 调用流程全讲透(含逐步拆解) Rust 函数式编程中有一个常见却经常让人懵的概念:高阶函数(Higher-Order Function) 一看到 fn(i32) -> i32、…...
电脑的品牌和配置
我的笔记本是2020年买的,之前的订单找不到了,就知道是联想,不清楚具体的配置。 本文来源:腾讯元宝 检查系统信息(Windows) 这通常是 联想(Lenovo) 的型号代码。 81XV 是联想…...
Redis面试——常用命令
一、String (1)设置值相关命令 1.1.1 SET 功能:设置一个键值对,如果键已存在则覆盖旧值语法: SET key value [EX seconds] [PX milliseconds] [NX|XX]EX seconds:设置键的过期时间为 seconds 秒 PX milli…...
Swin-Transformer-UNet改进:融合Global-Local Spatial Attention (GLSA) 模块详解
目录 1.模块概述 2.swinUNet网络 3. 完整代码 1.模块概述 Global-Local Spatial Attention (GLSA) 是一种先进的注意力机制模块,专为计算机视觉任务设计,能够同时捕捉全局上下文信息和局部细节特征。 该模块通过创新的双分支结构和自适应融合机制,显著提升了特征表示能…...
ubuntu 向右拖动窗口后消失了、找不到了
这是目前单显示器的设置,因为实际只有1个显示器,之前的设置如下图所示,有2个显示器,一个主显示器,一个23寸的显示器 ubuntu 22.04 系统 今天在操作窗口时,向右一滑,发现这个窗口再也不显示了、找…...
大语言模型(LLMs)中的强化学习(Reinforcement Learning, RL)
第一部分:强化学习基础回顾 在深入探讨LLMs中的强化学习之前,我们先快速回顾一下强化学习的核心概念,确保基础扎实。 1. 强化学习是什么? 强化学习是一种机器学习范式,目标是让智能体(Agent)…...
2025最新版微软GraphRAG 2.0.0本地部署教程:基于Ollama快速构建知识图谱
一、前言 微软近期发布了知识图谱工具 GraphRAG 2.0.0,支持基于本地大模型(Ollama)快速构建知识图谱,显著提升了RAG(检索增强生成)的效果。本文手把手教你如何从零部署,并附踩坑记录和性能实测…...
