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

首先不得不服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之类,大家自行添加吧

观察一下:

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

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

二、spring配置

 1     <bean id="redisSentinelConfiguration"
 2         class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
 3         <property name="master">
 4             <bean class="org.springframework.data.redis.connection.RedisNode">
 5                 <property name="name" value="mymaster"></property>
 6             </bean>
 7         </property>
 8         <property name="sentinels">
 9             <set>
10                 <bean class="org.springframework.data.redis.connection.RedisNode">
11                     <constructor-arg index="0" value="10.6.1**.**5" />
12                     <constructor-arg index="1" value="7031" />
13                 </bean>
14                 <bean class="org.springframework.data.redis.connection.RedisNode">
15                     <constructor-arg index="0" value="10.6.1**.**6" />
16                     <constructor-arg index="1" value="7031" />
17                 </bean>
18                 <bean class="org.springframework.data.redis.connection.RedisNode">
19                     <constructor-arg index="0" value="10.6.1**.**1" />
20                     <constructor-arg index="1" value="7031" />
21                 </bean>
22             </set>
23         </property>
24     </bean>
25
26      <bean id="jedisConnFactory"
27         class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
28         <constructor-arg ref="redisSentinelConfiguration" />
29     </bean>
30
31     <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
32         <property name="connectionFactory" ref="jedisConnFactory" />
33     </bean>

这里我们使用Sentinel模式来配置redis连接,从上篇学习知道,sentinel是一种高可用架构,个人推荐在生产环境中使用sentinel模式。

三、单元测试

 1     @Test
 2     public void testSpringRedis() {
 3         ConfigurableApplicationContext ctx = null;
 4         try {
 5             ctx = new ClassPathXmlApplicationContext("spring.xml");
 6
 7             StringRedisTemplate stringRedisTemplate = ctx.getBean("stringRedisTemplate", StringRedisTemplate.class);
 8
 9             // String读写
10             stringRedisTemplate.delete("myStr");
11             stringRedisTemplate.opsForValue().set("myStr", "http://yjmyzz.cnblogs.com/");
12             System.out.println(stringRedisTemplate.opsForValue().get("myStr"));
13             System.out.println("---------------");
14
15             // List读写
16             stringRedisTemplate.delete("myList");
17             stringRedisTemplate.opsForList().rightPush("myList", "A");
18             stringRedisTemplate.opsForList().rightPush("myList", "B");
19             stringRedisTemplate.opsForList().leftPush("myList", "0");
20             List<String> listCache = stringRedisTemplate.opsForList().range(
21                     "myList", 0, -1);
22             for (String s : listCache) {
23                 System.out.println(s);
24             }
25             System.out.println("---------------");
26
27             // Set读写
28             stringRedisTemplate.delete("mySet");
29             stringRedisTemplate.opsForSet().add("mySet", "A");
30             stringRedisTemplate.opsForSet().add("mySet", "B");
31             stringRedisTemplate.opsForSet().add("mySet", "C");
32             Set<String> setCache = stringRedisTemplate.opsForSet().members(
33                     "mySet");
34             for (String s : setCache) {
35                 System.out.println(s);
36             }
37             System.out.println("---------------");
38
39             // Hash读写
40             stringRedisTemplate.delete("myHash");
41             stringRedisTemplate.opsForHash().put("myHash", "PEK", "北京");
42             stringRedisTemplate.opsForHash().put("myHash", "SHA", "上海虹桥");
43             stringRedisTemplate.opsForHash().put("myHash", "PVG", "浦东");
44             Map<Object, Object> hashCache = stringRedisTemplate.opsForHash()
45                     .entries("myHash");
46             for (Map.Entry<Object, Object> entry : hashCache.entrySet()) {
47                 System.out.println(entry.getKey() + " - " + entry.getValue());
48             }
49
50             System.out.println("---------------");
51
52         } finally {
53             if (ctx != null && ctx.isActive()) {
54                 ctx.close();
55             }
56         }
57
58     }

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

...

信息: Created JedisPool to master at 10.6.144.***:7030
http://yjmyzz.cnblogs.com/
---------------
0
A
B
---------------
C
B
A
---------------
SHA - 上海虹桥
PVG - 浦东
PEK - 北京
---------------

...

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

三、POJO对象的缓存

Spring提供的StringRedisTemplate只能对String操作,大多数情况下已经够用,但如果真需要向redis中存放POJO对象也不难,我们可以参考StringRedisTemplate的源码,扩展出ObjectRedisTemplate

 1 package org.springframework.data.redis.core;
 2
 3 import org.springframework.data.redis.connection.DefaultStringRedisConnection;
 4 import org.springframework.data.redis.connection.RedisConnection;
 5 import org.springframework.data.redis.connection.RedisConnectionFactory;
 6 import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
 7 import org.springframework.data.redis.serializer.RedisSerializer;
 8
 9 public class ObjectRedisTemplate<T> extends RedisTemplate<String, T> {
10
11     public ObjectRedisTemplate(RedisConnectionFactory connectionFactory,
12             Class<T> clazz) {
13
14         RedisSerializer<T> objectSerializer = new Jackson2JsonRedisSerializer<T>(
15                 clazz);
16         setKeySerializer(objectSerializer);
17         setValueSerializer(objectSerializer);
18         setHashKeySerializer(objectSerializer);
19         setHashValueSerializer(objectSerializer);
20
21         setConnectionFactory(connectionFactory);
22         afterPropertiesSet();
23     }
24
25     protected RedisConnection preProcessConnection(RedisConnection connection,
26             boolean existingConnection) {
27         return new DefaultStringRedisConnection(connection);
28     }
29 }

