springboot如何通过提供的注解方式来操作Redis

1.启用Redis注解支持

首先需要在配置类上添加 @EnableCaching 注解:

复制代码
@Configuration
@EnableCaching
public class RedisConfig {
    // 其他配置...
}

2.常用Redis操作注解

@Cacheable - 缓存查询

复制代码
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
    // 如果缓存中没有,则执行方法并将结果存入缓存
    return userRepository.findById(id).orElse(null);
}

参数说明:

  • value/cacheNames:缓存名称
  • key:缓存键,支持 SpEL 表达式
  • condition:条件缓存,满足条件才缓存
  • unless:条件不缓存,满足条件不缓存

@CachePut - 更新缓存

复制代码
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
    // 更新数据库后,同时更新缓存
    return userRepository.save(user);
}

@CacheEvict - 删除缓存

复制代码
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
    // 删除数据库记录后,同时删除缓存
    userRepository.deleteById(id);
}

@Caching - 组合多个缓存操作

复制代码
@Caching(
    cacheable = @Cacheable(value = "users", key = "#username"),
    evict = @CacheEvict(value = "userList", allEntries = true)
)
public User getUserByUsername(String username) {
    // 复杂缓存操作
    return userRepository.findByUsername(username);
}

3.自定义Key生成器

可以自定义缓存键生成策略:

复制代码
@Configuration
public class RedisConfig {
    
    @Bean
    public KeyGenerator customKeyGenerator() {
        return (target, method, params) -> {
            StringBuilder sb = new StringBuilder();
            sb.append(target.getClass().getName());
            sb.append(method.getName());
            for (Object obj : params) {
                sb.append(obj.toString());
            }
            return sb.toString();
        };
    }
}

使用自定义 Key 生成器:

复制代码
@Cacheable(value = "users", keyGenerator = "customKeyGenerator")
public User getUserByEmail(String email) {
    // ...
}

4.条件缓存示例

复制代码
@Cacheable(value = "users", key = "#id", 
           condition = "#id > 10", unless = "#result == null")
public User getUserWithCondition(Long id) {
    // 只有当id>10时才缓存,且结果不为null时才缓存
    return userRepository.findById(id).orElse(null);
}

5.配置Redis连接

在 application.properties 或 application.yml 中配置 Redis:

复制代码
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0

6.Redis依赖

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 被注解的方法需要是 public 方法
  2. 自调用(同一个类中方法调用)不会触发缓存注解
  3. 对于复杂对象,确保实现了 Serializable 接口
相关推荐
文丑颜不良啊11 分钟前
LeetCode851~875题目解析
java·leetcode
技术老孙13 分钟前
给 Agent 装上对话框 —— AgentScope-Java 接入 Spring Boot 与 SSE 流式实战
java·开发语言·spring boot
指剑1 小时前
亚麻云之EC2——安全组与密钥对:SSH 端口怎么开才安全,Permission denied (publickey) 和连接超时排查
java·安全·ssh
_Evan_Yao9 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd9 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼9 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
thefool11226610 小时前
TCP 1
java·1024程序员节
Lucis__11 小时前
Redis持久化机制解析
redis·缓存·操作系统·文件·非关系型数据库·1024程序员节
paopaokaka_luck12 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
金銀銅鐵12 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程