springboot 多个redis boot redis 问题

博客分类:
这次带来的是spring boot + redis 实现session共享的教程。
在spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring session支持,配置如下:
@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {
而@EnableRedisHttpSession这个注解是由spring-session-data-redis提供的,所以在pom.xml文件中添加:
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-redis&/artifactId&
&/dependency&
&dependency&
&groupId&org.springframework.session&/groupId&
&artifactId&spring-session-data-redis&/artifactId&
&/dependency&
接下来,则需要在application.properties中配置redis服务器的位置了,在这里,我们就用本机:
spring.redis.host=localhost
spring.redis.port=6379
这样以来,最简单的spring boot + redis实现session共享就完成了,下面进行下测试。
首先我们开启两个tomcat服务,端口分别为,在application.properties中进行设置:
server.port=8080
接下来定义一个Controller:
@RestController
@RequestMapping(value = "/admin/v1")
public class QuickRun {
@RequestMapping(value = "/first", method = RequestMethod.GET)
public Map&String, Object& firstResp (HttpServletRequest request){
Map&String, Object& map = new HashMap&&();
request.getSession().setAttribute("request Url", request.getRequestURL());
map.put("request Url", request.getRequestURL());
@RequestMapping(value = "/sessions", method = RequestMethod.GET)
public Object sessions (HttpServletRequest request){
Map&String, Object& map = new HashMap&&();
map.put("sessionId", request.getSession().getId());
map.put("message", request.getSession().getAttribute("map"));
启动之后进行访问测试,首先访问8080端口的tomcat,返回:
{"request Url":"http://localhost:8080/admin/v1/first"}
接着,我们访问8080端口的sessions,返回:
{"sessionId":"efcc85c0-9ad2-49a6-a38f-b5","message":"http://localhost:8080/admin/v1/first"}
最后,再访问9090端口的sessions,返回:
{"sessionId":"efcc85c0-9ad2-49a6-a38f-b5","message":"http://localhost:8080/admin/v1/first"}
可见,两个服务器返回结果一样,实现了session的共享
如果此时再访问9090端口的first的话,首先返回:
{"request Url":"http://localhost:9090/admin/v1/first"}
而两个服务器的sessions都是返回:
{"sessionId":"efcc85c0-9ad2-49a6-a38f-b5","message":"http://localhost:9090/admin/v1/first"}
通过spring boot + redis来实现session的共享非常简单,而且用处也极大,配合nginx进行负载均衡,便能实现分布式的应用了。
本次的redis并没有进行主从、读写分离等等配置(_(:з」∠)_其实是博主懒,还没尝试过.......)
而且,nginx的单点故障也是我们应用的障碍......以后可能会有对此次博客的改进版本,比如使用zookeeper进行负载均衡,敬请期待。
浏览: 98689 次
亲测可用,上面所说的html放在src\main\resour ...
PropertySource注解是Spring框架本来就有的
帮了我大忙,谢谢
建议作者写个总结,这样对bean的整个加载流程有个大概的轮廓, ...
感谢博主无私分享
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'> 博客详情
在我们的日常项目开发过程中缓存是无处不在的,因为它可以极大的提高系统的访问速度,关于缓存的框架也种类繁多,今天主要介绍的是使用现在非常流行的NoSQL数据库(Redis)来实现我们的缓存需求。
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,Redis 的优势包括它的速度、支持丰富的数据类型、操作原子性,以及它的通用性。
本案例是在之前一篇SpringBoot + Mybatis + RESTful的基础上来集成Redis的,所以大家如有什么不明白的地方可以前往,由于篇幅原因这里不一一贴出所有的代码,具体完整案例代码可以看这里:,关于Redis如何安装可自行google。
1、在Maven pom.xml文件中加入Redis包
&!--redis--&
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-redis&/artifactId&
&version&${boot.version}&/version&
&/dependency&
2、SpringBoot配置文件中配置Redis连接(YAML方式配置)
application:
name: spring-boot-redis
host: 192.168.145.132
port: 6379
timeout: 20000
nodes: 192.168.211.134:.211.134:.211.134:7002
maxRedirects: 6
max-active: 8
min-idle: 0
max-idle: 8
max-wait: -1
解释:本配置采用Redis一主三从的的配置方式来提高缓存的吞吐量
3、Redis配置类
@Configuration
public class RedisConfig {
public RedisTemplate&Object, Object& redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate&Object, Object& template = new RedisTemplate&&();
template.setConnectionFactory(connectionFactory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
解释:SpringBoot提供了对Redis的自动配置功能,在RedisAutoConfiguration中默认为我们配置了JedisConnectionFactory(客户端连接)、RedisTemplate以及StringRedisTemplate(数据操作模板),其中StringRedisTemplate模板只针对键值对都是字符型的数据进行操作,本示例采用RedisTemplate作为数据操作模板,该模板默认采用JdkSerializationRedisSerializer的二进制数据序列化方式,为了方便演示本示例采用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值,使用StringRedisSerializer来序列化和反序列化redis的key值。
4、Service层应用缓存(注解方式)
public class PersonService {
@Autowired
private PersonRepo personR
* @Cacheable 应用到读取数据的方法上,先从缓存中读取,如果没有再从DB获取数据,然后把数据添加到缓存中
* unless 表示条件表达式成立的话不放入缓存
* @param username
@Cacheable(value = "user", key = "#root.targetClass + #username", unless = "#result eq null")
public Person getPersonByName(String username) {
Person person = personRepo.getPersonByName(username);
* @CachePut 应用到写数据的方法上,如新增/修改方法,调用方法时会自动把相应的数据放入缓存
* @param person
@CachePut(value = "user", key = "#root.targetClass + #result.username", unless = "#person eq null")
public Person savePerson(Person person) {
return personRepo.savePerson(person);
* @CacheEvict 应用到删除数据的方法上,调用方法时会从缓存中删除对应key的数据
* @param username
@CacheEvict(value = "user", key = "#root.targetClass + #username", condition = "#result eq true")
public boolean removePersonByName(String username) {
return personRepo.removePersonByName(username) & 0;
public boolean isExistPersonName(Person person) {
return personRepo.existPersonName(person) & 0;
1、这里的缓存key为简单的字符串组合,也可根据具体需要实现自定义的Key生成器,然后在注解中使用keyGenerator来引用。
2、Spring Cache提供了一些供我们使用的SpEL上下文数据,通过#来引用,具体可查看Spring官网:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#cache-spel-context。
5、数据访问资源类
@Component
@Path("personMgr")
public class PersonMgrResource {
@Autowired
private PersonService personS
@Path("getPersonByName")
@Produces(MediaType.APPLICATION_JSON)
public JsonResp getPersonByName(@QueryParam("username") String username) {
Person person = personService.getPersonByName(username);
return JsonResp.success(person);
@Path("removePersonByName")
@Produces(MediaType.APPLICATION_JSON)
public JsonResp removePersonByName(@QueryParam("username") String username) {
if (personService.removePersonByName(username)) {
return JsonResp.success();
return JsonResp.fail("系统错误!");
@Path("savePerson")
@Produces(MediaType.APPLICATION_JSON)
public JsonResp savePerson(Person person) {
if (personService.isExistPersonName(person)) {
return JsonResp.fail("用户名已存在!");
if (personService.savePerson(person).getId() & 0) {
return JsonResp.success();
return JsonResp.fail("系统错误!");
6、通过postman工具来测试缓存是否生效
第一次访问查找用户:
第一次通过用户名称来查找用户可以看到是从库中查询的数据,我们可以通过RedisClient工具来查看数据已放入了缓存
第二次查找用户:发现服务端并未打印任何数据库查询日志,可以知道第二次查询是从缓存中查询得到的数据。
本文介绍如何通过SpringBoot来一步步集成Redis缓存,关于Redis的使用它不仅可以用作缓存,还可以用来构建队列系统,Pub/Sub实时消息系统,分布式系统的的计数器应用,关于Redis更多的介绍,请前往查阅官方文档。
你这句话没读懂,语法有问题。
引用来自“kut”的评论你这句话没读懂,语法有问题。就是使用spring boot parent 不用指定版本号了,会跟着parent变化
windows埋的坑 centos上没有这个问题
windows埋的坑 centos上没有这个问题centos有问题和平台没关系。是spring默认不是string序列化造成的。
引用来自“kut”的评论你这句话没读懂,语法有问题。引用来自“youpengfei”的评论就是使用spring boot parent 不用指定版本号了,会跟着parent变化新汉语
是的,这例子key生成的表达式有问题,考虑到有重名的情况不能拿用户名做键,怕有人直接把代码复制去用了,那还不玩儿完
对,拿一些redis管理工具查看缓存的话,确实会看见value出现乱码
这里如果是我们自己测试使用的话可以使用SpringBoot的parent依赖比较方便,但是在真正的产品开发中一般都会指定自己的parent:smile:
SpringBoot为我们自动配置了RedisTemplate,该模板使用JdkSerializationRedisSerializer(二进制方式)作为默认的序列化方式,如果我们使用RedisClient查看的话会看到类似乱码的东西,你可以当做是编码的问题,会影响我们直观的查看,所以为了更加直观的查看到加入的缓存内容,这里可以指定其他的序列化方式,如Jackson2JsonRedisSerializer
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥详解Spring Boot使用redis实现数据缓存
来源:易贤网&& 阅读:166 次&&日期: 16:55:43
温馨提示:易贤网小编为您整理了“详解Spring Boot使用redis实现数据缓存”,方便广大网友查阅!
更多信息请查看
【】&&&&&【点此处查询各地各类考试咨询QQ号码及交流群】
易贤网手机网站地址:
由于各方面情况的不断调整与变化,易贤网提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
相关阅读 & & &
&&& &nbsp&nbsp&nbsp会员注册
本站不参与评论!()
自觉遵守:爱国、守法、自律、真实、文明的原则
尊重网上道德,遵守中华人民共和国各项有关法律法规
严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的评论
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
您在本站发表的评论,本站有权保留、转载、引用或者删除
参与本评论即表明您已经阅读并接受上述条款1.新建Spring Boot项目
添加spring-boot-starter-data-redis依赖
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-data-redis&/artifactId&
&/dependency&
本文会根据StringRedisTemplate、RedisTemplate这两个模板来介绍,其中StringRedisTemplate继承自RedisTemplate,只能操作键值都是String类型的数据。在实际开发中建议使用RedisTemplate&K,V&。
查询源码可知RedisTemplate默认使用JdkSerializationRedisSerializer序列化,而StringRedisTemplate则使用StringRedisSerializer。
2.配置redis
在application.properties中配置如下:
1 ########################################################
2 ###Redis (RedisConfiguration)
3 ########################################################
4 spring.redis.database=1
5 spring.redis.host=127.0.0.1
6 spring.redis.port=6379
7 spring.redis.password=
8 spring.redis.pool.max-idle=8
9 spring.redis.pool.min-idle=0
<span style="color: # spring.redis.pool.max-active=8
<span style="color: # spring.redis.pool.max-wait=-1
<span style="color: # spring.redis.timeout=5000
3.编写代码
  1.创建model
1 package com.haq.
3 import java.io.S
* Created by on .
8 public class User implements Serializable {
<span style="color: #
private static final long serialVersionUId = 1L;
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
public User(){
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
public String getId() {
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
public void setId(String id) {
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
public String getName() {
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
public void setName(String name) {
<span style="color: #
this.name =
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
public String toString() {
<span style="color: #
return "User{" +
<span style="color: #
"id='" + id + '\'' +
<span style="color: #
", name='" + name + '\'' +
<span style="color: #
<span style="color: #
<span style="color: # }
  2.创建RedisService
1 package com.haq.common.
3 import org.springframework.beans.factory.annotation.A
4 import org.springframework.data.redis.core.RedisT
5 import org.springframework.data.redis.core.StringRedisT
6 import org.springframework.data.redis.core.ValueO
7 import org.springframework.stereotype.S
9 import javax.annotation.R
<span style="color: #
<span style="color: # /**
<span style="color: #
* Created by on .
<span style="color: #
<span style="color: # @Service
<span style="color: # public class RedisService {
<span style="color: #
<span style="color: #
@Autowired
<span style="color: #
StringRedisTemplate stringRedisT
<span style="color: #
<span style="color: #
<span style="color: #
@Resource(name = "stringRedisTemplate")
<span style="color: #
ValueOperations&String, String& valOpsS
<span style="color: #
<span style="color: #
@Autowired
<span style="color: #
RedisTemplate&Object, Object& redisT
<span style="color: #
<span style="color: #
@Resource(name = "redisTemplate")
<span style="color: #
ValueOperations&Object, Object& valOpsO
<span style="color: #
<span style="color: #
<span style="color: #
* 根据指定key获取String
<span style="color: #
* @param key
<span style="color: #
<span style="color: #
<span style="color: #
public String getStr(String key){
<span style="color: #
return valOpsStr.get(key);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
* 设置Str缓存
<span style="color: #
* @param key
<span style="color: #
* @param val
<span style="color: #
<span style="color: #
public void setStr(String key, String val){
<span style="color: #
valOpsStr.set(key,val);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
* 删除指定key
<span style="color: #
* @param key
<span style="color: #
<span style="color: #
public void del(String key){
<span style="color: #
stringRedisTemplate.delete(key);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
* 根据指定o获取Object
<span style="color: #
* @param o
<span style="color: #
<span style="color: #
<span style="color: #
public Object getObj(Object o){
<span style="color: #
return valOpsObj.get(o);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
* 设置obj缓存
<span style="color: #
* @param o1
<span style="color: #
* @param o2
<span style="color: #
<span style="color: #
public void setObj(Object o1, Object o2){
<span style="color: #
valOpsObj.set(o1, o2);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
* 删除Obj缓存
<span style="color: #
* @param o
<span style="color: #
<span style="color: #
public void delObj(Object o){
<span style="color: #
redisTemplate.delete(o);
<span style="color: #
<span style="color: #
<span style="color: # }
  3.创建RedisController
1 package com.haq.
3 import com.haq.common.redis.RedisS
4 import com.haq.entity.U
5 import org.springframework.beans.factory.annotation.A
6 import org.springframework.web.bind.annotation.RequestM
7 import org.springframework.web.bind.annotation.RestC
* Created by on .
12 @RestController
13 @RequestMapping("/redis")
14 public class RedisController {
@Autowired
RedisService redisS
* 设置Str缓存
* @param key
* @param val
@RequestMapping(value = "setStr")
public String setStr(String key, String val){
redisService.setStr(key, val);
return "success";
} catch (Exception e){
e.printStackTrace();
return "error";
* 根据key查询Str缓存
* @param key
@RequestMapping(value = "getStr")
public String getStr(String key){
return redisService.getStr(key);
* 根据key产出Str缓存
* @param key
@RequestMapping(value = "delStr")
public String delStr(String key){
redisService.del(key);
return "success";
} catch (Exception e){
return "error";
* 设置obj缓存
* @param key
* @param user
@RequestMapping(value = "setObj")
public String setObj(String key, User user){
redisService.setObj(key, user);
return "success";
} catch (Exception e){
e.printStackTrace();
return "error";
* 获取obj缓存
* @param key
@RequestMapping(value = "getObj")
public Object getObj(String key){
return redisService.getObj(key);
* 删除obj缓存
* @param key
@RequestMapping(value = "delObj")
public Object delObj(String key){
redisService.delObj(key);
<span style="color: #0
return "success";
<span style="color: #1
} catch (Exception e){
<span style="color: #2
e.printStackTrace();
<span style="color: #3
return "error";
<span style="color: #4
<span style="color: #5
<span style="color: #6
<span style="color: #7 }
4.运行测试
1.StringRedisTemplate
http://127.0.0.1:8080/redis/setStr?key=aa&val=name
http://127.0.0.1:8080/redis/getStr?key=aa
http://127.0.0.1:8080/redis/delStr?key=aa
2.RedisTemplate
http://127.0.0.1:8080/redis/setObj?key=aa&id=1&name=test
http://127.0.0.1:8080/redis/getObj?key=aa
http://127.0.0.1:8080/redis/delObj?key=aa
以上地址都能通过测试,在这里就不一一截图了
可以直接使用redistemplate来保存string类型,不过使用redis client看起来就不太直观,因为JdkSerializationRedisSerializer是使用二进制形式存储数据。
最后希望大家有问题能多多指教,O(∩_∩)O谢谢
阅读(...) 评论()51CTO旗下网站
Spring Boot 整合 Redis 实现缓存操作
在互联网场景下,尤其2C端大流量场景下,需要将一些经常展现和不会频繁变更的数据,存放在存取速率更快的地方。缓存就是一个存储器,在技术选型中,常用Redis作为缓存数据库。缓存主要是在获取资源方便性能优化的关键方面。
作者:泥沙砖瓦浆木匠来源:| 10:35
一、缓存的应用场景
二、更新缓存的策略
三、运行 springboot-mybatis-redis 工程案例
四、springboot-mybatis-redis 工程代码配置详解
运行环境:
Mac OS 10.12.x
Redis 3.2.8
Spring Boot 1.5.1.RELEASE
一、缓存的应用场景
什么是缓存?
在互联网场景下,尤其2C端大流量场景下,需要将一些经常展现和不会频繁变更的数据,存放在存取速率更快的地方。缓存就是一个存储器,在技术选型中,常用
Redis 作为缓存数据库。缓存主要是在获取资源方便性能优化的关键方面。
Redis 是一个高性能的 key-value 数据库。GitHub 地址:https://github.com/antirez/redis
。Github 是这么描述的:
Redis is an in-memory database that persists on disk. The data model is
key-value, but many different kind of values are supported: Strings, Lists,
Sets, Sorted Sets, Hashes, HyperLogLogs, Bitmaps.
缓存的应用场景有哪些呢?
比如常见的电商场景,根据商品 ID 获取商品信息时,店铺信息和商品详情信息就可以缓存在 Redis,直接从 Redis
获取。减少了去数据库查询的次数。但会出现新的问题,就是如何对缓存进行更新?这就是下面要讲的。
二、更新缓存的策略
缓存更新的模式有四种:Cache aside,
Read through, Write through, Write behind caching。
这里我们使用的是 Cache Aside 策略,从三个维度:(摘自 耗子叔叔博客)
失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
命中:应用程序从cache中取数据,取到后返回。
更新:先把数据存到数据库中,成功后,再让缓存失效。
大致流程如下:
获取商品详情举例
a. 从商品 Cache 中获取商品详情,如果存在,则返回获取 Cache 数据返回。
b. 如果不存在,则从商品 DB 中获取。获取成功后,将数据存到 Cache 中。则下次获取商品详情,就可以从 Cache
就可以得到商品详情数据。
c. 从商品 DB 中更新或者删除商品详情成功后,则从缓存中删除对应商品的详情缓存
三、运行 springboot-mybatis-redis 工程案例
git clone 下载工程 springboot-learning-example ,项目地址见 GitHub &
下面开始运行工程步骤(Quick Start):
1.数据库和 Redis 准备
a.创建数据库 springbootdb:
CREATE&DATABASE&springbootdb&
b.创建表 city :(因为我喜欢徒步)
DROP&TABLE&IF&EXISTS&&`city`;&CREATE&TABLE&`city`&(&&&`id`&int(10)&unsigned&NOT&NULL&AUTO_INCREMENT&COMMENT&'城市编号',&&&`province_id`&int(10)&unsigned&&NOT&NULL&COMMENT&'省份编号',&&&`city_name`&varchar(25)&DEFAULT&NULL&COMMENT&'城市名称',&&&`description`&varchar(25)&DEFAULT&NULL&COMMENT&'描述',&&&PRIMARY&KEY&(`id`)&)&ENGINE=InnoDB&AUTO_INCREMENT=1&DEFAULT&CHARSET=utf8;&
c.插入数据
INSERT&city&VALUES&(1&,1,'温岭市','BYSocket&的家在温岭。');&
d.本地安装 Redis
详见写过的文章《 Redis 安装 》http://www.bysocket.com/?p=917
2. springboot-mybatis-redis 工程项目结构介绍
springboot-mybatis-redis&工程项目结构如下图所示:&org.spring.springboot.controller&-&Controller&层&org.spring.springboot.dao&-&数据操作层&DAO&org.spring.springboot.domain&-&实体类&org.spring.springboot.service&-&业务逻辑层&Application&-&应用启动类&application.properties&-&应用配置文件,应用启动会自动读取配置&
3.改数据库配置
打开 application.properties 文件, 修改相应的数据源配置,比如数据源地址、账号、密码等。
(如果不是用 MySQL,自行添加连接驱动 pom,然后修改驱动名配置。)
4.编译工程
在项目根目录 springboot-learning-example,运行 maven 指令:
mvn&clean&install&
5.运行工程
右键运行 springboot-mybatis-redis 工程 Application 应用启动类的 main 函数。
项目运行成功后,这是个 HTTP OVER JSON 服务项目。所以用 postman 工具可以如下操作
根据 ID,获取城市信息
GET http://127.0.0.1:8080/api/city/1
再请求一次,获取城市信息会发现数据获取的耗时快了很多。服务端 Console 输出的日志:
&18:29:00.273&&INFO&13038&&&18:29:03.145&&INFO&13038&&
可见,第一次是从数据库 DB 获取数据,并插入缓存,第二次直接从缓存中取。
更新城市信息
PUT http://127.0.0.1:8080/api/city
删除城市信息
DELETE http://127.0.0.1:8080/api/city/2
这两种操作中,如果缓存有对应的数据,则删除缓存。服务端 Console 输出的日志:
&18:29:52.248&INFO&13038&&
四、springboot-mybatis-redis 工程代码配置详解
这里,我强烈推荐 注解 的方式实现对象的缓存。但是这里为了更好说明缓存更新策略。下面讲讲工程代码的实现。
pom.xml 依赖配置:
&?xml&version=&1.0&&encoding=&UTF-8&?&&&project&xmlns=&http://maven.apache.org/POM/4.0.0&&xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&&&&&&&&&&&xsi:schemaLocation=&http://maven.apache.org/POM/4.0.0&http://maven.apache.org/xsd/maven-4.0.0.xsd&&&&&&&&modelVersion&4.0.0&/modelVersion&&&&&&&&&groupId&springboot&/groupId&&&&&&&artifactId&springboot-mybatis-redis&/artifactId&&&&&&&version&0.0.1-SNAPSHOT&/version&&&&&&&name&springboot-mybatis-redis&::&整合&Mybatis&并使用&Redis&作为缓存&/name&&&&&&&&&!&&&&&&parent&&&&&&&&&&&groupId&org.springframework.boot&/groupId&&&&&&&&&&&artifactId&spring-boot-starter-parent&/artifactId&&&&&&&&&&&version&1.5.1.RELEASE&/version&&&&&&&/parent&&&&&&&&&properties&&&&&&&&&&&mybatis-spring-boot&1.2.0&/mybatis-spring-boot&&&&&&&&&&&mysql-connector&5.1.39&/mysql-connector&&&&&&&&&&&spring-boot-starter-redis-version&1.3.2.RELEASE&/spring-boot-starter-redis-version&&&&&&&/properties&&&&&&&&&dependencies&&&&&&&&&&&&&!&&&&&&&&&&dependency&&&&&&&&&&&&&&&groupId&org.springframework.boot&/groupId&&&&&&&&&&&&&&&artifactId&spring-boot-starter-redis&/artifactId&&&&&&&&&&&&&&&version&${spring-boot-starter-redis-version}&/version&&&&&&&&&&&/dependency&&&&&&&&&&&&&!&&&&&&&&&&dependency&&&&&&&&&&&&&&&groupId&org.springframework.boot&/groupId&&&&&&&&&&&&&&&artifactId&spring-boot-starter-web&/artifactId&&&&&&&&&&&/dependency&&&&&&&&&&&&&!&&&&&&&&&&dependency&&&&&&&&&&&&&&&groupId&org.springframework.boot&/groupId&&&&&&&&&&&&&&&artifactId&spring-boot-starter-test&/artifactId&&&&&&&&&&&&&&&scope&test&/scope&&&&&&&&&&&/dependency&&&&&&&&&&&&&!&&&&&&&&&&dependency&&&&&&&&&&&&&&&groupId&org.mybatis.spring.boot&/groupId&&&&&&&&&&&&&&&artifactId&mybatis-spring-boot-starter&/artifactId&&&&&&&&&&&&&&&version&${mybatis-spring-boot}&/version&&&&&&&&&&&/dependency&&&&&&&&&&&&&!&&&&&&&&&&dependency&&&&&&&&&&&&&&&groupId&mysql&/groupId&&&&&&&&&&&&&&&artifactId&mysql-connector-java&/artifactId&&&&&&&&&&&&&&&version&${mysql-connector}&/version&&&&&&&&&&&/dependency&&&&&&&&&&&&&!&&&&&&&&&&dependency&&&&&&&&&&&&&&&groupId&junit&/groupId&&&&&&&&&&&&&&&artifactId&junit&/artifactId&&&&&&&&&&&&&&&version&4.12&/version&&&&&&&&&&&/dependency&&&&&&&/dependencies&&&/project&&
包括了 Spring Boot Reids 依赖、 MySQL 依赖和 Mybatis 依赖。
在 application.properties 应用配置文件,增加 Redis 相关配置
##&数据源配置&spring.datasource.url=jdbc:mysql://localhost:3306/springbootdb?useUnicode=true&characterEncoding=utf8&spring.datasource.username=root&spring.datasource.password=123456&spring.datasource.driver-class-name=com.mysql.jdbc.Driver&&&##&Mybatis&配置&mybatis.typeAliasesPackage=org.spring.springboot.domain&mybatis.mapperLocations=classpath:mapper/*.xml&&&##&Redis&配置&##&Redis数据库索引(默认为0)&spring.redis.database=0&##&Redis服务器地址&spring.redis.host=127.0.0.1&##&Redis服务器连接端口&spring.redis.port=6379&##&Redis服务器连接密码(默认为空)&spring.redis.password=&##&连接池最大连接数(使用负值表示没有限制)&spring.redis.pool.max-active=8&##&连接池最大阻塞等待时间(使用负值表示没有限制)&spring.redis.pool.max-wait=-1&##&连接池中的最大空闲连接&spring.redis.pool.max-idle=8&##&连接池中的最小空闲连接&spring.redis.pool.min-idle=0&##&连接超时时间(毫秒)&spring.redis.timeout=0&
详细解释可以参考注释。对应的配置类:org.springframework.boot.autoconfigure.data.redis.RedisProperties
CityRestController 控制层依旧是 Restful 风格的,详情可以参考《Springboot 实现 Restful 服务,基于 HTTP
/ JSON 传输》。 http://www.bysocket.com/?p=1627 domain 对象 City
必须实现序列化,因为需要将对象序列化后存储到 Redis。如果没实现 Serializable ,控制台会爆出以下异常:
Serializable&java.lang.IllegalArgumentException:&DefaultSerializer&requires&a&Serializable&payload&but&received&an&object&of&type&
City.java 城市对象:
package&org.spring.springboot.&&&import&java.io.Serializable;&&&/**&&*&城市实体类&&*&&*&Created&by&bysocket&on&07/02/2017.&&*/&public&class&City&implements&Serializable&{&&&&&&&private&static&final&long&serialVersionUID&=&-1L;&&&&&&&/**&&&&&&*&城市编号&&&&&&*/&&&&&private&Long&&&&&&&&/**&&&&&&*&省份编号&&&&&&*/&&&&&private&Long&provinceId;&&&&&&&/**&&&&&&*&城市名称&&&&&&*/&&&&&private&String&cityN&&&&&&&/**&&&&&&*&描述&&&&&&*/&&&&&private&String&&&&&&&&public&Long&getId()&{&&&&&&&&&return&&&&&&}&&&&&&&public&void&setId(Long&id)&{&&&&&&&&&this.id&=&&&&&&}&&&&&&&public&Long&getProvinceId()&{&&&&&&&&&return&provinceId;&&&&&}&&&&&&&public&void&setProvinceId(Long&provinceId)&{&&&&&&&&&this.provinceId&=&provinceId;&&&&&}&&&&&&&public&String&getCityName()&{&&&&&&&&&return&cityN&&&&&}&&&&&&&public&void&setCityName(String&cityName)&{&&&&&&&&&this.cityName&=&cityN&&&&&}&&&&&&&public&String&getDescription()&{&&&&&&&&&return&&&&&&}&&&&&&&public&void&setDescription(String&description)&{&&&&&&&&&this.description&=&&&&&&}&&&&&&&@Override&&&&&public&String&toString()&{&&&&&&&&&return&&City{&&+&&&&&&&&&&&&&&&&&&id=&&+&id&+&&&&&&&&&&&&&&&&&&,&provinceId=&&+&provinceId&+&&&&&&&&&&&&&&&&&&,&cityName='&&+&cityName&+&'\''&+&&&&&&&&&&&&&&&&&&,&description='&&+&description&+&'\''&+&&&&&&&&&&&&&&&&&'}';&&&&&}&}&
如果需要自定义序列化实现,只要实现 RedisSerializer 接口去实现即可,然后在使用
RedisTemplate.setValueSerializer 方法去设置你实现的序列化实现。
主要还是城市业务逻辑实现类 CityServiceImpl.java:
package&org.spring.springboot.service.&&&import&org.slf4j.L&import&org.slf4j.LoggerF&import&org.spring.springboot.dao.CityD&import&org.spring.springboot.domain.C&import&org.spring.springboot.service.CityS&import&org.springframework.beans.factory.annotation.A&import&org.springframework.data.redis.core.RedisT&import&org.springframework.data.redis.core.StringRedisT&import&org.springframework.data.redis.core.ValueO&import&org.springframework.stereotype.S&&&import&java.util.L&import&java.util.concurrent.TimeU&&&/**&&*&城市业务逻辑实现类&&*&&p&&&*&Created&by&bysocket&on&07/02/2017.&&*/&@Service&public&class&CityServiceImpl&implements&CityService&{&&&&&&&private&static&final&Logger&LOGGER&=&LoggerFactory.getLogger(CityServiceImpl.class);&&&&&&&@Autowired&&&&&private&CityDao&cityD&&&&&&&@Autowired&&&&&private&RedisTemplate&redisT&&&&&&&/**&&&&&&*&获取城市逻辑:&&&&&&*&如果缓存存在,从缓存中获取城市信息&&&&&&*&如果缓存不存在,从&DB&中获取城市信息,然后插入缓存&&&&&&*/&&&&&public&City&findCityById(Long&id)&{&&&&&&&&&//&从缓存中获取城市信息&&&&&&&&&String&key&=&&city_&&+&&&&&&&&&&ValueOperations&String,&City&&operations&=&redisTemplate.opsForValue();&&&&&&&&&&&//&缓存存在&&&&&&&&&boolean&hasKey&=&redisTemplate.hasKey(key);&&&&&&&&&if&(hasKey)&{&&&&&&&&&&&&&City&city&=&operations.get(key);&&&&&&&&&&&&&&&LOGGER.info(&CityServiceImpl.findCityById()&:&从缓存中获取了城市&&&&&&+&city.toString());&&&&&&&&&&&&&return&&&&&&&&&&}&&&&&&&&&&&//&从&DB&中获取城市信息&&&&&&&&&City&city&=&cityDao.findById(id);&&&&&&&&&&&//&插入缓存&&&&&&&&&operations.set(key,&city,&10,&TimeUnit.SECONDS);&&&&&&&&&LOGGER.info(&CityServiceImpl.findCityById()&:&城市插入缓存&&&&&&+&city.toString());&&&&&&&&&&&return&&&&&&}&&&&&&&@Override&&&&&public&Long&saveCity(City&city)&{&&&&&&&&&return&cityDao.saveCity(city);&&&&&}&&&&&&&/**&&&&&&*&更新城市逻辑:&&&&&&*&如果缓存存在,删除&&&&&&*&如果缓存不存在,不操作&&&&&&*/&&&&&@Override&&&&&public&Long&updateCity(City&city)&{&&&&&&&&&Long&ret&=&cityDao.updateCity(city);&&&&&&&&&&&//&缓存存在,删除缓存&&&&&&&&&String&key&=&&city_&&+&city.getId();&&&&&&&&&boolean&hasKey&=&redisTemplate.hasKey(key);&&&&&&&&&if&(hasKey)&{&&&&&&&&&&&&&redisTemplate.delete(key);&&&&&&&&&&&&&&&LOGGER.info(&CityServiceImpl.updateCity()&:&从缓存中删除城市&&&&&&+&city.toString());&&&&&&&&&}&&&&&&&&&&&return&&&&&&}&&&&&&&@Override&&&&&public&Long&deleteCity(Long&id)&{&&&&&&&&&&&Long&ret&=&cityDao.deleteCity(id);&&&&&&&&&&&//&缓存存在,删除缓存&&&&&&&&&String&key&=&&city_&&+&&&&&&&&&&boolean&hasKey&=&redisTemplate.hasKey(key);&&&&&&&&&if&(hasKey)&{&&&&&&&&&&&&&redisTemplate.delete(key);&&&&&&&&&&&&&&&LOGGER.info(&CityServiceImpl.deleteCity()&:&从缓存中删除城市&ID&&&&&&+&id);&&&&&&&&&}&&&&&&&&&return&&&&&&}&&&}&
首先这里注入了 RedisTemplate 对象。联想到 Spring 的 JdbcTemplate ,RedisTemplate 封装了
RedisConnection,具有连接管理,序列化和 Redis 操作等功能。还有针对 String 的支持对象
StringRedisTemplate。
Redis 操作视图接口类用的是 ValueOperations,对应的是 Redis String/Value
操作。还有其他的操作视图,ListOperations、SetOperations、ZSetOperations 和 HashOperations
。ValueOperations 插入缓存是可以设置失效时间,这里设置的失效时间是 10 s。
回到更新缓存的逻辑
a. findCityById 获取城市逻辑:
如果缓存存在,从缓存中获取城市信息
如果缓存不存在,从 DB 中获取城市信息,然后插入缓存
b. deleteCity 删除 / updateCity 更新城市逻辑:
如果缓存存在,删除
如果缓存不存在,不操作
其他不明白的,可以 git clone 下载工程 springboot-learning-example ,工程代码注解很详细。
https://github.com/JeffLi1993/springboot-learning-example。
本文涉及到 Spring Boot 在使用 Redis 缓存时,一个是缓存对象需要序列化,二个是缓存更新策略是如何的。
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢!
【编辑推荐】【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点热点头条头条头条
24H热文一周话题本月最赞
讲师:290844人学习过
讲师:42637人学习过
讲师:262692人学习过
精选博文论坛热帖下载排行
通榆,这个距离各个交通枢纽都十万八千里的偏僻小县城,搭载着电子商务的快车,踏上了云高速,开辟了如火如荼的电商致富的新战场,实现了一...
订阅51CTO邮刊

我要回帖

更多关于 spring boot redis 的文章

 

随机推荐