Spring Boot 集成 Redis 打造数据库查询缓存,性能腾飞!

打印 上一主题 下一主题

主题 846|帖子 846|积分 2538

Spring Boot 集成 Redis 打造数据库查询缓存,性能腾飞!

在当代 Web 应用开发中,数据库查询往往是性能瓶颈之一。频繁地访问数据库获取相同的数据不但消耗大量的数据库资源,还会拖慢整个应用的响应速度。而缓存技能的出现,就像是给应用加上了一层高速缓冲带,大大提高数据获取的效率。本文将详细先容如何在 Spring Boot 项目中集成 Redis,利用其强大的缓存功能优化数据库查询。
一、Redis 简介

Redis(Remote Dictionary Server)是一款开源的、基于内存的数据布局存储系统,它可以用作数据库、缓存和消息中心件。Redis 支持多种数据布局,如字符串、哈希、列表、集合、有序集合等,这使得它在处置惩罚各种复杂场景时游刃有余。其基于内存的特性保证了极高的数据读写速度,通常能到达毫秒级甚至微秒级别的响应,远快于传统关系型数据库基于磁盘的操作。
二、Spring Boot 项目搭建

首先,使用 Spring Initializr(https://start.spring.io/)快速创建一个底子的 Spring Boot 项目。选择你需要的依赖,至少包罗 Web 起步依赖用于构建 Web 应用,以及 Lombok(可选,但可以简化代码编写,自动生成 getter、setter 等方法)。
引入相关依赖后,项目的基本布局就搭建好了。在 application.properties 或 application.yml 配置文件中,配置项目的基本信息,如端标语等常规设置:
  1. server:
  2.   port: 8080
复制代码
三、引入 Redis 依赖

在 pom.xml 文件中添加 Redis 相关依赖:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>org.apache.commons</groupId>
  7.     <artifactId>commons-pool2</artifactId>
  8. </dependency>
复制代码
这里 spring-boot-starter-data-redis 是 Spring Boot 对 Redis 集成的核心依赖,它帮我们封装了大量与 Redis 交互的底层操作;commons-pool2 则用于提供连接池功能,优化与 Redis 的连接管理,提高性能。
四、配置 Redis 连接

同样在配置文件中,添加 Redis 连接配置:
  1. spring:
  2.   redis:
  3.     host: 127.0.0.1
  4.     port: 6379
  5.     password: your_password  # 如果没有设置密码,此行可省略
  6.     lettuce:
  7.       pool:
  8.         max-active: 8
  9.         max-idle: 8
  10.         min-idle: 0
  11.         max-wait: -1ms
复制代码
上述配置指定了 Redis 服务器的地址(host)、端口(port),假如设置了密码(password)也要一并填写。lettuce 相关配置是针对连接池的,例如 max-active 表现连接池中最大的活泼连接数,合理设置这些参数能制止资源浪费和性能题目。
五、编写数据访问层(DAO)

假设我们有一个简单的实体类 User,对应数据库中的 user 表:
  1. import lombok.Data;
  2. @Data
  3. public class User {
  4.     private Long id;
  5.     private String name;
  6.     private Integer age;
  7. }
复制代码
创建 UserRepository 接口用于操作数据库:
  1. import org.springframework.data.jpa.repository.JpaRepository;
  2. public interface UserRepository extends JpaRepository<User, Long> {
  3. }
复制代码
这里使用了 Spring Data JPA,它极大地简化了数据库访问操作,我们无需编写大量的 SQL 查询语句就能实现基本的 CRUD 功能。
六、集成 Redis 缓存


  • 配置缓存管理器
    创建 RedisConfig 类:
  1. import org.springframework.cache.CacheManager;
  2. import org.springframework.cache.annotation.CachingConfigurerSupport;
  3. import org.springframework.cache.annotation.EnableCaching;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.data.redis.cache.RedisCacheConfiguration;
  7. import org.springframework.data.redis.cache.RedisCacheManager;
  8. import org.springframework.data.redis.connection.RedisConnectionFactory;
  9. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
  10. import org.springframework.data.redis.serializer.RedisSerializationContext;
  11. import java.time.Duration;
  12. @Configuration
  13. @EnableCaching
  14. public class RedisConfig extends CachingConfigurerSupport {
  15.     @Bean
  16.     public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
  17.         RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
  18.                .entryTtl(Duration.ofMinutes(10))  // 设置缓存过期时间为 10 分钟
  19.                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
  20.                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
  21.         return RedisCacheManager.builder(redisConnectionFactory)
  22.                .cacheDefaults(cacheConfiguration)
  23.                .build();
  24.     }
  25. }
复制代码
这个配置类主要做了两件事:一是启用缓存(@EnableCaching),二是创建了一个自定义的缓存管理器。缓存管理器设置了缓存的默认过期时间为 10 分钟,并且指定了键(keys)和值(values)的序列化方式,这里使用 StringRedisSerializer 序列化键,确保兼容性和可读性;用 GenericJackson2JsonRedisSerializer 序列化值,方便存储复杂的 Java 对象。

  • 缓存数据库查询结果
    在 UserService 类中,对查询方法添加缓存注解:
  1. import org.springframework.cache.annotation.Cacheable;
  2. import org.springframework.stereotype.Service;
  3. import javax.annotation.Resource;
  4. import java.util.List;
  5. @Service
  6. public class UserService {
  7.     @Resource
  8.     private UserRepository userRepository;
  9.     @Cacheable(cacheNames = "userCache", key = "#root.method.name")
  10.     public List<User> findAllUsers() {
  11.         return userRepository.findAll();
  12.     }
  13. }
复制代码
@Cacheable 注解是关键,它告诉 Spring 在调用 findAllUsers 方法时,先检查名为 userCache 的缓存中是否存在结果。假如存在,直接从缓存中返回数据,不再执行方法体中的数据库查询操作;假如不存在,则执行数据库查询,将结果存入缓存,并返回给调用者。这里 key 指定了缓存的键,使用方法名作为键,确保每个查询方法有唯一标识。
七、测试缓存效果

编写一个简单的 UserController:
  1. import org.springframework.web.bind.annotation.GetMapping;
  2. import org.springframework.web.bind.annotation.RestController;
  3. import javax.annotation.Resource;
  4. import java.util.List;
  5. @RestController
  6. public class UserController {
  7.     @Resource
  8.     private UserService userService;
  9.     @GetMapping("/users")
  10.     public List<User> getUsers() {
  11.         return userService.findAllUsers();
  12.     }
  13. }
复制代码
启动项目后,第一次访问 /users 接口,会看到控制台输出数据库查询语句,由于此时缓存为空,需要从数据库获取数据。再次刷新页面访问该接口,控制台没有新的数据库查询语句输出,说明数据直接从缓存中获取,大大提高了响应速度。
通过以上步调,我们成功在 Spring Boot 项目中集成了 Redis 缓存,优化了数据库查询性能。在实际项目中,还可以根据业务需求进一步调整缓存策略,如缓存更新机制(当数据发生变化时如何实时更新缓存)、不同查询条件下的细粒度缓存设置等,让应用的性能更上一层楼。赶紧在你的项目中试试吧,感受缓存带来的强大威力!
以上完备示例代码结合了 Spring Boot、Redis、Spring Data JPA 等技能,希望能帮助开发者快速上手,办理数据库查询性能痛点,如有疑问欢迎在评论区交换探讨。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

渣渣兔

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表