跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Boot 缓存与性能优化

Spring Boot 中缓存与性能优化的核心概念及集成方法。内容包括缓存与性能优化的定义、Spring Cache 与 Redis 的集成步骤、以及实际应用场景示例。通过代码演示了如何使用 @Cacheable、@CachePut 和 @CacheEvict 注解实现数据缓存,并对比了内存缓存与分布式缓存的配置差异,旨在帮助开发者提升应用响应速度与吞吐量。

赛博朋克发布于 2026/3/29更新于 2026/8/1745 浏览
Spring Boot 缓存与性能优化

Spring Boot 缓存与性能优化

学习目标与重点提示

学习目标:掌握 Spring Boot 缓存与性能优化的核心概念与使用方法,包括缓存的定义与特点、性能优化的定义与特点、Spring Boot 与缓存的集成、Spring Boot 的实际应用场景,学会在实际开发中处理缓存与性能优化问题。

重点:

  • 缓存的定义与特点
  • 性能优化的定义与特点
  • Spring Boot 与缓存的集成
  • Spring Boot 的实际应用场景

缓存与性能优化概述

缓存与性能优化是 Java 开发中的重要组件,用于提高应用程序的响应速度和吞吐量。

缓存的定义

定义:缓存是一种用于存储数据的临时存储区,用于提高数据的访问速度。

作用:

  • 减少数据库的访问压力。
  • 提高应用程序的响应速度。
  • 提高应用程序的吞吐量。

常见的缓存:

  • 内存缓存:包括 ConcurrentHashMap 和 Guava Cache。
  • 分布式缓存:包括 Redis 和 Memcached。
  • 浏览器缓存:包括 HTTP 缓存和浏览器本地存储。

结论:缓存是一种用于存储数据的临时存储区,作用是减少数据库的访问压力、提高应用程序的响应速度、提高应用程序的吞吐量。

性能优化的定义

定义:性能优化是指对应用程序进行优化,以提高其响应速度和吞吐量。

作用:

  • 提高用户体验。
  • 减少服务器的资源消耗。
  • 提高系统的可靠性。

常见的性能优化方法:

  • 缓存优化:使用缓存减少数据库的访问压力。
  • 数据库优化:优化数据库的查询语句和索引。
  • 代码优化:优化代码的结构和逻辑。
  • 服务器优化:优化服务器的配置和资源分配。

结论:性能优化是指对应用程序进行优化,作用是提高用户体验、减少服务器的资源消耗、提高系统的可靠性。

Spring Boot 与缓存的集成

Spring Boot 与缓存的集成是 Java 开发中的重要内容。

集成 Spring Cache 的步骤

定义:集成 Spring Cache 的步骤是指使用 Spring Boot 与 Spring Cache 集成的方法。

步骤:

  1. 创建 Spring Boot 项目。
  2. 添加所需的依赖。
  3. 配置缓存。
  4. 创建业务层。
  5. 创建控制器类。
  6. 测试应用。

示例:

pom.xml 文件中的依赖:

<dependencies>
    <!-- Web 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 缓存依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <!-- 测试依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

application.properties 文件中的配置:

# 服务器端口
server.port=8080

实体类:

public class Product {
    private Long id;
    private String productId;
    private String productName;
    private double price;
    private int stock;

    public Product() {}

    public Product(Long id, String productId, String productName, double price, int stock) {
        this.id = id;
        this.productId = productId;
        this.productName = productName;
        this.price = price;
        this.stock = stock;
    }

    // Getter 和 Setter 方法
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getProductId() { return productId; }
    public void setProductId(String productId) { this.productId = productId; }
    public String getProductName() { return productName; }
    public void setProductName(String productName) { this.productName = productName; }
    public double getPrice() { return price; }
    public void setPrice(double price) { this.price = price; }
    public int getStock() { return stock; }
    public void setStock(int stock) { this.stock = stock; }

    @Override
    public String toString() {
        return "Product{" +
                "id=" + id +
                ", productId='" + productId + '\'' +
                ", productName='" + productName + '\'' +
                ", price=" + price +
                ", stock=" + stock +
                '}';
    }
}

Repository 接口:

import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Repository
public class ProductRepository {
    private List<Product> products = new ArrayList<>();

