07-Redis实现缓存
新建一个工程编写整合 Redis 实现缓存案例,工程如图:
可以看到添加了三个依赖组件,包含持久层的数据库,缓存的reids。
然后看项目结构:
目录核心如下:
pom.xml maven 配置
application.properties 配置文件
domain 实体类
dao mongodb数据操作层
handler 业务层,本文要点
controller 控制层
City代码:
dao层代码:
控制层 CityWebFluxController,代码如下:
CityHandler 业务层
目前,@Cacheable 等注解形式实现缓存没有很好的集成,二者 Mono / Flux 对象没有实现 Serializable,无法通过默认序列化器,解决方式是需要自定义序列化,这里通过手动方式与 Redis 手动集成,并实现缓存策略。
缓存更新的模式有四种:Cache aside、Read through、Write through、Write behind caching。
这里使用的是 Cache Aside 策略,从三个维度:
失效:应用程序先从 Cache 取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
命中:应用程序从 Cache 中取数据,取到后返回。
更新:先把数据存到数据库中,成功后,再让缓存失效。
代码如下:
上面两张图是类的完整代码。
首先这里注入了 RedisTemplate 对象,联想到 Spring 的 JdbcTemplate ,RedisTemplate 封装了 RedisConnection,具有连接管理,序列化和 Redis 操作等功能,还有针对 String 的支持对象 StringRedisTemplate。
回到更新缓存的逻辑。
a. findCityById 获取城市逻辑:
如果缓存存在,从缓存中获取城市信息;
如果缓存不存在,从 DB 中获取城市信息,然后插入缓存。
b. deleteCity 删除 / modifyCity 更新城市逻辑:
如果缓存存在,删除;
如果缓存不存在,不操作。
运行工程
一个 Spring Boot WebFlux 工程就开发完毕了,下面运行工程验证下。在 IDEA 中执行 Application 类启动,任意正常模式或者 Debug 模式,可以在控制台看到成功运行的输出:
新增城市信息 POST http://127.0.0.1:8007/city:
获取城市信息 GET http://127.0.0.1:8007/city/7:
可以看到城市插入缓存。
再执行一次:
可以看到这次是从缓存中查的。
可见,第一次是从数据库 MongoDB 获取数据,并插入缓存,第二次直接从缓存中取。
更新 / 删除城市信息,这两种操作中,如果缓存有对应的数据,则删除缓存。可以自行测试接口查看结果。
总结
这一讲,主要讲了缓存更新策略及实际应用小例子。
原文:https://gitbook.cn/gitchat/column/5acda6f6d7966c5ae1086f2b/topic/5acdaa62d7966c5ae108708a
代码:https://gitee.com/blueses/springboot-webflux