一、需要的JAR包

 

<!-- spring redis 整合 -->
      <dependency>  
            <groupId>org.springframework.data</groupId>  
            <artifactId>spring-data-redis</artifactId>  
            <version>1.6.0.RELEASE</version>  
        </dependency> 
		
        <!-- jedis-->
	<dependency>
		<groupId>redis.clients</groupId>
		<artifactId>jedis</artifactId>
		<version>2.7.0</version>
	</dependency>

 

二、配置文件

spring-redis.xml

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:cache="http://www.springframework.org/schema/cache"
	xsi:schemaLocation="http://www.springframework.org/schema/beans  
		http://www.springframework.org/schema/beans/spring-beans-4.1.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-4.1.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-4.1.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-4.1.xsd 
		http://www.springframework.org/schema/cache   
        http://www.springframework.org/schema/cache/spring-cache-4.1.xsd">

	  
	<!-- redis config start -->
	
	
	
    <!-- 配置JedisPoolConfig实例 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${redis.maxIdle}" />
        <property name="maxTotal" value="${redis.maxActive}" />
        <property name="maxWaitMillis" value="${redis.maxWait}" />
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />
    </bean>  

	<!-- 配置JedisConnectionFactory -->
    <bean id="jedisConnectionFactory"
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis.host}" />
        <property name="port" value="${redis.port}" />
        <!-- <property name="password" value="${redis.password}" /> -->
        <property name="database" value="${redis.dbIndex}" />
        <property name="poolConfig" ref="poolConfig" />
    </bean>

	<!-- 配置RedisTemplate -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory" />
        <property name="keySerializer">  
        	<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />  
    	</property>  
	    <property name="valueSerializer">  
	        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />  
	    </property>  
	    <property name="hashKeySerializer">  
	        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />  
	    </property>  
	    <property name="hashValueSerializer">  
	        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />  
	    </property>
    </bean> 
	

    <!-- redis config end -->
    
    

</beans>

application.xml (主配置)

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   	 	<property name="locations">
   	 		<list>
	   	 		<!--<value>classpath:db.properties</value>
	   	 		<value>classpath:email.properties</value>-->
	   	 		<value>classpath:redis.properties</value>
   	 		</list>
   	 	</property>
   	 	<!-- <property name="properties">
        	<value>custom.strategy.class=com.foo.DefaultStrategy</value>
    	</property> -->
	</bean>

<import resource="classpath:spring/spring-redis.xml" />

 

redis.properties

 

#访问地址  
redis.host=127.0.0.1  
#访问端口  
redis.port=6379  
#注意,如果没有password,此处不设置值,但这一项要保留  
redis.password=  

#代表存储是从第0个开始
redis.dbIndex=0

redis.expiration=3000

#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。  
redis.maxIdle=300  
#连接池的最大数据库连接数。设为0表示无限制  
redis.maxActive=600  
#最大建立连接等待时间:单位ms。如果超过此时间将接到异常。设为-1表示无限制。  
redis.maxWait=1000  
#在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;  
redis.testOnBorrow=true

 

三、测试

 

@Test
public void testRedis(){
	RedisTemplate redisTemplate = (RedisTemplate)applicationContext.getBean("redisTemplate");
	redisTemplate.opsForValue().set("mykey","abcd");
	String key = (String)redisTemplate.opsForValue().get("mykey"); // \xAC\xED\x00\x05t\x00\x06mykey2
	System.out.println(key);
				
}

 

四、序列化规则Serializer

1.前言:将数据存放到Redis中,以及数据读取。这里必然涉及到数据的系列化和反系列化

spring中提供的Serializer类StringRedisSerializer , JdkSerializationRedisSerializer , JacksonJsonRedisSerializer , GenericJackson2JsonRedisSerializer

2.区别:

1.org.springframework.data.redis.core.StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的

 

2.org.springframework.data.redis.core.RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的

 

3.JacksonJsonRedisSerializer和GenericJackson2JsonRedisSerializer,两者都能系列化成json,但是后者会在json中加入@class属性,类的全路径包名,方便反系列化。前者如果存放了List则在反系列化的时候如果没指定TypeReference则会报错java.util.LinkedHashMap cannot be cast to

3.小结 :不同的Serializer影响redis中key 和 value值的生成规则

将spring-redis.xml中  RedisTemplate模板的配置改下

<property name="hashValueSerializer">
	<bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
</property>

4.测试 将User对象序列化到redis中(使用GenericJackson2JsonRedisSerializer规则)

@Test
public void testRedis2(){
	RedisTemplate redisTemplate = (RedisTemplate)applicationContext.getBean("redisTemplate");
	redisTemplate.opsForHash().put("redisHash", "one", new User(1,"z","123",new Date(),"G"));
	User user = (User)redisTemplate.opsForHash().get("redisHash", "one");
	System.out.println(user); //User [Cd=1, username=z, password=123, birthday=Tue May 22 15:17:53 CST 2018, address=G]
}

5.结果

关于redis中存储的value值 ,spring 将User对象序列化为json格式字符串进行存储

{
  "@class": "com.learn.frame.spring.po.User",
  "username": "z",
  "password": "123",
  "birthday": [
    "java.util.Date",
    1526973473075
  ],
  "address": "G",
  "cd": 1
}

 

五、RedisTemplate使用

 

1.RedisTemplate中定义了对5种数据结构操作

redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

2.StringRedisTemplate与RedisTemplate

两者的关系是StringRedisTemplate继承RedisTemplate。

两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。

SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

 

3.@Bean注解方式 RedisTemplate配置如下

 

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
{
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(jackson2JsonRedisSerializer);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashKeySerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
}

4.Redis的String数据结构 (推荐使用StringRedisTemplate)

注意:如果使用RedisTemplate需要更改序列化方式

 

RedisSerializer<String> stringSerializer = new StringRedisSerializer();
template.setKeySerializer(stringSerializer );
template.setValueSerializer(stringSerializer );
template.setHashKeySerializer(stringSerializer );
template.setHashValueSerializer(stringSerializer );