Spring Boot + Redis 注解极简教程:5分钟搞定CRUD操作

Spring Boot 整合 Redis 注解实现简单 CRUD

零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目

一、项目搭建

零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目

1.1 添加依赖

xml 复制代码
<!-- pom.xml -->
<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- Spring Boot Redis -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    <!-- Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

1.2 配置文件

yaml 复制代码
# application.yml
spring:
  redis:
    host: localhost
    port: 6379
    database: 0
    
server:
  port: 8080

二、实体类

kotlin 复制代码
package com.example.entity;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;
import java.io.Serializable;

/**
 * @RedisHash: 声明实体类,value指定Redis中的key前缀
 * 存储格式: user:{id}
 */
@Data
@RedisHash("user")
public class User implements Serializable {
    
    @Id
    private Long id;            // 主键
    
    @Indexed
    private String username;    // 创建索引,可以按username查询
    
    private String email;
    
    private Integer age;
}

三、Repository 接口

java 复制代码
package com.example.repository;

import com.example.entity.User;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;

/**
 * CrudRepository 提供基本的CRUD方法
 * 可以根据方法名自动生成查询
 */
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    
    // 根据用户名查询(精确匹配)
    List<User> findByUsername(String username);
    
    // 根据邮箱查询
    Optional<User> findByEmail(String email);
    
    // 根据年龄范围查询
    List<User> findByAgeBetween(Integer minAge, Integer maxAge);
    
    // 删除指定用户名的用户
    Long deleteByUsername(String username);
}

四、Service 层

零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目

kotlin 复制代码
package com.example.service;

import com.example.entity.User;
import com.example.repository.UserRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.*;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;

@Slf4j
@Service
@CacheConfig(cacheNames = "user")  // 类级别缓存配置
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    /**
     * @Cacheable: 查询缓存
     * 1. 先查缓存,有则直接返回
     * 2. 无则执行方法,将结果存入缓存
     */
    @Cacheable(key = "#id")
    public User findById(Long id) {
        log.info("查询数据库,用户ID: {}", id);
        return userRepository.findById(id).orElse(null);
    }
    
    /**
     * 查询所有用户
     */
    public List<User> findAll() {
        return (List<User>) userRepository.findAll();
    }
    
    /**
     * 根据用户名查询
     */
    public List<User> findByUsername(String username) {
        return userRepository.findByUsername(username);
    }
    
    /**
     * @CachePut: 更新缓存
     * 每次都会执行方法,并将结果更新到缓存
     */
    @CachePut(key = "#user.id")
    public User save(User user) {
        log.info("保存用户: {}", user.getUsername());
        return userRepository.save(user);
    }
    
    /**
     * @CacheEvict: 删除缓存
     * 方法执行后删除指定key的缓存
     */
    @CacheEvict(key = "#id")
    public void deleteById(Long id) {
        log.info("删除用户,ID: {}", id);
        userRepository.deleteById(id);
    }
    
    /**
     * 更新用户
     */
    @Caching(
        put = @CachePut(key = "#user.id"),
        evict = @CacheEvict(key = "'list'")  // 清除列表缓存
    )
    public User update(User user) {
        log.info("更新用户: {}", user.getId());
        return userRepository.save(user);
    }
    
    /**
     * 缓存用户列表
     */
    @Cacheable(key = "'list'")
    public List<User> findAllWithCache() {
        log.info("查询所有用户(带缓存)");
        return (List<User>) userRepository.findAll();
    }
}

五、Controller 层

less 复制代码
package com.example.controller;

import com.example.entity.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    // 新增用户
    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.save(user);
    }
    
    // 根据ID查询用户
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.findById(id);
    }
    
    // 查询所有用户
    @GetMapping
    public List<User> getAllUsers() {
        return userService.findAllWithCache();
    }
    
    // 根据用户名查询
    @GetMapping("/search")
    public List<User> getUserByUsername(@RequestParam String username) {
        return userService.findByUsername(username);
    }
    
    // 更新用户
    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        return userService.update(user);
    }
    
    // 删除用户
    @DeleteMapping("/{id}")
    public String deleteUser(@PathVariable Long id) {
        userService.deleteById(id);
        return "删除成功";
    }
}

六、主启动类

typescript 复制代码
package com.example;

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

@SpringBootApplication
@EnableCaching  // 开启缓存支持
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

七、测试示例

7.1 使用 Postman 测试

1. 新增用户
bash 复制代码
POST http://localhost:8080/api/users
Content-Type: application/json

{
    "username": "张三",
    "email": "zhangsan@example.com",
    "age": 25
}
2. 查询用户
bash 复制代码
GET http://localhost:8080/api/users/1
3. 查询所有用户
bash 复制代码
GET http://localhost:8080/api/users
4. 更新用户
bash 复制代码
PUT http://localhost:8080/api/users/1
Content-Type: application/json

{
    "username": "张三",
    "email": "zhangsan_new@example.com",
    "age": 26
}
5. 删除用户

零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目

bash 复制代码
DELETE http://localhost:8080/api/users/1

八、注解总结

注解 作用 示例
@RedisHash 实体类映射到Redis Hash @RedisHash("user")
@Id 标记主键字段 @Id private Long id;
@Indexed 创建二级索引,支持字段查询 @Indexed private String username;
@EnableCaching 启用缓存(主类上) @EnableCaching
@Cacheable 方法结果缓存 @Cacheable(key = "#id")
@CachePut 更新缓存 @CachePut(key = "#user.id")
@CacheEvict 删除缓存 @CacheEvict(key = "#id")
@Caching 组合多个缓存操作 见上面Service中的update方法

九、运行效果

  1. 第一次查询用户(1) :控制台打印日志"查询数据库"
  2. 第二次查询用户(1) :直接从缓存返回,不打印日志
  3. 更新用户(1) :更新数据库,并更新缓存
  4. 删除用户(1) :删除数据库记录,并清除缓存

十、注意事项

零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目

  1. 实体类必须实现 Serializable接口
  2. 缓存注解的方法必须是 public
  3. 同一个类内部调用缓存注解的方法不会生效
  4. Redis 需要提前安装并启动

这个示例包含了最基本的 Redis 注解 CRUD 操作,可以直接运行使用。

相关推荐
子玖1 分钟前
go实现通过ip解析城市
后端·go
Java不加班8 分钟前
Java 后端定时任务实现方案与工程化指南
后端
心在飞扬36 分钟前
RAG 进阶检索学习笔记
后端
Moment37 分钟前
想要长期陪伴你的助理?先从部署一个 OpenClaw 开始 😍😍😍
前端·后端·github
Das1_39 分钟前
【Golang 数据结构】Slice 底层机制
后端·go
得物技术39 分钟前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark
古时的风筝41 分钟前
花10 分钟时间,把终端改造成“生产力武器”:Ghostty + Yazi + Lazygit 配置全流程
前端·后端·程序员
Cache技术分享41 分钟前
340. Java Stream API - 理解并行流的额外开销
前端·后端
初次攀爬者44 分钟前
RocketMQ 消息可靠性保障与堆积处理
后端·消息队列·rocketmq
ygxb1 小时前
如何去创建一个规范化的Agent SKIll?
后端·ai编程·claude