springboot cache

springboot cache 简要介绍

Spring 对缓存提供支持,核心思路是对方法的参数和返回值的缓存,当开发者调用一个方法时,将方法的参数和返回值作为key/value缓存起来,当再次调用该方法时,如果缓存中有数据,就直接从缓存中获取,否则再去执行该方法。但是,Spring中并未提供缓存的具体实现,而是提供了一套缓存API,开发者可以自由选择缓存的实现。因此无论使用哪种缓存具体实现,不同的只是缓存配置,开发者使用的缓存注解是一致的。

Spring Boot Cache 是 Spring Framework 提供的一个缓存抽象层,旨在简化缓存的使用。它通过注解和配置来管理缓存,从而提高应用程序的性能。以下是 Spring Boot Cache 的一些关键点:

  1. 缓存抽象:Spring 提供了一套统一的缓存抽象,支持多种缓存实现,如 EhCache、Caffeine、Redis 等。开发者可以通过简单的配置切换不同的缓存实现。

  2. 注解驱动:Spring Boot Cache 主要通过注解来实现缓存功能,包括:

    • @Cacheable:用于标记方法,表示该方法的返回结果可以被缓存。
    • @CachePut:用于更新缓存。
    • @CacheEvict:用于移除缓存。
    • @Caching:用于组合多个缓存操作。
  3. 自动配置:Spring Boot 提供了自动配置功能,可以根据类路径中的缓存库自动配置缓存管理器。

  4. 缓存管理器:Spring Boot Cache 使用 CacheManager 来管理缓存实例。开发者可以自定义 CacheManager 来满足特定需求。

  5. 灵活性:Spring Boot Cache 提供了灵活的配置选项,可以通过属性文件或 Java 配置类进行配置。

通过使用 Spring Boot Cache,开发者可以轻松地将缓存集成到应用程序中,从而提高性能和响应速度。

springboot 本地缓存

在 Spring Boot 中,本地缓存通常是指在应用程序的内存中存储数据,以便快速访问。常用的本地缓存实现包括 Caffeine 和 EhCache。以下是如何在 Spring Boot 中配置和使用本地缓存的简要步骤:

1. 添加依赖

首先,在 pom.xml 文件中添加缓存库的依赖。例如,使用 Caffeine 缓存:

<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.0.5</version>
</dependency>

2. 启用缓存

在 Spring Boot 应用程序的主类上添加 @EnableCaching 注解,以启用缓存支持。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableCaching
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

3. 配置缓存

application.propertiesapplication.yml 中配置缓存属性。例如,使用 Caffeine 缓存:

spring:cache:type: caffeinecaffeine:spec: maximumSize=500,expireAfterAccess=600s

4. 使用缓存注解

在需要缓存的方法上使用缓存注解,例如 @Cacheable@CachePut@CacheEvict

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class MyService {@Cacheable("items")public Item getItemById(Long id) {// 模拟耗时操作return findItemById(id);}private Item findItemById(Long id) {// 实际的数据获取逻辑return new Item(id, "ItemName");}
}

5. 自定义缓存管理器(可选)

如果需要自定义缓存行为,可以定义一个 CacheManager Bean。

import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class CacheConfig {@Beanpublic CacheManager cacheManager() {CaffeineCacheManager cacheManager = new CaffeineCacheManager("items");cacheManager.setCaffeine(Caffeine.newBuilder().maximumSize(500).expireAfterAccess(600, java.util.concurrent.TimeUnit.SECONDS));return cacheManager;}
}

通过这些步骤,你可以在 Spring Boot 应用程序中有效地使用本地缓存来提高性能。

springboot 分布式缓存

在 Spring Boot 中,Redis 是一种常用的分布式缓存解决方案。它提供了高性能、持久化和跨多个实例共享缓存数据的能力,非常适合分布式系统。以下是如何在 Spring Boot 中配置和使用 Redis 作为分布式缓存的步骤:

1. 添加依赖

pom.xml 文件中添加 Spring Boot Redis 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 启用缓存

在 Spring Boot 应用程序的主类上添加 @EnableCaching 注解,以启用缓存支持。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableCaching
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

3. 配置 Redis

application.propertiesapplication.yml 中配置 Redis 连接属性。确保 Redis 服务器可以被所有应用实例访问。

spring:redis:host: your-redis-hostport: 6379password: your-redis-password # 如果有密码保护

4. 使用缓存注解

在需要缓存的方法上使用缓存注解,例如 @Cacheable@CachePut@CacheEvict

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class MyService {@Cacheable("items")public Item getItemById(Long id) {// 模拟耗时操作return findItemById(id);}private Item findItemById(Long id) {// 实际的数据获取逻辑return new Item(id, "ItemName");}
}

5. 自定义 Redis 缓存管理器(可选)

如果需要自定义 Redis 缓存行为,可以定义一个 RedisCacheManager Bean。

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.redis.RedisCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());return template;}@Beanpublic CacheManager cacheManager(RedisConnectionFactory connectionFactory) {RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(connectionFactory);return builder.build();}
}

