在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实现缓存功能,显著提升应用性能。

相关推荐
舒一笑6 分钟前
Started TttttApplication in 0.257 seconds (没有 Web 依赖导致 JVM 正常退出)
jvm·spring boot·后端
189228048611 小时前
NY243NY253美光固态闪存NY257NY260
大数据·网络·人工智能·缓存
javadaydayup2 小时前
Apollo 凭什么能 “干掉” 本地配置?
spring boot·后端·spring
AAA修煤气灶刘哥2 小时前
搞定 Redis 不难:从安装到实战的保姆级教程
java·redis·后端
青鱼入云2 小时前
redis怎么做rehash的
redis·缓存
FFF-X2 小时前
Vue3 路由缓存实战:从基础到进阶的完整指南
vue.js·spring boot·缓存
考虑考虑3 小时前
Redis事务
redis·后端
陈天cjq10 小时前
Redis 实用型限流与延时队列:从 Lua 固定/滑动窗口到 Streams 消费组(含脚本与压测)
redis·junit·lua
Warren9810 小时前
Lua 脚本在 Redis 中的应用
java·前端·网络·vue.js·redis·junit·lua
xiao-xiang11 小时前
redis-保姆级配置详解
数据库·redis