Spring Boot 整合 Redis 实现缓存操作
2017-04-15 12:05
1106 查看
摘要:原创出处www.bysocket.com「泥瓦匠BYSocket」欢迎转载,保留摘要,谢谢!
『产品没有价值,开发团队再优秀也无济于事–《启示录》』
本文提纲
一、缓存的应用场景
二、更新缓存的策略
三、运行springboot-mybatis-redis工程案例
四、springboot-mybatis-redis工程代码配置详解
运行环境:
MacOS10.12.x
JDK8+
Redis3.2.8
SpringBoot1.5.1.RELEASE
强烈推荐读者-
「springboot-learning-example」开源项目,Star一下
springboot实践学习案例,是springboot初学者及核心技术巩固的最佳实践。
https://git.oschina.net/jeff1993/springboot-learning-example
在互联网场景下,尤其2C端大流量场景下,需要将一些经常展现和不会频繁变更的数据,存放在存取速率更快的地方。缓存就是一个存储器,在技术选型中,常用Redis作为缓存数据库。缓存主要是在获取资源方便性能优化的关键方面。
Redis是一个高性能的key-value数据库。GitHub地址:https://github.com/antirez/redis。Github是这么描述的:
Redisisanin-memorydatabasethatpersistsondisk.Thedatamodeliskey-value,butmanydifferentkindofvaluesaresupported:Strings,Lists,Sets,SortedSets,Hashes,HyperLogLogs,Bitmaps.
缓存的应用场景有哪些呢?
比如常见的电商场景,根据商品ID获取商品信息时,店铺信息和商品详情信息就可以缓存在Redis,直接从Redis获取。减少了去数据库查询的次数。但会出现新的问题,就是如何对缓存进行更新?这就是下面要讲的。
/detail/2680607929.html,缓存更新的模式有四种:Cacheaside,Readthrough,Writethrough,Writebehindcaching。
这里我们使用的是CacheAside策略,从三个维度:(摘自耗子叔叔博客)
失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
命中:应用程序从cache中取数据,取到后返回。
更新:先把数据存到数据库中,成功后,再让缓存失效。
大致流程如下:
获取商品详情举例
a.从商品Cache中获取商品详情,如果存在,则返回获取Cache数据返回。
b.如果不存在,则从商品DB中获取。获取成功后,将数据存到Cache中。则下次获取商品详情,就可以从Cache就可以得到商品详情数据。
c.从商品DB中更新或者删除商品详情成功后,则从缓存中删除对应商品的详情缓存
https://github.com/JeffLi1993/springboot-learning-example。
下面开始运行工程步骤(QuickStart):
1.数据库和Redis准备
a.创建数据库springbootdb:
b.创建表city:(因为我喜欢徒步)
c.插入数据
d.本地安装Redis
详见写过的文章《Redis安装》http://www.bysocket.com/?p=917
2.springboot-mybatis-redis工程项目结构介绍
3.改数据库配置
打开application.properties文件,修改相应的数据源配置,比如数据源地址、账号、密码等。
(如果不是用MySQL,自行添加连接驱动pom,然后修改驱动名配置。)
4.编译工程
在项目根目录springboot-learning-example,运行maven指令:
5.运行工程
右键运行springboot-mybatis-redis工程Application应用启动类的main函数。
项目运行成功后,这是个HTTPOVERJSON服务项目。所以用postman工具可以如下操作
根据ID,获取城市信息
GEThttp://127.0.0.1:8080/api/city/1
再请求一次,获取城市信息会发现数据获取的耗时快了很多。服务端Console输出的日志:
可见,第一次是从数据库DB获取数据,并插入缓存,第二次直接从缓存中取。
更新城市信息
PUThttp://127.0.0.1:8080/api/city
删除城市信息
DELETEhttp://127.0.0.1:8080/api/city/2
这两种操作中,如果缓存有对应的数据,则删除缓存。服务端Console输出的日志:
pom.xml依赖配置:
包括了SpringBootReids依赖、MySQL依赖和Mybatis依赖。
在application.properties应用配置文件,增加Redis相关配置
详细解释可以参考注释。对应的配置类:org.springframework.boot.autoconfigure.data.redis.RedisProperties
CityRestController控制层依旧是Restful风格的,详情可以参考《Springboot实现Restful服务,基于HTTP/JSON传输》。http://www.bysocket.com/?p=1627domain对象City必须实现序列化,因为需要将对象序列化后存储到Redis。如果没实现Serializable,控制台会爆出以下异常:
City.java城市对象:
如果需要自定义序列化实现,只要实现RedisSerializer接口去实现即可,然后在使用RedisTemplate.setValueSerializer方法去设置你实现的序列化实现。
主要还是城市业务逻辑实现类CityServiceImpl.java:
首先这里注入了RedisTemplate对象。联想到Spring的JdbcTemplate,RedisTemplate封装了RedisConnection,具有连接管理,序列化和Redis操作等功能。还有针对String的支持对象StringRedisTemplate。
Redis操作视图接口类用的是ValueOperations,对应的是RedisString/Value操作。还有其他的操作视图,ListOperations、SetOperations、ZSetOperations和HashOperations。ValueOperations插入缓存是可以设置失效时间,这里设置的失效时间是10s。
回到更新缓存的逻辑
a.findCityById获取城市逻辑:
如果缓存存在,从缓存中获取城市信息
如果缓存不存在,从DB中获取城市信息,然后插入缓存
b.deleteCity删除/updateCity更新城市逻辑:
如果缓存存在,删除
如果缓存不存在,不操作
其他不明白的,可以gitclone下载工程springboot-learning-example,工程代码注解很详细。https://github.com/JeffLi1993/springboot-learning-example。
欢迎扫一扫我的公众号关注—及时得到博客订阅哦!
—http://www.bysocket.com/—
—https://github.com/JeffLi1993—
『产品没有价值,开发团队再优秀也无济于事–《启示录》』
本文提纲
一、缓存的应用场景
二、更新缓存的策略
三、运行springboot-mybatis-redis工程案例
四、springboot-mybatis-redis工程代码配置详解
运行环境:
MacOS10.12.x
JDK8+
Redis3.2.8
SpringBoot1.5.1.RELEASE
强烈推荐读者-
springboot实践学习案例,是springboot初学者及核心技术巩固的最佳实践。
一、缓存的应用场景
什么是缓存?在互联网场景下,尤其2C端大流量场景下,需要将一些经常展现和不会频繁变更的数据,存放在存取速率更快的地方。缓存就是一个存储器,在技术选型中,常用Redis作为缓存数据库。缓存主要是在获取资源方便性能优化的关键方面。
Redis是一个高性能的key-value数据库。GitHub地址:
Redisisanin-memorydatabasethatpersistsondisk.Thedatamodeliskey-value,butmanydifferentkindofvaluesaresupported:Strings,Lists,Sets,SortedSets,Hashes,HyperLogLogs,Bitmaps.
缓存的应用场景有哪些呢?
比如常见的电商场景,根据商品ID获取商品信息时,店铺信息和商品详情信息就可以缓存在Redis,直接从Redis获取。减少了去数据库查询的次数。但会出现新的问题,就是如何对缓存进行更新?这就是下面要讲的。
二、更新缓存的策略
参考《缓存更新的套路》这里我们使用的是CacheAside策略,从三个维度:(摘自耗子叔叔博客)
失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
命中:应用程序从cache中取数据,取到后返回。
更新:先把数据存到数据库中,成功后,再让缓存失效。
大致流程如下:
获取商品详情举例
a.从商品Cache中获取商品详情,如果存在,则返回获取Cache数据返回。
b.如果不存在,则从商品DB中获取。获取成功后,将数据存到Cache中。则下次获取商品详情,就可以从Cache就可以得到商品详情数据。
c.从商品DB中更新或者删除商品详情成功后,则从缓存中删除对应商品的详情缓存
三、运行springboot-mybatis-redis工程案例
gitclone下载工程springboot-learning-example,项目地址见GitHub–下面开始运行工程步骤(QuickStart):
1.数据库和Redis准备
a.创建数据库springbootdb:
1 |
1 2 3 4 5 6 7 8 |
1 |
详见写过的文章《Redis安装》
2.springboot-mybatis-redis工程项目结构介绍
1 2 3 4 5 6 7 |
打开application.properties文件,修改相应的数据源配置,比如数据源地址、账号、密码等。
(如果不是用MySQL,自行添加连接驱动pom,然后修改驱动名配置。)
4.编译工程
在项目根目录springboot-learning-example,运行maven指令:
1 |
右键运行springboot-mybatis-redis工程Application应用启动类的main函数。
项目运行成功后,这是个HTTPOVERJSON服务项目。所以用postman工具可以如下操作
根据ID,获取城市信息
GET
再请求一次,获取城市信息会发现数据获取的耗时快了很多。服务端Console输出的日志:
1 2 |
更新城市信息
PUT
删除城市信息
DELETE
这两种操作中,如果缓存有对应的数据,则删除缓存。服务端Console输出的日志:
1 |
四、springboot-mybatis-redis工程代码配置详解
这里,我强烈推荐注解的方式实现对象的缓存。但是这里为了更好说明缓存更新策略。下面讲讲工程代码的实现。pom.xml依赖配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
在application.properties应用配置文件,增加Redis相关配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
CityRestController控制层依旧是Restful风格的,详情可以参考《Springboot实现Restful服务,基于HTTP/JSON传输》。
1 2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
主要还是城市业务逻辑实现类CityServiceImpl.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
Redis操作视图接口类用的是ValueOperations,对应的是RedisString/Value操作。还有其他的操作视图,ListOperations、SetOperations、ZSetOperations和HashOperations。ValueOperations插入缓存是可以设置失效时间,这里设置的失效时间是10s。
回到更新缓存的逻辑
a.findCityById获取城市逻辑:
如果缓存存在,从缓存中获取城市信息
如果缓存不存在,从DB中获取城市信息,然后插入缓存
b.deleteCity删除/updateCity更新城市逻辑:
如果缓存存在,删除
如果缓存不存在,不操作
其他不明白的,可以gitclone下载工程springboot-learning-example,工程代码注解很详细。
五、小结
本文涉及到SpringBoot在使用Redis缓存时,一个是缓存对象需要序列化,二个是缓存更新策略是如何的。欢迎扫一扫我的公众号关注—及时得到博客订阅哦!
—
—
相关文章推荐
- Spring Boot 整合 Redis 实现缓存操作
- Spring Boot 整合 Redis 实现缓存操作
- Spring Boot 整合 Redis 实现缓存操作
- Spring Boot 整合 Redis 实现缓存操作
- Spring Boot 整合 Redis 实现缓存操作
- Spring Boot 整合 Redis 实现缓存操作
- SpringBoot整合Spring-data-redis实现集中式缓存
- SpringBoot之整合redis实现缓存
- spring boot整合redis实现缓存机制
- Spring Boot学习之整合Redis实现缓存
- 使用 SpringBoot 之 JPA 整合 Redis 实现缓存
- 整合SpringBoot+Mysql+Redis实现缓存机制的一个Demo
- SpringBoot 整合redis实现缓存 记录@CachePut值为1
- 35. Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
- Spring Boot 集成 Redis 实现缓存机制
- 二十三、Spring Boot自定义Redis实现缓存机制
- spring boot 整合redis对查询数据做缓存( 利用spring的AOP技术)
- spring-boot整合redis作为缓存(4)——spring-boot引入Redis
- 浅谈SpringBoot集成Redis实现缓存处理(Spring AOP实现)