6. 部署和测试

确保 Redis 服务器在所有应用实例之间可访问,并在分布式环境中测试缓存功能。通过 Redis,缓存数据可以在多个应用实例之间共享,从而提高系统的性能和可扩展性。

通过这些步骤,你可以在 Spring Boot 应用程序中有效地使用 Redis 作为分布式缓存解决方案。

跨多个实例共享缓存数据

跨多个实例共享缓存数据是指在分布式系统中,多个应用实例能够访问和使用相同的缓存数据。这样可以提高系统的性能和一致性。以下是一个具体的例子来说明这一概念:

示例场景:电商网站

假设你有一个电商网站,它运行在多个服务器实例上,以处理大量的用户请求。每个服务器实例都运行相同的应用程序代码,并且需要访问相同的数据,比如产品信息、库存状态等。

问题
  • 高并发访问:当用户访问产品页面时,系统需要从数据库中获取产品信息。如果每个实例都直接访问数据库,可能会导致数据库负载过高,影响性能。
  • 数据一致性:如果某个实例更新了产品信息(例如库存减少),其他实例也需要及时获取到最新的数据。
解决方案:使用 Redis 共享缓存
  1. 部署 Redis 服务器:在网络中部署一个 Redis 服务器,作为集中式缓存存储。

  2. 配置应用实例:所有应用实例都配置连接到同一个 Redis 服务器。

  3. 缓存产品信息

    • 当用户请求产品信息时,首先检查 Redis 缓存中是否存在该信息。
    • 如果缓存中存在,则直接返回缓存数据,避免访问数据库。
    • 如果缓存中不存在,则从数据库中获取数据,并将其存储到 Redis 中,以便后续请求使用。
  4. 更新缓存

    • 当产品信息发生变化时(例如库存更新),应用实例会更新 Redis 中的缓存数据。
    • 这样,所有实例在下次请求时都能获取到最新的产品信息。
优势
  • 性能提升:通过缓存共享,减少了对数据库的直接访问,提高了系统的响应速度。
  • 一致性:所有实例访问到的数据是一致的,因为它们共享同一个缓存。
  • 资源节省:减少了每个实例需要维护的缓存数据量,节省了内存和计算资源。

通过这种方式,跨多个实例共享缓存数据可以显著提高系统的性能和可靠性,特别是在高并发和需要数据一致性的场景中。

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

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

相关文章

redis面试-2024

1、Redis的基本数据结构类型 string、list、set、hash、zet。还有三种特殊类型&#xff1a;Geospatial、Hyperloglog、bitMap。 2、各数据类型对应的场景 3、redis快的原因 *基于内存 内存读写效率远高于磁盘读写&#xff0c;省去磁盘IO操作 *存储形式 Redis作为K-V键值对…

SpringCloud学习记录|day2

学习材料 2024最新SpringCloud微服务开发与实战&#xff0c;java黑马商城项目微服务实战开发&#xff08;涵盖MybatisPlus、Docker、MQ、ES、Redis高级等&#xff09; Docker 部署工具。原来为了学习RabbitMQ安装过了。 但是忘记差不多了。 发现要回到root用户才能启动docke…

MFC有三个选项:MFC ActiveX控件、MFC应用程序、MFC DLL,如何选择?

深耕AI&#xff1a;互联网行业 算法研发工程师 ​ 目录 MFC ActiveX 控件 控件的类型 标准控件 自定义控件 ActiveX控件 MFC ActiveX控件 标准/自定义控件 MFC ActiveX控件分类 3种MFC如何选择&#xff1f; MFC ActiveX控件 MFC 应用程序 MFC DLL 总结 举例说明…

微信小程序处理交易投诉管理,支持多小程序

大家好&#xff0c;我是小悟 1、问题背景 玩过微信小程序生态的&#xff0c;或许就有这种感受&#xff0c;如果收到投诉单&#xff0c;不会及时通知到手机端&#xff0c;而是每天早上10:00向小程序的管理员及运营者推送通知。通知内容为截至前一天24时该小程序账号内待处理的交…

k8s基础环境部署

什么是k8s K8s&#xff0c;全称Kubernetes&#xff0c;是一个开源的容器编排平台&#xff0c;由谷歌&#xff08;Google&#xff09;开发并开源。Kubernetes这个名字源于希腊语&#xff0c;意为“舵手”或“飞行员”&#xff0c;而“k8s”这个缩写则是因为“k”和“s”之间有八…

vue中如何实现组件通信

