完整教程:Java中的缓存机制与分布式缓存实现!

news/2025/10/9 16:44:28/文章来源:https://www.cnblogs.com/lxjshuju/p/19131423

全文目录:

    • 开篇语
    • 前言
    • 一、本地缓存:Guava Cache与Ehcache
      • 1.1 Guava Cache
        • Guava Cache的基本使用
        • Guava Cache的优点
      • 1.2 Ehcache
        • Ehcache的基本使用
        • Ehcache与Guava的比较
    • 二、分布式缓存:Redis与Memcached
      • 2.1 Redis
        • Redis的基本使用
        • Redis的优势
      • 2.2 Memcached
        • Memcached的基本使用
        • Memcached的优势
      • 2.3 Redis与Memcached比较
    • 三、缓存策略:LRU与LFU
      • 3.1 LRU(Least Recently Used)
        • LRU缓存实现示例
      • 3.2 LFU(Least Frequently Used)
        • LFU缓存实现示例
    • 四、总结
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

缓存机制是提高系统性能的重要手段,尤其在高并发、高访问量的场景中,缓存能够有效降低数据库压力、提高响应速度。Java为本地缓存和分布式缓存提供了多种解决方案,包括Guava CacheEhcacheRedisMemcached等。理解这些缓存机制及其缓存策略(如LRU、LFU)对于开发高效的系统至关重要。

本文将深入探讨Java中的缓存机制,涵盖本地缓存、分布式缓存的实现与应用,并详细介绍缓存策略的原理和应用场景。

一、本地缓存:Guava Cache与Ehcache

1.1 Guava Cache

Guava Cache是Google提供的一个高效的本地缓存实现,它是基于Java的Guava库。Guava Cache提供了内存缓存功能,支持自动加载、过期策略、大小限制等特性。Guava Cache是线程安全的,能够在高并发场景下高效工作。

Guava Cache的基本使用
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) {
Cache<
String, String> cache = CacheBuilder.newBuilder()
.maximumSize(100) // 设置缓存最大容量
.expireAfterWrite(10, TimeUnit.MINUTES) // 设置写入后10分钟过期
.build();
// 存储数据
cache.put("key1", "value1");
// 获取数据
String value = cache.getIfPresent("key1");
System.out.println("Cache value: " + value);
// 自动加载缓存
String autoLoadedValue = cache.get("key2", () ->
"default_value");
System.out.println("Auto-loaded value: " + autoLoadedValue);
}
}
  • maximumSize():设置缓存的最大容量,超出容量的元素会被逐出。
  • expireAfterWrite():设置缓存项的过期时间,超过指定时间未被访问的缓存项将被删除。
  • getIfPresent():检查缓存中是否存在指定键的值,若存在则返回,否则返回null
  • get():在缓存不存在时自动加载并插入缓存。
Guava Cache的优点
  • 灵活配置:支持容量限制、过期策略等配置。
  • 高效:内部使用基于LinkedHashMap的数据结构,查找和插入速度非常快。
  • 自动加载:当缓存不存在时,能够通过CacheLoader自动加载数据。

1.2 Ehcache

Ehcache是一个开源的本地缓存框架,它可以用于缓存大量的数据,并支持多种缓存策略。Ehcache支持内存和磁盘存储,适用于需要大量存储和高性能的场景。Ehcache的设计非常灵活,可以作为单机缓存,也可以与分布式缓存结合使用。

Ehcache的基本使用
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://ehcache.org/ehcache.xsd
http://ehcache.org/schema/ehcache.xsd"><cache name="myCache" maxEntriesLocalHeap="1000" eternal="false" timeToLiveSeconds="300"><persistence strategy="localTempSwap" />
</cache>
</ehcache>

ehcache.xml文件中,我们定义了一个名为myCache的缓存,设置了最大堆内存条目数为1000,过期时间为300秒。

Ehcache与Guava的比较
特性EhcacheGuava Cache
适用场景本地缓存,支持持久化和分布式缓存本地缓存,注重轻量级和高效
存储方式内存和磁盘存储,支持持久化内存存储,支持自动加载
过期策略支持多种过期策略(时间过期、访问过期等)支持过期时间、最大容量、自动加载策略
扩展性可与分布式缓存结合,支持集群模式不支持分布式模式

二、分布式缓存:Redis与Memcached

2.1 Redis

Redis是一个高性能的内存键值数据库,广泛应用于分布式缓存解决方案中。Redis不仅支持字符串,还支持列表、集合、哈希、排序集合等数据结构,因此非常适合做复杂数据结构的缓存。Redis还提供了持久化、数据备份和高可用性等特性。

Redis的基本使用
import redis.clients.jedis.Jedis;
public class RedisExample
{
public static void main(String[] args) {
// 连接到Redis服务器
Jedis jedis = new Jedis("localhost");
// 设置缓存
jedis.set("key1", "value1");
// 获取缓存
String value = jedis.get("key1");
System.out.println("Redis cache value: " + value);
// 设置过期时间
jedis.setex("key2", 10, "value2");
// 10秒后过期
// 获取缓存
String value2 = jedis.get("key2");
System.out.println("Redis cache value with expiration: " + value2);
}
}
Redis的优势
  • 支持丰富的数据类型:不仅支持简单的键值对,还支持列表、集合、哈希、排序集合等。
  • 高性能:Redis是基于内存的,读写操作非常快速。
  • 持久化与备份:支持持久化数据到磁盘,提供了RDB和AOF两种持久化方式。
  • 高可用性与分布式:通过Redis Sentinel和Redis Cluster提供高可用性和分布式支持。

