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 获取数据,并插入缓存,第二次直接从缓存中取。

更新 / 删除城市信息,这两种操作中,如果缓存有对应的数据,则删除缓存。可以自行测试接口查看结果。


总结

这一讲,主要讲了缓存更新策略及实际应用小例子。



我们的交流基地,“JAVA互联网技术交流:789650498”欢迎小伙伴们一起来交流:



原文:https://gitbook.cn/gitchat/column/5acda6f6d7966c5ae1086f2b/topic/5acdaa62d7966c5ae108708a



代码:https://gitee.com/blueses/springboot-webflux

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容