1. 父子组件通信 1. props和emits 我们最常见的组件通信就是父子组件数据通信。父子组件实现数据通信需要使用props和emit两个api。 在父组件中我们通过props将数据绑定给子组件&#xff0c;在子组件中我们可以通过props对象来收集到父组件传递的数据。 在子组件想要修改的pr…

【目标检测】yolo的三种数据集格式

目标检测中数据集格式之间的相互转换--coco、voc、yolohttps://zhuanlan.zhihu.com/p/461488682?utm_mediumsocial&utm_psn1825483604463071232&utm_sourcewechat_session【目标检测】yolo的三种数据集格式https://zhuanlan.zhihu.com/p/525950939?utm_mediumsocial&…

【Unity】本地化实现

个人向笔记。 1 前言 记录一下自己的本地化实现思路&#xff0c;暂时只讲本文的本地化实现。 2 文本本地化方案-个人 本地化实现是基于Luban的。自己使用Luban实现了一个“配置表模块”&#xff0c;又实现了一个“全局配置模块”&#xff0c;之后再基于这两个模块实现了“文本…

【移植】一种快速移植OpenHarmony Linux内核的方法

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开…

基于Spring Boot+Vue的减肥健康管理系统设计和实现【原创】(BMI算法,协同过滤算法、图形化分析)

&#x1f388;系统亮点&#xff1a;图形化分析、BMI算法&#xff0c;协同过滤算法&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a…

计算机网络-系分(5)

目录 计算机网络 DNS解析 DHCP动态主机配置协议 网络规划与设计 层次化网络设计 网络冗余设计 综合布线系统 1. 双栈技术 2. 隧道技术 3. 协议转换技术 其他网络技术 DAS&#xff08;Direct Attached Storage&#xff0c;直连存储&#xff09; NAS&#xff08;Net…

Oracle RAC中停止has、crs、cluster的区别

1.首先介绍一下这3个服务 Has&#xff1a;是高可用服务&#xff0c;用在restart环境&#xff0c;可以是单机环境也可以是RAC环境&#xff0c;不管单机环境还是RAC环境&#xff0c;都可以执行crsctl check has&#xff0c;在RAC环境下&#xff0c;可以简单理解成cluster的一部分…

【Immich部署与访问】自托管媒体文件备份服务 Immich 本地化部署与远程访问存储数据

文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 本篇文章介绍如何在本地搭建lmmich图片管理软件&#xff0c;并结合cpolar内网穿透实现公网远程访问到局域网内的lmmich&#…

【环境配置】科研小白Windows下安装Git

2024年小白使用Win10安装Git 2.46.2教程&#xff1a; 1 下载安装包 访问下载地址 Git - Downloading Package (git-scm.com) 下载之后打开文件 2 安装过程 点击Next 2.1 选择安装路径 2.2 选择勾选必要组件 2.3 一路Next 这一步直接Next即可 继续点击Next 继续点击Ne…

计数相关的题 Python 力扣

2284. 最多单词数的发件人 给你一个聊天记录&#xff0c;共包含 n 条信息。给你两个字符串数组 messages 和 senders &#xff0c;其中 messages[i] 是 senders[i] 发出的一条 信息 。 一条 信息 是若干用单个空格连接的 单词 &#xff0c;信息开头和结尾不会有多余空格。发件…

从零开始Hadoop集群环境搭建

目录 1. Centos7.5硬件配置1.1 创建虚拟机1.2 虚拟机系统设置 2. IP地址和主机名称配置3. 软件配置3.1 安装 epel-release3.2 卸载虚拟机自带的JDK3.3 克隆虚拟机3.4 修改克隆虚拟机的IP3.5 JDK安装3.6 Hadoop安装 4. Hadoop目录结构 1. Centos7.5硬件配置 1.1 创建虚拟机 1.2…

SpringBoot基础(三):Logback日志

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 SpringBoot基础(三)&#xff1a;Logback日志 目录 一、日志依赖二、日志格式1、记录日志2、默认输出格式3、springboot默认日志配置 三、日志级别1、基础设置2、…

基于SSM的坚果金融投资管理系统、坚果金融投资管理平台的设计与开发、智慧金融投资管理系统的设计与实现、坚果金融投资管理系统的设计与应用研究(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

python爬虫 - 初识爬虫

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、爬虫的关键概念 &#xff08;一&#xff09;HTTP请求与响应 &#xff0…

Vue 3中的路由(Router)详解

在现代前端开发中&#xff0c;路由&#xff08;Routing&#xff09;是构建单页应用程序&#xff08;SPA&#xff09;的核心概念之一。他允许应用根据URL的变化动态地渲染不同的组件或页面。Vue.js提供了官方的路由管理工具——Vue Router。接下来这篇文章将逐步讲解Vue 3 中的路…