Java中缓存的使用浅讲

Java中缓存的使用浅讲

在Java中,缓存系统的使用对于提升应用性能至关重要。缓存的作用主要是减少访问慢速存储(如数据库或文件系统)的频率,从而提高应用的响应速度。以下是对Java中缓存系统的全面讲解,包括缓存的类型、实现方式以及使用场景

一. 缓存的概念

缓存(Cache)是一个存储临时数据的地方,它可以快速访问,并用于存储频繁访问的数据。缓存系统能够减少数据访问延迟,减轻后端系统的负担,提升性能。

二. 缓存的工作原理

缓存的工作原理通常如下:

1、查找缓存:应用请求数据时,首先查找缓存。
2、缓存命中:如果数据存在于缓存中,直接返回。
3、缓存未命中:如果数据不存在于缓存中,查询数据源(如数据库),并将查询结果缓存。
4、缓存失效:缓存中的数据通常有过期时间(TTL,Time-To-Live),当数据过期时需要重新加载。

三. 缓存类型

1、本地缓存(Local Cache)

  • 存储在应用的内存中。

  • 适用于小型应用,避免了外部依赖。

  • 缺点:只能被单一实例访问,无法横向扩展

2、分布式缓存(Distributed Cache)

  • 存储在多个节点中,支持跨多个应用实例共享缓存。

  • 常见的分布式缓存系统:Redis、Memcached。

  • 优点:可扩展性强,适用于大规模分布式应用

四. Java中缓存的实现方式

4.1 基于内存的缓存(如 HashMap、ConcurrentHashMap)

对于简单的缓存需求,可以使用Java的内存结构如 HashMap 或 ConcurrentHashMap。例如:


import java.util.concurrent.ConcurrentHashMap;
public class InMemoryCache {private ConcurrentHashMap<String, Object> cache = new ConcurrentHashMap<>();// 添加数据到缓存public void put(String key, Object value) {cache.put(key, value);}// 从缓存中获取数据public Object get(String key) {return cache.get(key);}// 删除缓存数据public void remove(String key) {cache.remove(key);}
}

这种方法简单且快速,但缺乏过期策略和跨进程共享功能。

4.2 使用Guava缓存(本地缓存)

Guava是Google提供的一个开源Java库,提供了一个非常强大的本地缓存功能。Guava的缓存实现支持自动过期、最大大小限制、异步加载等功能

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;public class GuavaCache {private Cache<String, Object> cache = CacheBuilder.newBuilder().maximumSize(100) // 最大缓存大小.expireAfterWrite(10, TimeUnit.MINUTES) // 过期时间.build();// 添加数据到缓存public void put(String key, Object value) {cache.put(key, value);}// 从缓存中获取数据public Object get(String key) {return cache.getIfPresent(key);}// 删除缓存数据public void remove(String key) {cache.invalidate(key);}
}

4.3 使用Ehcache(本地缓存)

Ehcache 是一个开源的Java缓存框架,适用于Java应用中复杂的缓存需求。它支持内存缓存、磁盘缓存和分布式缓存等

<dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId><version>3.9.7</version>
</dependency>

Ehcache 配置文件示例:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd"xmlns="http://www.ehcache.org/v3"><cache alias="sampleCache"><heap unit="entries">1000</heap><expiry><ttl>10</ttl> <!-- 过期时间10秒 --></expiry></cache>
</ehcache>

4.4 使用Redis(分布式缓存)

Redis 是一个高性能的分布式缓存系统,广泛用于跨多台服务器的缓存。它提供了丰富的数据结构和缓存功能,如字符串、哈希、列表、集合、排序集合等。

使用Java连接Redis的常见方式是通过 Jedis 或 Lettuce 库

Jedis 示例:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.6.0</version>
</dependency>
import redis.clients.jedis.Jedis;
public class RedisCache {private Jedis jedis = new Jedis("localhost");public void put(String key, String value) {jedis.set(key, value);}public String get(String key) {return jedis.get(key);}public void remove(String key) {jedis.del(key);}
}

Redis缓存适用于需要高可用性、跨服务器访问、并发控制等场景。

4.5 Spring Cache(集成缓存)

Spring 提供了一个缓存抽象层,允许你使用不同的缓存实现(如 Ehcache、Redis、Caffeine 等)而无需修改代码。Spring Cache提供了一些注解,简化了缓存操作

例如,使用注解 @Cacheable 和 @CacheEvict 来缓存方法结果:

