天天看点

redis 学习笔记(5)-Spring与Jedis的集成

使用步骤:

一、pom添加依赖项

其它Spring必备组件,比如Core,Beans之类,大家自行添加吧

观察一下:

redis 学习笔记(5)-Spring与Jedis的集成

jedis、jredis等常用java的redis client已经支持了,不知道以后会不会集成Redisson,spring-data-redis提供了一个非常有用的类:StringRedisTemplate

redis 学习笔记(5)-Spring与Jedis的集成

对于大多数缓存应用场景而言,字符串是最常用的缓存项,用StringRedisTemplate可以轻松应付。

二、spring配置

redis 学习笔记(5)-Spring与Jedis的集成
redis 学习笔记(5)-Spring与Jedis的集成

View Code

提示:上面配置中的端口为sentinel的端口,而非redis-server的端口。

注:26-28行,经试验,如果修改了默认端口,这里必须明细指定hostName及port,否则运行后,无法正确读写缓存,参考下面的配置:

(2016-4-2更新:最新1.6.4版的spring-data-redis 已经修正了这个问题,无需再指定端口和hostname)

其中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值如果改成true,经实际测试,发现偶尔会报如下错误(如果报错,换成false通常就可以了):

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写入缓存.

三、单元测试

redis 学习笔记(5)-Spring与Jedis的集成
redis 学习笔记(5)-Spring与Jedis的集成

运行一下,行云流水般的输出:

...

信息: Created JedisPool to master at 10.6.144.***:7030

http://yjmyzz.cnblogs.com/

---------------

A

B

C

SHA - 上海虹桥

PVG - 浦东

PEK - 北京

注意红色标出部分,从eclipse控制台的输出,还能看出当前的master是哪台服务器

这里再补充一点小技巧:如果想遍历所有master及slave可以参考以下代码

redis 学习笔记(5)-Spring与Jedis的集成
redis 学习笔记(5)-Spring与Jedis的集成

输出类似下面的结果:

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

redis 学习笔记(5)-Spring与Jedis的集成
redis 学习笔记(5)-Spring与Jedis的集成

然后就可以这样用了:

redis 学习笔记(5)-Spring与Jedis的集成
redis 学习笔记(5)-Spring与Jedis的集成

其中SampleBean的定义如下:

redis 学习笔记(5)-Spring与Jedis的集成
redis 学习笔记(5)-Spring与Jedis的集成

注:由于不是标准的String类型,所以在redis控制台,用./redis-cli get myBean是看不到缓存内容的,只能得到nil的输出,不要误以为set没成功!通过代码是可以正常get到缓存值的。 

另外关于POJO对象的缓存,还有二个注意事项:

a) POJO类必须要有默认的无参构造函数,否则反序列化时会报错

b) ObjectRedisTemplate<T>中的T不能是接口,比如 DomainModelA继承自接口 IModelA,使用ObjectRedisTemplate时,要写成ObjectRedisTemplate<DomainModelA>而不是ObjectRedisTemplate<IModelA>,否则反序列化时也会出错