2.2 Memcached

Memcached是一个开源的分布式内存缓存系统,主要用于缓存数据库查询结果、会话数据和其他频繁访问的数据。它具有高性能、易于使用的特点,适用于快速缓存小型数据。

Memcached的基本使用
import net.spy.memcached.MemcachedClient;
import java.net.InetSocketAddress;
public class MemcachedExample
{
public static void main(String[] args) throws Exception {
// 连接到Memcached服务器
MemcachedClient client = new MemcachedClient(new InetSocketAddress("localhost", 11211));
// 设置缓存
client.set("key1", 3600, "value1");
// 获取缓存
Object value = client.get("key1");
System.out.println("Memcached cache value: " + value);
// 设置过期时间
client.set("key2", 10, "value2");
// 10秒后过期
}
}
Memcached的优势
  • 简单高效:Memcached简单的键值存储,适用于缓存场景中的简单数据。
  • 高性能:Memcached是基于内存的,性能非常高,适合大规模并发访问。
  • 易于扩展:Memcached支持分布式存储,多个节点可以组成一个缓存集群。

2.3 Redis与Memcached比较

特性RedisMemcached
数据类型字符串、列表、集合、哈希、排序集合等仅支持简单的键值对
持久化支持RDB和AOF持久化不支持持久化
缓存策略支持过期时间、最大内存、LRU等支持过期时间、最大内存
集群支持支持Redis Sentinel和Redis Cluster支持分布式,但没有内置的高可用方案
使用场景适用于复杂的数据缓存和高可用场景适用于简单数据缓存和高并发场景

三、缓存策略:LRU与LFU

3.1 LRU(Least Recently Used)

LRU是最常用的缓存替换策略之一,它根据数据的访问时间来决定缓存的淘汰顺序。LRU算法会移除最久未被访问的缓存项。该算法的核心思想是“最近使用的缓存项,未来还可能会被使用”。

LRU缓存实现示例
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.concurrent.TimeUnit;
public class LRUCacheExample
{
public static void main(String[] args) {
Cache<
String, String> cache = CacheBuilder.newBuilder()
.maximumSize(3) // 限制缓存的最大容量为3
.expireAfterAccess(10, TimeUnit.MINUTES) // 设置访问后10分钟过期
.build();
// 存储缓存数据
cache.put("key1", "value1");
cache.put("key2", "value2");
cache.put("key3", "value3");
cache.put("key4", "value4");
// "key1"将被移除
System.out.println("Cache size: " + cache.size());
// 输出:Cache size: 3
}
}

LRU缓存策略常用于需要保证最近使用的数据优先被访问的场景。例如,Web缓存、数据库缓存等。

3.2 LFU(Least Frequently Used)

LFU缓存替换策略是另一种常见的缓存管理方法,它根据数据的使用频率来决定淘汰顺序。LFU算法会移除访问次数最少的缓存项。与LRU不同,LFU关注的是缓存项的访问频率而非时间。

LFU缓存实现示例
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
public class LFUCacheExample
{
public static void main(String[] args) {
Cache<
String, String> cache = Caffeine.newBuilder()
.maximumSize(3)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
// 存储缓存数据
cache.put("key1", "value1");
cache.put("key2", "value2");
cache.put("key3", "value3");
cache.put("key4", "value4");
// "key1"将被移除
System.out.println("Cache size: " + cache.estimatedSize());
// 输出:Cache size: 3
}
}

LFU策略适用于需要根据频繁访问的数据进行缓存优化的场景,例如推荐系统、热门内容缓存等。

四、总结

缓存机制是提升应用性能的关键,Java通过本地缓存和分布式缓存提供了丰富的解决方案。Guava Cache和Ehcache适用于本地缓存,能够高效地存储和管理数据,避免频繁访问数据库。而Redis和Memcached则是流行的分布式缓存方案,能够支持大规模的并发访问和复杂的缓存需求。

通过采用LRU、LFU等缓存策略,开发者可以更智能地管理缓存,提升缓存命中率,减少系统资源消耗。无论是本地缓存还是分布式缓存,合理的缓存策略和正确的实现方式都是提升系统性能和可扩展性的关键。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

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

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

相关文章

jsconfig.json-vscode或cursor ctrl点击@路径,快速到达