import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.CacheEvict;public class CacheService {@Cacheable(value = "users", key = "#userId")public User getUserById(String userId) {// 模拟数据库查询return new User(userId, "John Doe");}@CacheEvict(value = "users", key = "#userId")public void evictCache(String userId) {// 清除缓存}
}

要启用Spring缓存功能,需要在配置类中添加 @EnableCaching 注解,并配置缓存管理器。

@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic CacheManager cacheManager() {return new ConcurrentMapCacheManager("users");}
}

五. 缓存的应用场景

  • 数据库查询缓存:对于数据库查询频繁的数据,可以将查询结果缓存。

  • Session缓存:用户会话信息存储在缓存中,提高获取速度。

  • 页面缓存:对静态页面或不常变动的内容进行缓存。

  • API响应缓存:对于API响应结果可以进行缓存,减少API调用的延迟

总结

缓存是提高系统性能的常用手段,但其实现和使用需要根据具体需求来选择合适的缓存类型和工具。在Java中,常见的缓存工具包括本地缓存(如 HashMap、Guava)、分布式缓存(如 Redis)、以及集成式缓存(如 Spring Cache)。通过合理的缓存策略,可以有效减轻数据库负担,提高系统的响应速度

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

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

相关文章

洛谷 P10264 [GESP202403 八级] 接竹竿 普及+/提高

题目描述 小杨同学想用卡牌玩一种叫做“接竹竿”的游戏。 游戏规则是&#xff1a;每张牌上有一个点数 vvv&#xff0c;将给定的牌依次放入一列牌的末端。若放入之前这列牌中已有与这张牌点数相 同的牌&#xff0c;则小杨同学会将这张牌和点数相同的牌之间的所有牌全部取出队列&…

windows docker-02-docker 最常用的命令汇总

一、镜像管理命令说明常用参数示例docker pull <镜像名>:<标签>拉取镜像docker pull nginx:latestdocker images查看本地镜像docker images -a&#xff08;含中间层镜像&#xff09;docker rmi <镜像ID>删除镜像docker rmi -f $(docker images -q)&#xff0…

前端react项目目录详解

1. 项目根目录文件​​文件/目录作用​​package.json​​定义项目依赖、脚本命令&#xff08;如 start/build&#xff09;、版本信息等​​.env​​基础环境变量配置&#xff08;所有环境共享&#xff09;​​.env.development​​开发环境专用变量&#xff08;如本地API地址&…

前端-CSS (样式引入、选择器)

文章目录大纲前端三大件常用样式颜色px:像素1.CSS三种引入方式1.1 行内样式1.2 页内样式1.3 引入外部样式表文件&#xff08;常见&#xff09;基础选择器1. 标记选择器2. id选择器3. 类选择器 最常用4 * 选择器 使用频率较低复合选择器伪类选择器1.超链接伪类&#xff1a;2.子元…

7月19日 台风“韦帕“强势逼近:一场与时间赛跑的防御战

中央气象台7月19日10时继续发布台风黄色预警,今年第6号台风"韦帕"正以每小时20-25公里的速度向西偏北方向移动,强度逐渐加强。这个来自海洋的"不速之客"中心附近最大风力已达10级(25米/秒),预计将于20日下午至夜间在广东深圳到海南文昌一带沿海登陆,…

学习 Python 爬虫需要哪些基础知识?

学习 Python 爬虫需要掌握一些基础技术和概念。 1. Python 基础语法 这是最根本的前提&#xff0c;需要熟悉&#xff1a; - 变量、数据类型&#xff08;字符串、列表、字典等&#xff09; - 条件判断、循环语句 - 函数、类与对象 - 模块和包的使用&#xff08;如 import 语…

IELTS 阅读C15-Test 2-Passage 2

继续雅思上分实验。这次正确率是10/13&#xff0c;还是挺让我吃惊的&#xff0c;因为我又没有完全读懂&#xff01; 题型1-填空题这道题目很简单&#xff0c;同样地去原文段落里找就好&#xff0c;最后一个空填错了是因为我不知道mitigate就是decrease同义词。 题型2-人物匹配题…

7.18 Java基础 |

以下内容&#xff0c;参考Java 教程 | 菜鸟教程&#xff0c;下边是我边看边记的内容&#xff0c;以便后续复习使用。 多态&#xff1a; 继承&#xff0c;接口就是多态的具体体现方式。生物学上&#xff0c;生物体或物质可以具有许多不同的形式或者阶段。 多态分为运行时多态&…

网络安全知识学习总结 Section 11