    public ProductRepository() {
        products.add(new Product(1L, "P001", "手机", 1000.0, 100));
        products.add(new Product(2L, "P002", "电脑", 5000.0, 50));
        products.add(new Product(3L, "P003", "电视", 3000.0, 80));
        products.add(new Product(4L, "P004", "手表", 500.0, 200));
        products.add(new Product(5L, "P005", "耳机", 300.0, 150));
    }

    public List<Product> getAllProducts() {
        // 模拟数据库查询,延迟 1 秒
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return products;
    }

    public Product getProductById(Long id) {
        // 模拟数据库查询,延迟 1 秒
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return products.stream().filter(product -> product.getId().equals(id)).findFirst().orElse(null);
    }

    public void addProduct(Product product) {
        product.setId((long) (products.size() + 1));
        products.add(product);
    }

    public void updateProduct(Product product) {
        Product existingProduct = getProductById(product.getId());
        if (existingProduct != null) {
            existingProduct.setProductId(product.getProductId());
            existingProduct.setProductName(product.getProductName());
            existingProduct.setPrice(product.getPrice());
            existingProduct.setStock(product.getStock());
        }
    }

    public void deleteProduct(Long id) {
        products.removeIf(product -> product.getId().equals(id));
    }
}

Service 类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class ProductService {
    @Autowired
    private ProductRepository productRepository;

    @Cacheable(value = "products")
    public List<Product> getAllProducts() {
        System.out.println("从数据库查询所有产品信息");
        return productRepository.getAllProducts();
    }

    @Cacheable(value = "product", key = "#id")
    public Product getProductById(Long id) {
        System.out.println("从数据库查询产品信息:" + id);
        return productRepository.getProductById(id);
    }

    @CachePut(value = "product", key = "#product.id")
    public Product addProduct(Product product) {
        System.out.println("添加产品信息:" + product);
        productRepository.addProduct(product);
        return product;
    }

    @CachePut(value = "product", key = "#product.id")
    public Product updateProduct(Product product) {
        System.out.println("更新产品信息:" + product);
        productRepository.updateProduct(product);
        return product;
    }

    @CacheEvict(value = "product", key = "#id")
    public void deleteProduct(Long id) {
        System.out.println("删除产品信息:" + id);
        productRepository.deleteProduct(id);
    }
}

控制器类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("/api/products")
public class ProductController {
    @Autowired
    private ProductService productService;

    @GetMapping("/")
    public List<Product> getAllProducts() {
        return productService.getAllProducts();
    }

    @GetMapping("/{id}")
    public Product getProductById(@PathVariable Long id) {
        return productService.getProductById(id);
    }

    @PostMapping("/add")
    public Product addProduct(@RequestBody Product product) {
        return productService.addProduct(product);
    }

    @PutMapping("/edit/{id}")
    public Product editProduct(@PathVariable Long id, @RequestBody Product product) {
        product.setId(id);
        return productService.updateProduct(product);
    }

    @DeleteMapping("/delete/{id}")
    public void deleteProduct(@PathVariable Long id) {
        productService.deleteProduct(id);
    }
}

应用启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class CacheApplication {
    public static void main(String[] args) {
        SpringApplication.run(CacheApplication.class, args);
    }
}

测试类:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class CacheApplicationTests {
    @LocalServerPort
    private int port;

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    void contextLoads() {}

    @Test
    void testGetAllProducts() {
        // 第一次访问,从数据库查询
        List<Product> products1 = restTemplate.getForObject("http://localhost:" + port + "/api/products/", List.class);
        assertThat(products1).hasSize(5);
        // 第二次访问,从缓存获取
        List<Product> products2 = restTemplate.getForObject("http://localhost:" + port + "/api/products/", List.class);
        assertThat(products2).hasSize(5);
    }

    @Test
    void testGetProductById() {
        // 第一次访问,从数据库查询
        Product product1 = restTemplate.getForObject("http://localhost:" + port + "/api/products/1", Product.class);
        assertThat(product1).isNotNull();
        // 第二次访问,从缓存获取
        Product product2 = restTemplate.getForObject("http://localhost:" + port + "/api/products/1", Product.class);
        assertThat(product2).isNotNull();
    }
}