vscode或cursor ctrl点击@路径,快速到达 {"allowJs": true,"compilerOptions": {"baseUrl": ".","paths": {"@/*": ["./src/*"]}},"inc…

C# 弃元模式:从语法糖到性能利器的深度解析

在 C# 的语法演进中,“弃元(Discard)” 以一个简单的下划线 _ 成为了既提升代码可读性,又优化性能的 “双料特性”。它并非单纯的语法简化,而是编译器层面对 “有意忽略的值” 的深度优化 —— 通过明确 “忽略”…

完整教程:经典字符串与数组题目

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025钣金加工厂家最新推荐榜:精密工艺与定制服务口碑之选

钣金加工厂家最新推荐榜:精密工艺与定制服务口碑之选随着制造业转型升级步伐加快,钣金加工行业正迎来新一轮技术变革。作为制造业的基础工艺,钣金加工的质量直接影响到产品的结构强度、外观精度和使用寿命。在众多钣…

完整教程:Real-Time MDNet

完整教程:Real-Time MDNetpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

python查询数据信息,分析前了解表格结构

import pandas as pd file_path = rC:\Users\admin\OneDrive - nishbd.org\桌面\BMW sales data.csv df= pd.read_csv(file_path) print(df.describe()) #查询各列基本信息:计数、均值、标准差等 prin…

【SETUP】To debug the Neoverse N2 reference firmware

【SETUP】To debug the Neoverse N2 reference firmware ### Install repo tools https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/### Test With FVP https://learn.arm.com/learning-paths/servers-and-cloud-…

减少磁盘延迟的方法

假设要连续读取234扇区 磁头读取一块的内容后,需要一小段时间处理,而盘片又在不停旋转 因此如果2,3号扇区相邻排列,则读完2号扇区后无法连续不断读如3号扇区 必须等待盘片继续旋转,3号扇区再次划过磁头才能完成扇区…

AutoCAD 2025 CAD 安装包中文永久免费免激活破解版下载 附图文安装教程

一、软件下载链接软件名称 CAD2025软件大小 2.69G安装环境 Win10以及以上 下载链接: 夸克:https://pan.quark.cn/s/8de31f21159b 迅雷:https://pan.xunlei.com/s/VOb746jRxzQSFI5JyTNSVtg0A1?pwd=nsha# 软件介绍:…

nmcli修改ip地址

1. 查看现有配置nmcli connection show/nmcli con show 2. 配置ip地址sudo nmcli con mod 788fee99-bd02-350f-98e7-37a676a2f5cd ipv4.addresses 192.168.8.68/24 ipv4.gateway 192.168.8.1 ipv4.dns 8.8.8.8 ipv4.me…

静态库与动态库:开发者必知的底层逻辑与实践技巧

在软件开发的日常工作中,库文件如同隐形的基石,支撑着代码的复用与项目的高效构建。但不少开发者在面对静态库与动态库时,常会陷入“知其然不知其所以然”的困境。本文将从底层逻辑出发,拆解两种库的核心差异,结合…

从C到pwn入门

前言 实在是非常想再开一次入门课,因为有一个自己觉得还挺巧妙的小想法:我能不能写一个C程序,它不调用后门函数,而是我自己用栈溢出去调用完成getshell。我想从开发的角度,而非从计算机的底层来理解我自己学习到的…

基于MATLAB的三轴航天器姿态控制的仿真

基于MATLAB的三轴航天器姿态控制的仿真。包含了动力学模型、控制器设计和仿真分析。 1. MATLAB仿真 %% 三轴航天器姿态控制系统仿真 % 作者:基于MATLAB的航天器控制仿真 clear; close all; clc;%% 航天器参数设置 J =…

golang基础语法(四) 数组 - 教程

golang基础语法(四) 数组 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

for循环s.length()-1,s为空时的一直执行循环的问题

以下代码输出test2,如果没有break,会一直运行1 #include <bits/stdc++.h>2 using namespace std;3 4 int main() {5 int i;6 string s = "";7 int len = s.length() - 1;8 for (i =…

自适应工作负载的智能系统构建技术解析

本文深入探讨了基于机器学习的实例优化技术如何使数据库系统自动适应工作负载和数据特征,介绍了三种自调整方法及其在数据仓库服务中的实际应用,包括查询优化器改进和创新排序算法等核心技术。实例优化:让系统自动适…

aardio获取exe路径

aardio获取exe路径mainForm.msgbox(io.localpath("~","path")) mainForm.show();文件路径

分布式系统学习(一):相关概念及理论

概念 集群 相当于很多人一起 做一样的事一个业务模块,部署在多台服务器上分布式 相当于很多人一起,做不一样的事,这些事情合起来是一件大事;也就是变成了流水线工作一个大的业务系统,拆分成多个小的业务模块,分别…

一文读懂AI Agent:为什么说它是大模型的下一站?

一文读懂AI Agent:为什么说它是大模型的下一站?你是否曾经幻想过,有一个数字助手能像真人一样帮你处理任务?你只需要说一句“帮我规划一个国庆旅行的行程和预算”,它就能自动查机票、订酒店、排路线,甚至给你列出…

AI元人文构想的新启发:从自动驾驶困境到通用价值智能的构建——声明Ai研究

AI元人文构想的新启发:从自动驾驶困境到通用价值智能的构建——声明Ai研究 一、引言:自动驾驶困境与价值智能的觉醒 在科技发展的长河中,初代自动驾驶系统的车祸现场不仅是一次技术故障,更是一场哲学范式的溃败。当…