在Spring Boot中集成Redis进行缓存

在Spring Boot中集成Redis进行缓存,主要分为以下步骤:


1. 添加依赖

pom.xml中添加Redis和缓存相关的依赖:

xml 复制代码
<!-- Spring Boot Redis Starter -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<!-- 可选:对象序列化支持(如Jackson) -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

2. 配置Redis连接

application.propertiesapplication.yml中配置Redis服务器信息:

properties 复制代码
# Redis基础配置
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=  # 若无密码则留空
spring.redis.database=0

# 连接池配置(可选)
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0

3. 启用缓存功能

在启动类上添加@EnableCaching注解:

java 复制代码
@SpringBootApplication
@EnableCaching // 启用缓存
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

4. 配置缓存管理器(可选但推荐)

自定义Redis缓存配置(如设置过期时间、序列化方式):

java 复制代码
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Bean
    public RedisCacheConfiguration cacheConfiguration() {
        return RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(10)) // 默认缓存过期时间:10分钟
            .disableCachingNullValues() // 不缓存null值
            .serializeValuesWith(
                RedisSerializationContext.SerializationPair.fromSerializer(
                    new GenericJackson2JsonRedisSerializer() // 使用JSON序列化
                )
            );
    }
}

5. 在Service层使用缓存注解

在需要缓存的方法上添加Spring Cache注解:

注解 作用
@Cacheable 查询时优先读缓存,无缓存则执行方法并保存结果
@CachePut 每次执行方法并更新缓存(常用于更新操作)
@CacheEvict 删除缓存(常用于删除或更新操作)

示例代码:

java 复制代码
@Service
public class UserService {

    // 根据ID查询用户(结果缓存到"users"区域,key为#id)
    @Cacheable(value = "users", key = "#id")
    public User getUserById(Long id) {
        // 模拟数据库查询
        return userRepository.findById(id).orElse(null);
    }

    // 更新用户信息(同时更新缓存)
    @CachePut(value = "users", key = "#user.id")
    public User updateUser(User user) {
        return userRepository.save(user);
    }

    // 删除用户(同时移除缓存)
    @CacheEvict(value = "users", key = "#id")
    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }

    // 清除"users"区域所有缓存(如批量更新后)
    @CacheEvict(value = "users", allEntries = true)
    public void clearAllUserCache() {}
}

6. 验证缓存效果

  • 观察日志:首次查询会访问数据库,后续相同请求不会打印SQL。

  • Redis命令行检查

    bash 复制代码
    redis-cli
    > KEYS *      # 查看所有缓存键
    > GET "users::1"  # 查看key为1的用户缓存
  • 强制刷新缓存:更新数据后,检查缓存是否被清除/更新。


常见问题解决

  1. 序列化异常

    • 确保实体类实现java.io.Serializable接口。
    • 使用JSON序列化(如GenericJackson2JsonRedisSerializer)。
  2. 缓存穿透

    • 对空结果也进行短时间缓存(需自定义配置)。

    • 使用@Cacheableunless参数:

      java 复制代码
      @Cacheable(value="users", unless="#result == null")
  3. 缓存一致性

    • 更新数据库后立即清除或更新缓存(通过@CachePut/@CacheEvict)。

通过以上步骤,即可在Spring Boot中高效集成Redis实现缓存功能,显著提升应用性能。

相关推荐
皮皮林55113 小时前
SpringBoot 全局/局部双模式 Gzip 压缩实战:14MB GeoJSON 秒变 3MB
java·spring boot
利刃大大13 小时前
【高并发内存池】五、页缓存的设计
c++·缓存·项目·内存池
weixin_4569042713 小时前
Spring Boot 用户管理系统
java·spring boot·后端
Heliotrope_Sun13 小时前
Redis
数据库·redis·缓存
奔跑吧邓邓子13 小时前
【Java实战㉞】从0到1:Spring Boot Web开发与接口设计实战
java·spring boot·实战·web开发·接口设计
茶本无香14 小时前
深入理解Spring Boot的EnvironmentPostProcessor:环境处理的黑科技
spring boot
奔跑吧邓邓子14 小时前
【Java实战㉝】Spring Boot实战:从入门到自动配置的进阶之路
java·spring boot·实战·自动配置
ONLYOFFICE14 小时前
【技术教程】如何将ONLYOFFICE文档集成到使用Spring Boot框架编写的Java Web应用程序中
java·spring boot·编辑器
boonya16 小时前
Redis核心原理与面试问题解析
数据库·redis·面试
上官浩仁16 小时前
springboot redisson 缓存入门与实战
spring boot·redis·缓存