当前位置: 首页 > news >正文

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

全文目录:

    • 开篇语
    • 前言
    • 一、本地缓存: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.hskmm.com/?act=detail&tid=27424

相关文章:

  • jsconfig.json-vscode或cursor ctrl点击@路径,快速到达
  • C# 弃元模式:从语法糖到性能利器的深度解析
  • 2025钣金加工厂家最新推荐榜:精密工艺与定制服务口碑之选
  • python查询数据信息,分析前了解表格结构
  • 减少磁盘延迟的方法
  • AutoCAD 2025 CAD 安装包中文永久免费免激活破解版下载 附图文安装教程
  • nmcli修改ip地址
  • 静态库与动态库:开发者必知的底层逻辑与实践技巧
  • 从C到pwn入门
  • 基于MATLAB的三轴航天器姿态控制的仿真
  • golang基础语法(四) 数组 - 教程
  • for循环s.length()-1,s为空时的一直执行循环的问题
  • 自适应工作负载的智能系统构建技术解析
  • aardio获取exe路径
  • 分布式系统学习(一):相关概念及理论
  • AI元人文构想的新启发:从自动驾驶困境到通用价值智能的构建——声明Ai研究
  • mido配置 DNS 服务器
  • 磁盘调度算法
  • 牛客周赛 Round 112
  • CF497E Subsequences Return
  • Flutter 中运用 Color 的最优方案
  • 竞争自适应重加权采样(CARS)算法在光谱数据变量选择中的解决方案
  • 2025 最新超声波清洗机厂家推荐排行榜:工业 / 精密 / 实验室等多场景适配厂商权威榜单全自动/大型/工业/单槽/多槽超声波清洗机厂家推荐
  • AI元人文构想的新启发:从自动驾驶困境到通用价值智能的构建
  • Word通过宏统一设置样式
  • 2025 年金属线槽厂家最新推荐排行榜:覆盖不锈钢 / 铝合金 / 防火 / 大跨距 / 喷塑类型,帮您选优质厂家企业
  • 2025电子行业隧道式烘干炉/PCB板固化炉设备厂家推荐品牌/汽车行业隧道式烤炉选择哪家/汽车喷涂固化炉设备厂家对比
  • 基于蚁群算法的PID参数整定方法及MATLAB实现
  • Sql语句
  • 2025 年电缆桥架厂家最新推荐排行榜:精选不锈钢 / 铝合金 / 热镀锌等多类型优质桥架厂家,助力精准选购热镀锌/热浸锌/托盘式/防火/喷塑电/防火喷塑电缆桥架厂家推荐