spring整合redis

使用版本

redis-4.0.6

jedis-2.9.0.jar

spring4.3.13

spring-data-redis-1.8.3.jar

spring-data-commons-2.0.1.jar

一共两篇,第一篇是java直接使用redis,第二篇使用spring整合redis。

先看一下目录:

service里面是本篇使用的三个文件,目录有两个spring的配置文件,user里面的文件在上一篇介绍过了(不在贴出来了)。

首先简单的实现一下spring+redis,UserService.java:

package service;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;

import user.User;


/** 
* @author 朱宏亮
* @version 创建时间:2017年12月19日 下午4:41:56 
* 简单的spring整合redis  没有自动监听信息的
*/
@Service
public class UserService {
	
	@Autowired
    private RedisTemplate<String, Object> redisTemplate;
	
	
	
	public void test(){
		String paramK = "spring";
        String paramV = "Hello,spring-redis-data!!!";
        redisTemplate.opsForValue().set(paramK, paramV);
        
	}
	
	public void add(){
	    //添加一个 key 
	    ValueOperations<String, Object> value = redisTemplate.opsForValue();
        value.set("zhl", "hello word");
	}
	
	public void get(){
	    //获取
	    System.out.println("\n获取String:");
	    ValueOperations<String, Object> value = redisTemplate.opsForValue();
	    System.out.println(value.get("zhl"));
	    System.out.println("删除zhl");
	    redisTemplate.delete("zhl");
	    System.out.println(value.get("zhl"));
	}
	
	public void addHash(){
	    //添加 一个 hash集合
	    HashOperations<String, Object, Object>  hash = redisTemplate.opsForHash();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("name", "朱宏亮");
        map.put("age", "26");
        hash.putAll("userMap", map);   
	}
	public void getHash(){
	    //获取 map
	    System.out.println("\n获取HashMap:");
	    HashOperations<String, Object, Object>  hash = redisTemplate.opsForHash();
	    System.out.println(hash.entries("userMap"));
	    System.out.println("删除userMap");
        redisTemplate.delete("userMap");
        System.out.println(hash.entries("userMap"));
	}
	

	
	public void addList(){
	    //添加 一个 list 列表
        ListOperations<String, Object> list = redisTemplate.opsForList();
        list.rightPush("zhlList", "朱宏亮1");
        list.rightPush("zhlList", "26");
       
	}
	public void getList(){
	    //输出 list
	    System.out.println("\n获取list:");
	    ListOperations<String, Object> list = redisTemplate.opsForList();
        System.out.println(list.range("zhlList", 0, 100));
        System.out.println("删除list");
        redisTemplate.delete("zhlList");
        System.out.println(list.range("zhlList", 0, 100));
	}
	
	public void addSet(){
	    //添加 一个 set 集合
        SetOperations<String, Object> set = redisTemplate.opsForSet();
        set.add("zhlSet", "朱宏亮");
        set.add("zhlSet", "26");
        set.add("zhlSet", "178cm");
        
	}
	public void getSet(){
	    //输出 set 集合
	    System.out.println("\n获取set集合:");
	    SetOperations<String, Object> set = redisTemplate.opsForSet();
        System.out.println(set.members("zhlSet"));
        System.out.println("删除zhlSet");
        redisTemplate.delete("zhlSet");
        System.out.println(set.members("zhlSet"));
	}
	
	public void addSet2(){
	    //添加有序的 set 集合
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        zset.add("zhlSet2", "朱宏亮", 0);
        zset.add("zhlSet2", "26", 1);
        zset.add("zhlSet2", "178cm", 2);
       
	}
	public void getSet2(){
	    //输出有序 set 集合
	    System.out.println("\n获取有序set集合:");
	    ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        System.out.println(zset.rangeByScore("zhlSet2", 0, 20));
        System.out.println("删除zhlSet2");
        redisTemplate.delete("zhlSet2");
        System.out.println(zset.rangeByScore("zhlSet2", 0, 20));
       
	}
   public void addUser(){
        User user = new User();
        user.setId("99");
        user.setName("zhl朱宏亮");
        user.setPhone("18628888888");
        user.setAddress("北京市海淀区西二旗");
        ValueOperations<String, Object> value = redisTemplate.opsForValue();
        value.set("user", user);
    }
    public void getUser(){
        System.out.println("\n获取User对象:");
        ValueOperations<String, Object> value = redisTemplate.opsForValue();
        User user = (User) value.get("user");
        System.out.println(user.getId());
        System.out.println(user.getName());
        System.out.println(user.getPhone());
        System.out.println(user.getAddress());
        System.out.println("删除user");
        redisTemplate.delete("user");
        System.out.println(value.get("user"));
    }
	    
	    
	