结论:集成 Spring Cache 的步骤包括创建 Spring Boot 项目、添加所需的依赖、配置缓存、创建业务层、创建控制器类、测试应用。

集成 Redis 缓存的步骤

定义:集成 Redis 缓存的步骤是指使用 Spring Boot 与 Redis 缓存集成的方法。

步骤:

  1. 创建 Spring Boot 项目。
  2. 添加所需的依赖。
  3. 配置 Redis。
  4. 创建业务层。
  5. 创建控制器类。
  6. 测试应用。

示例:

pom.xml 文件中的依赖:

<dependencies>
    <!-- Web 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 缓存依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <!-- Redis 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!-- 测试依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

application.properties 文件中的配置:

# 服务器端口
server.port=8080
# Redis 连接信息
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0

实体类、Repository 接口、Service 类、控制器类、应用启动类及测试类代码逻辑与上述 Spring Cache 集成类似,主要区别在于启动类名称及依赖配置。此处省略重复代码,重点在于 Redis 依赖的引入与配置。

结论:集成 Redis 缓存的步骤包括创建 Spring Boot 项目、添加所需的依赖、配置 Redis、创建业务层、创建控制器类、测试应用。

Spring Boot 的实际应用场景

在实际开发中,Spring Boot 缓存与性能优化的应用场景非常广泛,如:

  • 实现产品信息的缓存优化。
  • 实现用户信息的缓存优化。
  • 实现订单信息的缓存优化。
  • 实现支付信息的缓存优化。

示例: (参考上文 Service 类与 Controller 类代码)

输出结果:

  • 第一次访问 http://localhost:8080/api/products/,控制台输出:从数据库查询所有产品信息,响应时间约 1 秒。
  • 第二次访问 http://localhost:8080/api/products/,控制台无输出,响应时间约 0 毫秒。

结论:在实际开发中,Spring Boot 缓存与性能优化的应用场景非常广泛,需要根据实际问题选择合适的缓存和性能优化方法。

总结

本章我们学习了 Spring Boot 缓存与性能优化,包括缓存的定义与特点、性能优化的定义与特点、Spring Boot 与缓存的集成、Spring Boot 的实际应用场景,学会了在实际开发中处理缓存与性能优化问题。其中,缓存的定义与特点、性能优化的定义与特点、Spring Boot 与缓存的集成、Spring Boot 的实际应用场景是本章的重点内容。从下一章开始,我们将学习 Spring Boot 的其他组件、微服务等内容。

目录

  1. Spring Boot 缓存与性能优化
  2. 学习目标与重点提示
  3. 缓存与性能优化概述
  4. 缓存的定义
  5. 性能优化的定义
  6. Spring Boot 与缓存的集成
  7. 集成 Spring Cache 的步骤
  8. 服务器端口
  9. 集成 Redis 缓存的步骤
  10. 服务器端口
  11. Redis 连接信息
  12. Spring Boot 的实际应用场景
  13. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • GitHub Copilot 网络配置与代理部署实战指南
  • Linux 中使用 Qwen Code CLI 工具
  • DeepSeek 以百万年薪招募顶尖 AI 人才
  • Nitter 私有部署指南:搭建无广告 Twitter 前端
  • SpringMVC 获取 HTTP 请求元素详解
  • 夸克网盘精选资源:书籍软件游戏与 AI 学习资料
  • Python 在 Windows 上的安装与 PyCharm 配置指南
  • 消失的两个数字(位运算解法)
  • Fun-ASR 在中文普通话任务准确率超越 Whisper-small 近 5 个百分点
  • 基于 Whisper-large-v3 的多语言翻译系统开发
  • C++类型转换操作符与IO流体系解析
  • 企业级 AI 大模型私有化部署指南与方案
  • Java Swing 图书管理系统(MySQL 版)
  • 二叉树 DFS 递归解题套路
  • 深圳 2015 年 3 月软件开发人员薪资水平分析
  • 命令行大模型交互工具 MCPHost 配置与实战指南
  • OpenClaw 配置本地 Ollama 模型指南:打造离线个人 AI 助理
  • LazyLLM 低代码框架实战:代码专家智能体开发
  • Flutter EWS 组件适配鸿蒙实战:Exchange 邮件日历同步方案
  • 前后端分离与不分离架构对比分析

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online