JRedis单机使用

发表时间:2017-07-19 21:58:28 浏览量( 12 ) 留言数( 0 )

学习目标:

1、了解Spring整合Redis的连接

2、掌握RedisTemplate的基本使用

3、发布订阅模式的使用

学习过程:

   本节课我们使用Spring 整合Redis,Redis使用单机模式,下一节课我们使用Spring Boot整合Redis,配置更简单一点。

   1、先导入基本的Spring的依赖,支持Redis需要在导入以下的依赖

		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
			<version>1.8.10.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.9.0</version>
		</dependency>

   2、连接Redis的配置文件

(1)redis.properties

#访问地址  
redis.host=192.168.8.234
#访问端口  
redis.port=6379  
#注意,如果没有password,此处不设置值,但这一项要保留  
redis.password=  
  
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。  
redis.maxIdle=300  
#连接池的最大数据库连接数。设为0表示无限制  
redis.maxActive=600  
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。  
redis.maxWait=1000  
#在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;  
redis.testOnBorrow=true

(2)Spring的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd  http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd     http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

 <!-- scanner redis properties  -->  
    <context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/>  
  
    <!--(1)如果你有多个数据源需要通过<context:property-placeholder管理,且不愿意放在一个配置文件里,那么一定要加上ignore-unresolvable=“true"-->  
    <!--(2)注意新版的(具体从哪个版本开始不清楚,有兴趣可以查一下)JedisPoolConfig的property name,不是maxActive而是maxTotal,而且没有maxWait属性,建议看一下Jedis源码。-->  
    <!-- redis连接池 -->  
    <bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig">  
        <property name="maxTotal" value="${redis.maxActive}"></property>  
        <property name="maxIdle" value="${redis.maxIdle}"></property>  
        <property name="maxWaitMillis" value="${redis.maxWait}"></property>  
        <property name="testOnBorrow" value="${redis.testOnBorrow}"></property>  
    </bean>  
    <!-- redis连接工厂 -->  
    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">  
        <property name="hostName" value="${redis.host}"></property>  
        <property name="port" value="${redis.port}"></property>  
        <property name="password" value="${redis.password}"></property>  
        <property name="poolConfig" ref="jedisConfig"></property>  
    </bean>  
    <!-- redis操作模板,这里采用尽量面向对象的模板 -->  
     <!-- 配置RedisTemplate -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>  
        <!--     如果不配置Serializer,那么存储的时候只能使用String,如果用对象类型存储,那么会提示错误 can't cast to String!!!-->  
        <property name="keySerializer">  
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>  
        </property>  
        <property name="valueSerializer">  
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>  
        </property>  
        <!--开启事务-->  
        <property name="enableTransactionSupport" value="true"/>  
    </bean>  

  
</beans>

 

  3、测试代码:

@RunWith(SpringJUnit4ClassRunner.class) // 
@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) // 
public class RedisTest {
	
	@Resource(name = "redisTemplate")
	private RedisTemplate  template;
	
	@Test  
    public void testSpringRedis() {  
		template.opsForValue().set("spring", "springredis");
	}
	
	@Test  
    public void testgetRedis() {  
		String temp=(String) template.opsForValue().get("spring");
		System.out.println(temp);
	}

}

   4、其他常用的方法

上面的例子我们使用了简单String类型。如果使用其他类型也有对应的方法

	private ValueOperations<K, V> valueOps;
	private ListOperations<K, V> listOps;
	private SetOperations<K, V> setOps;
	private ZSetOperations<K, V> zSetOps;
	private GeoOperations<K, V> geoOps;
	private HyperLogLogOperations<K, V> hllOps;

   5、Publish/发布订阅模式的使用

(1)定义消息监听器

public class RedisMessageListener implements MessageListener {  
  
    @Autowired  
    RedisTemplate redisTemplate;  
  
    RedisSerializer serializer ;

	@Override
	public void onMessage(Message message, byte[] pattern) {
		serializer = redisTemplate.getValueSerializer()  ;
		String messageStr = (String) serializer.deserialize(message.getBody());
		System.out.println(messageStr);
	} 
}

  (2)配置监听器

	<bean id="redisMessageListener" class="com.sturedis1.RedisMessageListener">
	</bean>

	<bean id="redisContainer"
		class="org.springframework.data.redis.listener.RedisMessageListenerContainer">
		<property name="connectionFactory" ref="connectionFactory" />
		<property name="messageListeners">
			<!-- map of listeners and their associated topics (channels or/and patterns) -->
			<map>
				<entry key-ref="redisMessageListener">
					<bean class="org.springframework.data.redis.listener.ChannelTopic">
						<constructor-arg value="mytopic" />
					</bean>
				</entry>
			</map>
		</property>
	</bean>

(3)测试

	@Test  
    public void testPublish() {  
		template.convertAndSend("mytopic", "hello");
	}
	@Test  
    public void testSub() {  
		Scanner scanner=new Scanner(System.in);
		scanner.next();
	}