news 2026/4/7 19:18:43

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot + Redis 注解极简教程:5分钟搞定CRUD操作

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

可以关注:小坏说Java 公众号

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

一、项目搭建

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

1.1 添加依赖

<!-- 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 配置文件

# application.ymlspring:redis:host:localhostport:6379database:0server:port:8080

二、实体类

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

packagecom.example.entity;importlombok.Data;importorg.springframework.data.annotation.Id;importorg.springframework.data.redis.core.RedisHash;importorg.springframework.data.redis.core.index.Indexed;importjava.io.Serializable;/** * @RedisHash: 声明实体类,value指定Redis中的key前缀 * 存储格式: user:{id} */@Data@RedisHash("user")publicclassUserimplementsSerializable{@IdprivateLongid;// 主键@IndexedprivateStringusername;// 创建索引,可以按username查询privateStringemail;privateIntegerage;}

三、Repository 接口

packagecom.example.repository;importcom.example.entity.User;importorg.springframework.data.repository.CrudRepository;importorg.springframework.stereotype.Repository;importjava.util.List;importjava.util.Optional;/** * CrudRepository 提供基本的CRUD方法 * 可以根据方法名自动生成查询 */@RepositorypublicinterfaceUserRepositoryextendsCrudRepository<User,Long>{// 根据用户名查询(精确匹配)List<User>findByUsername(Stringusername);// 根据邮箱查询Optional<User>findByEmail(Stringemail);// 根据年龄范围查询List<User>findByAgeBetween(IntegerminAge,IntegermaxAge);// 删除指定用户名的用户LongdeleteByUsername(Stringusername);}

四、Service 层

packagecom.example.service;importcom.example.entity.User;importcom.example.repository.UserRepository;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.cache.annotation.*;importorg.springframework.stereotype.Service;importjava.util.List;importjava.util.Optional;@Slf4j@Service@CacheConfig(cacheNames="user")// 类级别缓存配置publicclassUserService{@AutowiredprivateUserRepositoryuserRepository;/** * @Cacheable: 查询缓存 * 1. 先查缓存,有则直接返回 * 2. 无则执行方法,将结果存入缓存 */@Cacheable(key="#id")publicUserfindById(Longid){log.info("查询数据库,用户ID: {}",id);returnuserRepository.findById(id).orElse(null);}/** * 查询所有用户 */publicList<User>findAll(){return(List<User>)userRepository.findAll();}/** * 根据用户名查询 */publicList<User>findByUsername(Stringusername){returnuserRepository.findByUsername(username);}/** * @CachePut: 更新缓存 * 每次都会执行方法,并将结果更新到缓存 */@CachePut(key="#user.id")publicUsersave(Useruser){log.info("保存用户: {}",user.getUsername());returnuserRepository.save(user);}/** * @CacheEvict: 删除缓存 * 方法执行后删除指定key的缓存 */@CacheEvict(key="#id")publicvoiddeleteById(Longid){log.info("删除用户,ID: {}",id);userRepository.deleteById(id);}/** * 更新用户 */@Caching(put=@CachePut(key="#user.id"),evict=@CacheEvict(key="'list'")// 清除列表缓存)publicUserupdate(Useruser){log.info("更新用户: {}",user.getId());returnuserRepository.save(user);}/** * 缓存用户列表 */@Cacheable(key="'list'")publicList<User>findAllWithCache(){log.info("查询所有用户(带缓存)");return(List<User>)userRepository.findAll();}}

五、Controller 层

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

packagecom.example.controller;importcom.example.entity.User;importcom.example.service.UserService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;importjava.util.List;@RestController@RequestMapping("/api/users")publicclassUserController{@AutowiredprivateUserServiceuserService;// 新增用户@PostMappingpublicUsercreateUser(@RequestBodyUseruser){returnuserService.save(user);}// 根据ID查询用户@GetMapping("/{id}")publicUsergetUserById(@PathVariableLongid){returnuserService.findById(id);}// 查询所有用户@GetMappingpublicList<User>getAllUsers(){returnuserService.findAllWithCache();}// 根据用户名查询@GetMapping("/search")publicList<User>getUserByUsername(@RequestParamStringusername){returnuserService.findByUsername(username);}// 更新用户@PutMapping("/{id}")publicUserupdateUser(@PathVariableLongid,@RequestBodyUseruser){user.setId(id);returnuserService.update(user);}// 删除用户@DeleteMapping("/{id}")publicStringdeleteUser(@PathVariableLongid){userService.deleteById(id);return"删除成功";}}

六、主启动类

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

packagecom.example;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cache.annotation.EnableCaching;@SpringBootApplication@EnableCaching// 开启缓存支持publicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}

七、测试示例

7.1 使用 Postman 测试

1. 新增用户
POST http://localhost:8080/api/users Content-Type: application/json { "username": "张三", "email": "zhangsan@example.com", "age": 25 }
2. 查询用户
GET http://localhost:8080/api/users/1
3. 查询所有用户
GET http://localhost:8080/api/users
4. 更新用户
PUT http://localhost:8080/api/users/1 Content-Type: application/json { "username": "张三", "email": "zhangsan_new@example.com", "age": 26 }
5. 删除用户
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方法

九、运行效果

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

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

十、注意事项

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 12:09:08

FaceFusion对抗生成网络结构解析:GAN如何提升真实感?

FaceFusion对抗生成网络结构解析&#xff1a;GAN如何提升真实感&#xff1f; 在影视特效、虚拟主播乃至社交娱乐内容创作中&#xff0c;我们越来越频繁地看到“换脸”技术的身影。从早期粗糙的图像拼接&#xff0c;到如今几乎以假乱真的视频级人脸替换&#xff0c;背后的核心驱…

作者头像 李华
网站建设 2026/4/3 6:23:39

【Open-AutoGLM实战指南】:3步构建高精度指令执行管道

第一章&#xff1a;Open-AutoGLM指令到操作转化流程概述Open-AutoGLM 是一个面向自动化任务执行的指令解析与操作映射框架&#xff0c;能够将自然语言指令高效转化为可执行的操作序列。该系统通过语义理解、上下文推理和动作规划三个核心阶段&#xff0c;实现从用户输入到系统响…

作者头像 李华
网站建设 2026/4/1 20:55:07

GESP认证C++编程真题解析 | B3874 [GESP202309 六级] 小杨的握手问题

​欢迎大家订阅我的专栏&#xff1a;算法题解&#xff1a;C与Python实现&#xff01; 本专栏旨在帮助大家从基础到进阶 &#xff0c;逐步提升编程能力&#xff0c;助力信息学竞赛备战&#xff01; 专栏特色 1.经典算法练习&#xff1a;根据信息学竞赛大纲&#xff0c;精心挑选…

作者头像 李华
网站建设 2026/3/28 21:18:48

DNS渗透测试完全指南:10大技术详解,一文精通DNS安全测试

在浩瀚的互联网海洋中&#xff0c;DNS&#xff08;域名系统&#xff09;犹如一本隐形的通讯录&#xff0c;默默地将我们熟悉的网站域名转换为计算机能够理解的IP地址。每当我们输入"www.example.com"这样的网址时&#xff0c;正是DNS在幕后完成了这一神奇的翻译工作。…

作者头像 李华
网站建设 2026/3/31 8:41:22

2025年零基础转行网络安全:从入门到精分的全路径规划指南,哪些技能才能带你实现弯道超车?

写在前面 网络安全是一个日益增长的行业&#xff0c;对于打算进入或转行进入该领域的人来说&#xff0c;制定一个清晰且系统的职业规划非常重要。2025年&#xff0c;网络安全领域将继续发展并面临新的挑战&#xff0c;包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下…

作者头像 李华
网站建设 2026/4/7 14:16:16

24、量子信息:纠缠、纯化与纠错

量子信息:纠缠、纯化与纠错 1. 量子计算中的原子操作 在量子计算里,原子是关键的操作对象。为了确保原子能稳定用于计算,需要将其置于几乎没有其他原子或分子与之碰撞的环境中。 原子状态的初始化借助光泵浦来实现。若原子处于不同于 $|0\rangle$ 的状态,就用激光激发它…

作者头像 李华