Spring与Jedis的集成
2015-08-06 16:02
585 查看
转自:http://www.cnblogs.com/yjmyzz/p/4113019.html
首先不得不服Spring这个宇宙无敌的开源框架,几乎整合了所有流行的其它框架,http://projects.spring.io/spring-data/ 从这上面看,当下流行的redis、solr、hadoop、mongoDB、couchBase...
全都收入囊中。对于redis整合而言,主要用到的是spring-data-redis
使用步骤:
一、pom添加依赖项
其它Spring必备组件,比如Core,Beans之类,大家自行添加吧
观察一下:
![](http://images.cnitblog.com/blog/27612/201411/211517041878486.jpg)
jedis、jredis等常用java的redis client已经支持了,不知道以后会不会集成Redisson,spring-data-redis提供了一个非常有用的类:StringRedisTemplate
![](http://images.cnitblog.com/blog/27612/201411/211519443597653.jpg)
对于大多数缓存应用场景而言,字符串是最常用的缓存项,用StringRedisTemplate可以轻松应付。
二、spring配置
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View
Code
这里我们使用Sentinel模式来配置redis连接,从上篇学习知道,sentinel是一种高可用架构,个人推荐在生产环境中使用sentinel模式。
注:26-28行,经试验,如果修改了默认端口,这里必须明细指定hostName及port,否则运行后,无法正确读写缓存,参考下面的配置:
其中hostName为当前master的IP,port为redis-server的运行端口(非sentinel端口),此外还要设置usePool为false,由于sentinel可能会自行切换master节点,如果不清楚当前的master节点是哪台机器,可以用前面提到的命令./redis-cli
-p <sentinal端口号> sentinel masters查看,或者用java代码输出,参考下面的代码:
另外<property name="usePool" value="false"/> 这里的value值建议设置成false,如果改成true,经实际测试,发现在有些环境下会报如下错误:
redis.clients.jedis.exceptions.JedisDataException: ERR unknown command 'SET'
其它注意事项:
配置文件中的sentinels属性的Set 中的节点,并非一定要在同一个master下,也可以是归属于多个master,即:如果这里配置了10个node信息,其中1-3归属于master1,剩下的4-10属于master2,这也是允许的。
这样调用时,通过StringRedisTemplate.getConnectionFactory().getSentinelConnection().masters()可以返回一个master的列表,然后代码中根据需要,向某一个需要的master写入缓存.
三、单元测试
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View
Code
运行一下,行云流水般的输出:
...
信息: Created JedisPool to master at 10.6.144.***:7030
http://yjmyzz.cnblogs.com/
---------------
0
A
B
---------------
C
B
A
---------------
SHA - 上海虹桥
PVG - 浦东
PEK - 北京
---------------
...
注意红色标出部分,从eclipse控制台的输出,还能看出当前的master是哪台服务器
这里再补充一点小技巧:如果想遍历所有master及slave可以参考以下代码
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View
Code
输出类似下面的结果:
master => 172.20.16.191:6379
slaves of 172.20.16.191:6379 => 172.20.16.192:6379
注:这里输出的slaves列表,经实际测试,发现只是根据redis server端的配置呆板的返回slave node列表,不管这些node是死是活,换句话说,就算某个slave已经down掉,这里依然会返回。
三、POJO对象的缓存
Spring提供的StringRedisTemplate只能对String操作,大多数情况下已经够用,但如果真需要向redis中存放POJO对象也不难,我们可以参考StringRedisTemplate的源码,扩展出ObjectRedisTemplate
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View
Code
然后就可以这样用了:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View
Code
其中SampleBean的定义如下:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View
Code
注:由于不是标准的String类型,所以在redis控制台,用./redis-cli get myBean是看不到缓存内容的,只能得到nil的输出,不要误以为set没成功!通过代码是可以正常get到缓存值的。
另外关于POJO对象的缓存,还有二个注意事项:
a) POJO类必须要有默认的无参构造函数,否则反序列化时会报错
b) ObjectRedisTemplate<T>中的T不能是接口,比如 DomainModelA继承自接口 IModelA,使用ObjectRedisTemplate时,要写成ObjectRedisTemplate<DomainModelA>而不是ObjectRedisTemplate<IModelA>,否则反序列化时也会出错
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
首先不得不服Spring这个宇宙无敌的开源框架,几乎整合了所有流行的其它框架,http://projects.spring.io/spring-data/ 从这上面看,当下流行的redis、solr、hadoop、mongoDB、couchBase...
全都收入囊中。对于redis整合而言,主要用到的是spring-data-redis
使用步骤:
一、pom添加依赖项
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.4.1.RELEASE</version> </dependency>
其它Spring必备组件,比如Core,Beans之类,大家自行添加吧
观察一下:
![](http://images.cnitblog.com/blog/27612/201411/211517041878486.jpg)
jedis、jredis等常用java的redis client已经支持了,不知道以后会不会集成Redisson,spring-data-redis提供了一个非常有用的类:StringRedisTemplate
![](http://images.cnitblog.com/blog/27612/201411/211519443597653.jpg)
对于大多数缓存应用场景而言,字符串是最常用的缓存项,用StringRedisTemplate可以轻松应付。
二、spring配置
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View
Code
这里我们使用Sentinel模式来配置redis连接,从上篇学习知道,sentinel是一种高可用架构,个人推荐在生产环境中使用sentinel模式。
注:26-28行,经试验,如果修改了默认端口,这里必须明细指定hostName及port,否则运行后,无法正确读写缓存,参考下面的配置:
<bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="10.6.53.xxx"/> <property name="port" value="8830"/> <property name="usePool" value="false"/> <constructor-arg ref="redisSentinelConfiguration"/> </bean>
其中hostName为当前master的IP,port为redis-server的运行端口(非sentinel端口),此外还要设置usePool为false,由于sentinel可能会自行切换master节点,如果不清楚当前的master节点是哪台机器,可以用前面提到的命令./redis-cli
-p <sentinal端口号> sentinel masters查看,或者用java代码输出,参考下面的代码:
1 ApplicationContext ctx = new FileSystemXmlApplicationContext("/opt/app/spring-redis.xml"); 2 StringRedisTemplate template = ctx.getBean(StringRedisTemplate.class); 3 for (RedisServer m : template.getConnectionFactory().getSentinelConnection().masters()) { 4 logger.debug(m); 5 }
另外<property name="usePool" value="false"/> 这里的value值建议设置成false,如果改成true,经实际测试,发现在有些环境下会报如下错误:
redis.clients.jedis.exceptions.JedisDataException: ERR unknown command 'SET'
其它注意事项:
配置文件中的sentinels属性的Set 中的节点,并非一定要在同一个master下,也可以是归属于多个master,即:如果这里配置了10个node信息,其中1-3归属于master1,剩下的4-10属于master2,这也是允许的。
这样调用时,通过StringRedisTemplate.getConnectionFactory().getSentinelConnection().masters()可以返回一个master的列表,然后代码中根据需要,向某一个需要的master写入缓存.
三、单元测试
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View
Code
运行一下,行云流水般的输出:
...
信息: Created JedisPool to master at 10.6.144.***:7030
http://yjmyzz.cnblogs.com/
---------------
0
A
B
---------------
C
B
A
---------------
SHA - 上海虹桥
PVG - 浦东
PEK - 北京
---------------
...
注意红色标出部分,从eclipse控制台的输出,还能看出当前的master是哪台服务器
这里再补充一点小技巧:如果想遍历所有master及slave可以参考以下代码
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View
Code
输出类似下面的结果:
master => 172.20.16.191:6379
slaves of 172.20.16.191:6379 => 172.20.16.192:6379
注:这里输出的slaves列表,经实际测试,发现只是根据redis server端的配置呆板的返回slave node列表,不管这些node是死是活,换句话说,就算某个slave已经down掉,这里依然会返回。
三、POJO对象的缓存
Spring提供的StringRedisTemplate只能对String操作,大多数情况下已经够用,但如果真需要向redis中存放POJO对象也不难,我们可以参考StringRedisTemplate的源码,扩展出ObjectRedisTemplate
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View
Code
然后就可以这样用了:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View
Code
其中SampleBean的定义如下:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
View
Code
注:由于不是标准的String类型,所以在redis控制台,用./redis-cli get myBean是看不到缓存内容的,只能得到nil的输出,不要误以为set没成功!通过代码是可以正常get到缓存值的。
另外关于POJO对象的缓存,还有二个注意事项:
a) POJO类必须要有默认的无参构造函数,否则反序列化时会报错
b) ObjectRedisTemplate<T>中的T不能是接口,比如 DomainModelA继承自接口 IModelA,使用ObjectRedisTemplate时,要写成ObjectRedisTemplate<DomainModelA>而不是ObjectRedisTemplate<IModelA>,否则反序列化时也会出错
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- Java垃圾回收
- java的插入排序
- Java异常详解
- springmvc controller单实例
- Java实现二叉树的定义和递归实现
- Java中的10颗语法糖
- SVN提交忽略*.class、.classpath、.mymetadata、.project、.settings、.myeclipse和其他非版本控制文件
- 序列化java对象
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
- Java中的Enum的使用与分析
- Java序列化
- java注解annotation,自定义注解--shanchu
- 获取servlet相关的域对象
- java中重载与重写的区别
- Java疑问:-------在Socket中用PrintWriter 写入的数据为什么用DataInputStream不能读取?
- java代码优化
- #笔记#圣思园 JavaWeb 第59讲——使用Firebug调试JS、JSUnit,XUnit
- Java Sleep() 与 Wait()的机制原理与区别
- 【@Transactional】Spring 之注解事务 @Transactional
- 线程安全与并发安全探究(四)-java集合框架