- 内容简介
- 前言
- 第 1 章 第一个 Spring Boot 项目
- 第 2 章 集成 MySQL 数据库
- 第 3 章 集成 Spring Data JPA
- 第 4 章 使用 Thymeleaf 模板引擎
- 第 5 章 Spring Boot 事务支持
- 第 6 章 使用过滤器和监听器
- 第 7 章 集成 Redis 缓存
- 第 8 章 集成 Log4j 日志
- 8.3 使用 Log4j 记录日志
- 第 9 章 Quartz 定时器和发送 Email
- 第 10 章 集成 MyBatis
- 第 11 章 异步消息与异步调用
- 第 12 章 全局异常处理与 Retry 重试
- 第 13 章 集成 MongoDB 数据库
- 第 14 章 集成 Spring Security
- 第 15 章 Spring Boot 应用监控
- 第 16 章 集成 Dubbo 和 Zookeeper
- 第 17 章 多环境配置与部署
- 第 18 章 Spring Boot 原理解析
- 参考文献
7.3 Redis 缓存在 Spring Boot 中使用

7.3.1 监听器 Listener 的开发
在 6.2.2 节中,我们已经简单开发好 AyUserListener 监听器类,并在上下文启动时打印信息。本节在上下文初始化的方法中加载数据库中的所有用户数据,并存放到 Redis 缓存中。之所以要把用户数据存放到缓存中,是因为用户的数据属于变动不大的数据,适合存放到缓存中,在应用需要获取用户数据时,可以直接到 Redis 缓存中获取,不用到数据库中获取数据库连接查询数据,提高数据的访问速度。具体代码如下:
redisTemplate.opsForList().leftPushAll:查询缓存中所有的用户数据,若 ALL_USER 键不存在,则会创建该键及与其关联的 List,之后再将参数中的 ayUserList 从左到右依次插入。
redisTemplate.opsForList().range:取链表中的全部元素,其中 0 表示第一个元素,-1 表示最后一个元素。
在 7.2.4 节中已经提到,当我们的数据存放到 Redis 的时候,键(key)和值(value)都是通过 Spring 提供的 Serializer 序列化到数据库的。RedisTemplate 默认使用 JdkSerializationRedisSerializer,而 StringRedisTemplate 默认使用 StringRedisSerializer。所以我们需要让用户类 AyUser(/src/main/java/com.example.demo.model)实现序列化接口 Serializable,具体代码如下:
7.3.2 项目启动缓存数据
在 7.3.1 节中,我们已经开发好 AyUserListener 监听器类和 AyUser 用户类,重新启动项目,这时数据库表 ay_user 中的所有数据都会加载到 Redis 缓存中。在 contextInitialized 方法中断点调试,出现如图 7-11 所示的界面,此时代码数据已经成功被加载到缓存中。同时,我们也可以用 Redis Client 客户端软件来查看用户数据是否存放到缓存中。
图 7-11 Redis 断点调试界面
7.3.3 更新缓存数据
项目启动并加载所有用户数据到缓存之后,我们需要修改 AyUserServiceImpl 中的接口,比如 findById、save、delete 等方法。如果在 Redis 缓存中查询不到数据,我们就需要到数据库查询,如果能够在数据库中查询到数据,除了返回数据之外,还需要把数据更新到缓存中。这样再次查询数据时,就不需要到数据库中查询数据了。这里主要对方法 findById 进行修改,AyUserServiceImpl 具体需要修改的代码如下:
对于 save、delete 等方法的修改,思路是一样的,这里就不一一重复叙述了,读者可自己实现。虽然引入 Redis 缓存用户数据可以提高访问性能,但是带来的代码复杂度也是可想而知的。所以在以后的工作中,在性能和代码复杂度的权衡下,大家要根据具体的业务场景加以选择,不可滥用缓存,这是要跟大家提醒的重点。
7.3.4 测试
7.3.3 节代码开发完成之后,我们在测试类 MySpringBootApplicationTests 下继续添加如下测试方法:
代码开发完成之后,重新启动项目,数据库中的 3 条数据会重新被添加到 Redis 缓存中,如图 7-12 所示。项目启动成功之后,我们往数据库表 ay_user 中添加 id 为 4 的第 4 条数据,如图 7-13 所示。
图 7-12 数据库中存在 3 条数据
图 7-13 插入 id 为 4 的数据
最后执行单元测试方法 testFindById(),在 IntelliJ IDEA 的控制台中会打印如下信息:
目前缓存中的用户数量为:3
--->>> id: 1 name:阿毅
目前缓存中的用户数量为:3
--->>> id: 2 name:阿兰
--->>> id: 4 name:test
目前缓存中的用户数量为:4
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论