一、实验知识总结&#xff08;模拟&#xff09;等价路由配置实验并抓包分析按流分析实验拓扑图&#xff1a;AR1配置&#xff1a;<Huawei>sys [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 192.168.1.1 30 [Huawei-GigabitEthernet0/0/0]int g0/0/1 [Huaw…

VBA 运用LISTBOX插件,选择多个选项,并将选中的选项回车录入当前选中的单元格

维护好数据&#xff0c;并新增一个activeX列表框插件Private Sub Worksheet_SelectionChange(ByVal Target As Range)If Target.Count > 1 Then Exit SubIf Target.Row > 2 And Target.Row < 10 And Target.Column 2 Then 选择操作范围With ListBox1.MultiSelect 1 …

ASP .NET Core 8实现实时Web功能

ASP.NET Core SignalR 是一个开放源代码库&#xff0c;可用于简化向应用添加实时 Web 功能。 实时 Web 功能使服务器端代码能够将内容推送到客户端。以下是 ASP.NET Core SignalR 的一些主要功能&#xff1a;自动处理连接管理同时向所有连接的客户端发送消息。 例如聊天室向特定…

最新版谷歌浏览器 内网安装 pdf无法预览

最新版谷歌浏览器 内网安装 pdf无法预览 谷歌下载地址 谷歌下载地址 不同的浏览器版本&#xff0c;兼容的js标准不一样 js标准也在不断升级&#xff0c;增加新的方法。

NX二次开发常用函数坐标转化UF_MTX4_csys_to_csys和UF_MTX4_vec3_multipl

一、UF_MTX4_csys_to_csys 1.1 函数名称 UF_MTX4_csys_to_csys1.2 函数中各参数解释&#xff1a;函数参数解释&#xff1a; 第1个参数为输入&#xff1a; 输入const double 双精度类型的参数&#xff0c;参数的变量格式为from_origin [ 3 ]&#xff0c;坐标系&#xff…

JAVA中的Collections 类

文章目录前言一、 排序方法 sort() 和 reverseOrder()1. sort(List<T> list)2.sort(List<T> list, Comparator<? super T> c)二、查找方法 max(), min()1.max(Collection<? extends T> coll)2.min(Collection<? extends T> coll)3.max(Collec…

统计学习方法

一、统计学习方法步骤 得到一个有限的训练数据集合确定学习模型的集合-假设空间确定模型选择的准则-策略实现求解最优模型的算法-算法通过学习方法选择最优模型利用学习的最优模型对新数据进行预测或分析 二、统计学习方法分类 三、统计学习的基本分类&#xff08;监督学习&a…

windows docker-01-desktop install windows10 + wls2 启用

windows10 安装 docker 版本信息确认 需要区分 windows 是 amd64 还是 arm64 powershell 中执行&#xff1a; > echo $env:PROCESSOR_ARCHITECTURE AMD64下载 官方 https://www.docker.com/products/docker-desktop/ 下载 windows amd64 下载好了直接安装。 如何验证…

Elasticsearch集群出现脑裂(Split-Brain)如何排查原因和处理?

Elasticsearch集群出现脑裂(Split-Brain)如何排查原因和处理? 1. 脑裂(Split-Brain)背景 定义:脑裂是指 Elasticsearch 集群由于网络分区(network partition)或其他原因分裂成多个独立的子集群,每个子集群认为自己是主集群,导致不同的子集群可能独立处理请求,造成数…

Apache Ignite 的 Pages Writes Throttling(页面写入节流)

&#x1f31f; 一、什么是 Checkpointing&#xff08;检查点机制&#xff09;&#xff1f; 在 Apache Ignite 中&#xff1a; 数据是先保存在内存中&#xff08;RAM&#xff09;&#xff0c;然后异步写入磁盘。当数据被修改时&#xff0c;它首先被更新在内存中的“页”上&#…

uni-app 学习笔记:使用深度选择器修改第三方库组件的样式

在uni-app中&#xff0c;深度选择器&#xff08;Deep Selector&#xff09;是一个非常重要的概念&#xff0c;它允许父组件穿透样式隔离&#xff0c;从而修改子组件的内部样式。1.什么是uni-app深度选择器深度选择器是一种CSS选择器&#xff0c;用于穿透组件的样式隔离机制&…

物联网IOT平台到底是啥

物联网IOT平台&#xff1a;万物互联的智慧中枢清晨&#xff0c;智能闹钟轻柔唤醒你&#xff0c;咖啡机自动开始冲泡&#xff1b;离家时&#xff0c;空调自动关闭&#xff0c;安防摄像头启动&#xff1b;办公室内&#xff0c;生产线传感器实时回传设备状态&#xff0c;仓库管理系…