Java中的多级缓存设计与实现

Java中的多级缓存设计与实现

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

在现代应用程序中,多级缓存设计是一种常见的性能优化技术。多级缓存通过在不同层次上缓存数据来减少对底层存储系统的访问次数,提高系统的整体性能。本文将展示如何在 Java 中设计和实现一个多级缓存系统,包括内存缓存和分布式缓存的组合。

1. 设计多级缓存

多级缓存通常包括以下几层:

  1. 本地缓存(L1):直接在应用程序中存储的缓存,如使用 HashMapConcurrentHashMapCaffeine 等工具实现。
  2. 分布式缓存(L2):如 Redis 或 Memcached,这种缓存可供多个应用程序实例共享。

2. 添加依赖

首先,在 pom.xml 中添加需要的依赖:

<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>2.9.3</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3. 本地缓存实现

我们可以使用 Caffeine 作为本地缓存的实现。以下是一个使用 Caffeine 实现的本地缓存示例:

package cn.juwatech.cache;import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.Cache;
import org.springframework.stereotype.Component;@Component
public class LocalCache {private final Cache<String, String> cache;public LocalCache() {this.cache = Caffeine.newBuilder().maximumSize(100) // 最大缓存项数.expireAfterWrite(10, java.util.concurrent.TimeUnit.MINUTES) // 10分钟后过期.build();}public void put(String key, String value) {cache.put(key, value);}public String get(String key) {return cache.getIfPresent(key);}
}

在这个例子中,我们创建了一个最大缓存项数为 100,且每项在写入后 10 分钟过期的 Caffeine 缓存实例。

4. 分布式缓存实现

Redis 是一种流行的分布式缓存解决方案。配置 Redis 客户端(例如 Jedis 或 Lettuce)并进行连接:

spring:redis:host: localhostport: 6379

接着,创建一个 Redis 缓存管理器:

package cn.juwatech.cache;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;@Component
public class RedisCache {private final RedisTemplate<String, String> redisTemplate;@Autowiredpublic RedisCache(RedisConnectionFactory redisConnectionFactory) {this.redisTemplate = new RedisTemplate<>();this.redisTemplate.setConnectionFactory(redisConnectionFactory);}public void put(String key, String value) {redisTemplate.opsForValue().set(key, value);}public String get(String key) {return redisTemplate.opsForValue().get(key);}
}

5. 多级缓存策略

在实现多级缓存时,我们需要一个机制来协调本地缓存和分布式缓存。以下是一个示例实现,展示了如何使用本地缓存作为第一级缓存,当本地缓存中不存在数据时,从分布式缓存中加载数据:

package cn.juwatech.cache;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MultiLevelCacheService {private final LocalCache localCache;private final RedisCache redisCache;@Autowiredpublic MultiLevelCacheService(LocalCache localCache, RedisCache redisCache) {this.localCache = localCache;this.redisCache = redisCache;}public String get(String key) {// 尝试从本地缓存中获取数据String value = localCache.get(key);if (value != null) {return value;}// 本地缓存中没有,从 Redis 中获取value = redisCache.get(key);if (value != null) {// 更新本地缓存localCache.put(key, value);}return value;}public void put(String key, String value) {// 更新本地缓存和 RedislocalCache.put(key, value);redisCache.put(key, value);}
}

在这个实现中,MultiLevelCacheService 类负责协调本地缓存和 Redis 缓存。当请求数据时,它首先尝试从本地缓存中获取数据,如果本地缓存中不存在数据,则从 Redis 中获取,并将数据放入本地缓存中。

6. 示例控制器

最后,我们可以创建一个控制器来展示如何使用这个多级缓存服务:

package cn.juwatech.controller;import cn.juwatech.cache.MultiLevelCacheService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class CacheController {private final MultiLevelCacheService multiLevelCacheService;public CacheController(MultiLevelCacheService multiLevelCacheService) {this.multiLevelCacheService = multiLevelCacheService;}@GetMapping("/cache")public String getCache(@RequestParam String key) {return multiLevelCacheService.get(key);}@GetMapping("/cache/put")public String putCache(@RequestParam String key, @RequestParam String value) {multiLevelCacheService.put(key, value);return "Cached " + key + " with value " + value;}
}

在这个控制器中,我们提供了两个端点,一个用于获取缓存数据,另一个用于将数据存储到缓存中。

7. 总结

通过以上步骤,我们在 Java 中实现了一个多级缓存系统,包括本地缓存和分布式缓存。使用 Caffeine 实现本地缓存,Redis 作为分布式缓存,并通过协调这两者来优化缓存性能。这种设计使得系统能够在减少对底层存储系统访问的同时,提高响应速度和处理能力。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

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

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

相关文章

[STM32]HAL库实现自己的BootLoader-BootLoader与OTA-STM32CUBEMX

目录 一、前言 二、BootLoader 三、BootLoader的实现 四、APP程序 五、效果展示 六、拓展 一、前言 听到BootLoader大家一定很熟悉&#xff0c;在很多常见的系统中都会存在BootLoader。本文将介绍BootLoader的含义和简易实现&#xff0c;建议大家学习前掌握些原理基础。 …

目标检测算法:基本原理、发展历程、主要方法以及未来的发展趋势。

目标检测算法&#xff0c;作为计算机视觉领域中的一项关键技术&#xff0c;近年来得到了广泛的关注和研究。它旨在从图像或视频中准确地识别出目标的位置和类别&#xff0c;对于实现图像理解、视频分析、智能监控等应用具有重要意义。本文将详细介绍目标检测算法的基本原理、发…

实时更新UI界面

1.处理实时通信&#xff0c;几种方案 1&#xff1a;当一个用户发送一条需要实时更新的信息&#xff0c;我可以直接查找在线用户&#xff0c;通过在线用户来进行判断条件&#xff0c;发送更新请求 2&#xff1a;用户在一个需要实时更新的界面时&#xff0c;就不断的向服务端发…

【Android】Activity与Fragment的数据传递

上一篇文章学到了碎片的创建与生命周期&#xff0c;接下来学习碎片的常用操作&#xff0c;其中会用到上一篇文章的三个碎片&#xff0c;就做一个简单的说明吧&#xff1a;LeftFragment&#xff08;包含一个按钮&#xff09;、RightFragment4&#xff08;以粉色为背景的文本&…

408专业课130|零基础五个月速成攻略

计算机考研&#xff0c;有两个选择&#xff0c;一个是自命题&#xff0c;一个是408。如果你只是考一个普通院校&#xff0c;可以选择考自命题院校&#xff0c;容易上岸&#xff0c;但是如果考985/211/这类院校&#xff0c;最好还是选择408&#xff0c;因为408的考风险能力很强&…

Apollo部署与简易架构梳理

文章目录 apollo 安装apollo的基本架构组件机制component编译与加载 节点通讯数据的传输消息读写的实现消息的写端消息读端 常用术语ComponentChannelTaskNodeReader/WriterService/ClientParameter服务发现CRoutineSchedulerMessageDag文件Launch文件Record文件Mainboard Moni…

在图神经网络(GNN)上进行关系推理的新架构

开发能够学习推理的模型是一个众所周知的具有挑战性的问题&#xff0c;在这个领域中&#xff0c;使用图神经网络&#xff08;GNNs&#xff09;似乎是一个自然的选择。然而&#xff0c;以往关于使用GNNs进行推理的工作表明&#xff0c;当这些模型面对需要比训练时更长推理链的测…

JS代码混淆

JavaScript Obfuscator是JavaScript的功能强大的免费混淆器&#xff0c;其中包含多种功能&#xff0c;可为您的源代码提供保护&#xff0c;它支持很多流行的前端打包工具&#xff0c;如Webpack、Gulp、Grunt等都有相应的插件。 主要特征&#xff1a; ∙变量重命名 ∙字符串提…

(leetcode学习)236. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的祖…

有一个动态数组a,约束如下:a的元素在5-10之间;a.sum小于100。 问:为什么随机出来的a绝对值都很大?如何解决这一问题?

题目 有一个动态数组a&#xff0c;约束如下&#xff1a;a的元素在5-10之间&#xff1b;a.sum小于100。 问&#xff1a;为什么随机出来的a绝对值都很大&#xff1f;如何解决这一问题&#xff1f; … int a[]; constraint c1{ a.size() inside [5:10]; a.sum() inside [0:100…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十一章 添加设备树节点

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

linux禁用root

linux禁用root 1. 禁止普通用户切换到root1.1 sudo -i和sudo -s的区别1.2 sudo -i和直接登录root账号的区别1.3 禁止sudo -i切换root1.4 禁止su - root切换root 2. 禁止root远程登录2.1 ssh禁止root登录2.2 禁止远程桌面登录 本文主要介绍&#xff1a; 如何禁止普通用户切换到r…

Java---后端事务管理

代码世界聚眸光&#xff0c;昼夜敲盘思绪长。 算法心间精构建&#xff0c;编程路上细思量。 屏前架构乾坤定&#xff0c;键上飞驰智慧扬。 默默耕耘成果现&#xff0c;创新科技铸辉煌。 目录 一&#xff0c;概念 二&#xff0c;Spring事务管理 三&#xff0c;rollbackFor事务回…

智能合约中最常见的11种函数

下面列出了一些常见的智能合约函数及其用途&#xff0c;并提供了一些基本的示例。 1. 构造函数 (constructor) 构造函数用于初始化智能合约的状态变量。它只在合约部署时被调用一次。 示例: contract MyContract {address public owner;constructor() {owner msg.sender;}…

运维锅总浅析Kubernetes之Ceph

Ceph 的核心组件有哪些&#xff1f;Ceph读写数据流程及故障自愈是怎样的&#xff1f;如何对Ceph部署架构进行调优&#xff1f;如何用Ceph集成到kubernetes&#xff1f;希望本文能帮您解答这些疑惑&#xff01; 一、Ceph简介 Ceph 是一个开源的分布式存储系统&#xff0c;旨在…

sqlalchemy打印query的SQL和参数

sqlalchemy打印query的SQL和参数 在使用 SQLAlchemy 时,可以通过几种方式来打印生成的 SQL 查询和参数。这对于调试和理解程序生成的实际数据库查询非常有用。以下是一些方法: 1. 使用 str(query) 可以直接使用 str(query) 方法来获取 SQLAlchemy 查询对象生成的 SQL 语句…

PySide(PyQt)使用QPropertyAnimation制作动态界面

主脚本&#xff1a; # encoding: utf-8 import os import sysfrom PySide6.QtCore import QPropertyAnimation, QEasingCurvefrom UIS import *# 主画面类 class MainWindow(QMainWindow, animationButton_ui.Ui_MainWindow):def __init__(self):super().__init__()self.setup…

韩顺平0基础学Java——第37天

p736-758 MySQL三层结构 1.所谓安装Mysql数据库&#xff0c;就是在主机安装一个数据库管理系统(DBMS)&#xff0c;这个管理程序可以管理多个数据库。DBMS(database manage system) 2.一个数据库中可以创建多个表,以保存数据(信息)。 3.数据库管理系统(DBMS)、数据库和表的关系…

Android 性能之刷新率设置和管理

目录 1. 刷新率和帧率 2. 多种刷新率 3. 基本原理 3.1 屏幕 & 显示控制器 3.2 Composer Service 4. Framework 策略 4.1基本架构 4.2 刷新率设置项的定义 4.2.1 最低刷新率 4.2.2 默认刷新率 & 默认的用户设置刷新率 4.2.2.1 设置入口 4.2.2.2 设置场景 4…

从零开始:在linux系统安装MongoDB数据完整指南 新手常用命令

1 前言 MongoDB 是为快速开发互联网应用而设计的数据库系统。MongoDB 的设计目标是极简、灵活、作为 Web 应用栈的一部分。MongoDB 的数据模型是面向文档的&#xff0c;所谓文档是一种类似于json的结构。 官网教程&#xff1a;https://www.mongodb.com/docs/manual/ 2 安装部…