然后就可以这样用了:

 1     @Test
 2     public void testSpringRedis() {
 3         ConfigurableApplicationContext ctx = null;
 4         try {
 5             ctx = new ClassPathXmlApplicationContext("spring.xml");
 6
 7             JedisConnectionFactory connFactory = ctx.getBean(
 8                     "jedisConnFactory", JedisConnectionFactory.class);
 9
10             ObjectRedisTemplate<SampleBean> template = new ObjectRedisTemplate<SampleBean>(
11                     connFactory, SampleBean.class);
12
13             template.delete("myBean");
14             SampleBean bean = new SampleBean("菩提树下的杨过");
15             template.opsForValue().set("myBean", bean);
16
17             System.out.println(template.opsForValue().get("myBean"));
18
19         } finally {
20             if (ctx != null && ctx.isActive()) {
21                 ctx.close();
22             }
23         }
24     }

其中SampleBean的定义如下:

 1 package com.cnblogs.yjmyzz;
 2
 3 import java.io.Serializable;
 4
 5 public class SampleBean implements Serializable {
 6
 7     private static final long serialVersionUID = -303232410998377570L;
 8
 9     private String name;
10
11     public SampleBean() {
12     }
13
14     public SampleBean(String name) {
15         this.name = name;
16     }
17
18     public String getName() {
19         return name;
20     }
21
22     public void setName(String name) {
23         this.name = name;
24     }
25
26     public String toString() {
27         return "name:" + name;
28     }
29
30 }

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

时间: 2024-10-13 17:47:38

redis 学习笔记(5)-Spring与Jedis的集成的相关文章

Redis学习笔记7--Redis管道(pipeline)

redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client.基本的通信过程如下: Client: INCR X Server: 1 Client: INCR X Server: 2 Client: INCR X Server: 3 Client: INCR X Server: 4

Redis学习笔记

Redis学习笔记:Redis是什么?redis是开源BSD许可高级的key-vlue存储系统可以用来存储字符串哈希结构链表.结构.集合,因此常用来提供数据结构服务. redis和memcache相比的独特之处:1.redis可以用来做存储,而memcache是用来做缓存 这个特点主要因为其有"持久化"的功能.2.存储的数据有"结构",对于memcache来说,存储的数据只有1种类型"字符串"而 redis则可以存储字符串.链表.哈希机构.集合.

(转)redis 学习笔记(1)-编译、启动、停止

redis 学习笔记(1)-编译.启动.停止 一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先到这里下载Stable稳定版,目前最新版本是2.8.17 1.2 上传到linux,然后运行以下命令解压 tar xzf redis-2.8.17.tar.gz 1.3 编译 cd redis-2.8.17make 注:make命令需要linux上安装gcc,若机器上未安装gcc,redhat环境下,如

Redis学习笔记4-Redis配置具体解释

在Redis中直接启动redis-server服务时, 採用的是默认的配置文件.採用redis-server   xxx.conf 这种方式能够依照指定的配置文件来执行Redis服务. 依照本Redis学习笔记中Redis的依照方式依照后,Redis的配置文件是/etc/redis/6379.conf.以下是Redis2.8.9的配置文件各项的中文解释. #daemonize no 默认情况下, redis 不是在后台运行的.假设须要在后台运行,把该项的值更改为 yes daemonize ye

Redis学习笔记~目录

redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hashs(哈希类型).这些数据类型都 支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排 序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更

mybatis学习笔记(14)-spring和mybatis整合

mybatis学习笔记(14)-spring和mybatis整合 mybatis学习笔记14-spring和mybatis整合 整合思路 整合环境 sqlSessionFactory 原始dao开发和spring整合后 mapper代理开发 遇到的问题 本文主要将如何将spring和mybatis整合,只是作简单的示例,没有使用Maven构建.并展示mybatis与spring整合后如何进行原始dao开发和mapper代理开发. 整合思路 需要spring通过单例方式管理SqlSessionFa

Redis学习笔记(简单了解与运行)

Redis学习笔记(简单了解与运行) 开源的非关系型数据库 是REmote Dictionary Server(远程字典服务器)的缩写,以字典结构存储数据 允许其他应用通过TCP协议读写字典中的内容. Redis支持存储的键值数据类型 字符串类型 散列类型 列表类型 集合类型 有序集合类型 Redis的特性 通过一个列子看出Mysql和Redis的存储区别 例如: (存储一篇文章,文章包括:标题(title),正文(content),阅读量(views),标签(tags)) 需求: 把数据存储在

Redis学习笔记4-Redis配置详解

原文:  http://blog.csdn.net/mashangyou/article/details/24555191 在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redis学习笔记中Redis的按照方式按照后,Redis的配置文件是/etc/redis/6379.conf.下面是Redis2.8.9的配置文件各项的中文解释. 1 #daemon

Redis学习笔记(增删查)

Redis学习笔记(增删查) 向数据库中添加一个键 SET key value 获取数据库中的key KEYS pattern pattern支持glob风格通配符格式 " ? " 匹配一个字符 " * " 匹配任意字符 " [] " 匹配括号间的任一字符,可以使用" - "符号表示一个范围,例如:a[a-z]c " \x " 匹配字符x,用于转义字符.如需要匹配"?",就需要用 \?