    @SuppressWarnings("resource")
	public static void main(String[] args){
        ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        UserService userService = (UserService) factory.getBean("userService");
        //userService.test();
        userService.add();
        userService.get();
        
        userService.addHash();
        userService.getHash();
        
        userService.addList();
        userService.getList();
        
        userService.addSet();
        userService.getSet();
        
        userService.addSet2();
        userService.getSet2();
        
        userService.addUser();
        userService.getUser();
        
    }
    
}
 

再来看看我们使用的配置文件applicationContext.xml:

<?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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:p="http://www.springframework.org/schema/p"
    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/context  
           http://www.springframework.org/schema/context/spring-context.xsd">
	
	
    <context:component-scan base-package="service" />


	
	 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="32"></property>
        <property name="maxIdle" value="6"></property>
        <property name="testOnBorrow" value="true" />
    </bean>

    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
        <property name="poolConfig" ref="jedisPoolConfig"></property>
        <property name="hostName" value="你的redis ip"></property>
        <property name="port" value="6379"></property>
        <property name="password" value="你的redis密码"></property>
        <property name="timeout" value="5500"></property>
        <property name="usePool" value="false"></property><!-- 连接池如果设置为true的话,程序永远不会结束,我这里仅测试学习使用,所以设置为false -->
    </bean>
    
 	<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"></property>
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
        </property>
    </bean>
	
	
	
</beans>

接下来直接运行UserService.java,能在控制台看到:

获取String:
hello word
删除zhl
null

获取HashMap:
{name=朱宏亮, age=26}
删除userMap
{}

获取list:
[朱宏亮1, 26]
删除list
[]

获取set集合:
[26, 178cm, 朱宏亮]
删除zhlSet
[]

获取有序set集合:
[朱宏亮, 26, 178cm]
删除zhlSet2
[]

获取User对象:
99
zhl朱宏亮
18628888888
北京市海淀区西二旗
删除user
null

接下来我们使用Spring整合redis,做一个发布/订阅模式

先看看订阅者自动监听的代码TopicMessageListener.java:

package service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;

import user.User;

/** 
* @author 朱宏亮
* @version 创建时间:2017年12月21日 下午5:51:01 
* 类说明 spring整合redis 消息自动监听
*/
public class TopicMessageListener implements MessageListener{
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {  
        this.redisTemplate = redisTemplate;  
    }  
  
    @Override  
    public void onMessage(Message message, byte[] pattern) {  

    	System.out.println("==============================");
    	String cName = redisTemplate.getValueSerializer().deserialize(message.getBody()).getClass().getSimpleName();
        System.out.println("类名:"+cName);
        
        if(cName.equals("String")){
             System.out.println("接受到的数据:"+redisTemplate.getValueSerializer().deserialize(message.getBody()));
             System.out.println("topicName:"+new String(message.getChannel()));
             System.out.println("topicName:"+new String(pattern));

        }
        if(cName.equals("User")){
            User user = (User) redisTemplate.getValueSerializer().deserialize(message.getBody());
            System.out.println("User.id:"+user.getId());  
            System.out.println("User.name:"+user.getName());  
            System.out.println("User.phone:"+user.getPhone());  
            System.out.println("User.address:"+user.getAddress());  
            System.out.println("topicName:"+new String(message.getChannel()));
            System.out.println("topicName:"+new String(pattern));

        	
        }
    }  
    
 
}

发布者TopicProducer.java:

package service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import user.User;
/**
 * @author 朱宏亮
 * 类说明 spring整合redis 消息发布者
 */
@Component
public class TopicProducer {
	
	@Autowired
    private RedisTemplate<String, Object> template;
	
	public void sendMessage(){
		 template.convertAndSend("redisChat", "我是中文");
		
		 User user = new User();
		 user.setId("88");
		 user.setName("朱宏亮");
		 user.setPhone("18628888888");
		 user.setAddress("中关村软件园");
		 template.convertAndSend("redisChat", user);
		 
		 template.convertAndSend("redisChat", "HELLO WORLD");
		 template.convertAndSend("redisChat", "辉煌国际");
		 template.convertAndSend("redisChat", "羊肉串");
		 template.convertAndSend("redisChat", "布劳威尔不动点");
		 
		 User user2 = new User();
		 user2.setId("99");
		 user2.setName("打杂的");
		 user2.setPhone("17788889999");
		 user2.setAddress("朝阳区建外soho");
		 template.convertAndSend("redisChat", user2);

	}

	@SuppressWarnings("resource")
	public static void main(String[] args) {

		 ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:ApplicationContext2.xml");
		 TopicProducer producer = (TopicProducer) factory.getBean("topicProducer");
		 producer.sendMessage();
		 

		
	}

}

配置文件ApplicationContext2.xml:

<?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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:p="http://www.springframework.org/schema/p"
    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/context  
           http://www.springframework.org/schema/context/spring-context.xsd">
    
    
    <context:component-scan base-package="service" />


    
     <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="32"></property>
        <property name="maxIdle" value="6"></property>
        <property name="testOnBorrow" value="true" />
    </bean>

    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
        <property name="poolConfig" ref="jedisPoolConfig"></property>
        <property name="hostName" value="8.8.8.8"></property>
        <property name="port" value="6379"></property>
        <property name="password" value=""></property>
        <property name="timeout" value="5500"></property>
        <property name="usePool" value="false"></property>
    </bean>
    
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"></property>
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
        </property>
    </bean>
    
    <bean id="topicMessageListener" class="service.TopicMessageListener">  
        <property name="redisTemplate" ref="redisTemplate"></property>  
    </bean>  
    
    <bean id="topicContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer" destroy-method="destroy">  
        <property name="connectionFactory" ref="jedisConnectionFactory"/>  
        <property name="taskExecutor">
            <bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">  
                <property name="poolSize" value="3"></property>  
            </bean>  
        </property>  
        <property name="messageListeners">  
            <map>  
                <entry key-ref="topicMessageListener">  
                    <bean class="org.springframework.data.redis.listener.ChannelTopic">  
                        <constructor-arg value="redisChat"/>  
                    </bean>  
                </entry>  
            </map>  
        </property>  
    </bean> 
    
  
    
</beans>

让我们运行一下TopicMessageListener.java文件,在eclipse上输出:

2017-12-24 18:55:45,516 [main] INFO  [org.springframework.context.support.ClassPathXmlApplicationContext] - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7e0b37bc: startup date [Sun Dec 24 18:55:45 CST 2017]; root of context hierarchy
2017-12-24 18:55:45,632 [main] INFO  [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - Loading XML bean definitions from class path resource [ApplicationContext2.xml]
2017-12-24 18:55:46,755 [main] INFO  [org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler] - Initializing ExecutorService  'org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler#754ba872'
2017-12-24 18:55:47,016 [main] INFO  [org.springframework.context.support.DefaultLifecycleProcessor] - Starting beans in phase 2147483647
==============================
类名:String
接受到的数据:我是中文
topicName:redisChat
topicName:redisChat
==============================
类名:User
User.id:88
User.name:朱宏亮
User.phone:18628888888
User.address:中关村软件园
topicName:redisChat
topicName:redisChat
==============================
类名:String
接受到的数据:HELLO WORLD
topicName:redisChat
topicName:redisChat
==============================
类名:String
接受到的数据:辉煌国际
topicName:redisChat
topicName:redisChat
==============================
类名:String
接受到的数据:羊肉串
topicName:redisChat
topicName:redisChat
==============================
类名:String
接受到的数据:布劳威尔不动点
topicName:redisChat
topicName:redisChat
==============================
类名:User
User.id:99
User.name:打杂的
User.phone:17788889999
User.address:朝阳区建外soho
topicName:redisChat
topicName:redisChat

这个时候消息订阅者会一直保持监听状态,就是这么简单
程序源码下载地址:https://gitee.com/zhuhongliang/RedisStudy

发表评论