Redis 第三集与Spring集成_轻量集群(Redis)

说明:

  1. 此项目演示Redis与Spring集成, Redis轻量级集群即分片模式
  2. Redis与Spring集成代码:JedisPoolSpring.java; Redis轻量级集群代码:ShardedJedisPoolSpring.java
  3. 代码中注释有具体的使用说明等讲解。

项目结构图==

Redis 第三集与Spring集成_轻量集群(Redis)_第1张图片
代码如下====
====>>>> JedisPoolSpring.java

 /**
 * 本地环境Redis连接池JedisPool集成Spring:
 * Spring环境中使用JedisPool
 *  即JedisPool与Spring集成
 *  
 * @author 拈花为何不一笑
 * 
 */
public class JedisPoolSpring {
	
	private JedisPool jedisPool;
	
	//初始化Spring容器
	public void initSpringContainer(){
		//构建Spring容器通过applicationContext-jedis.xml配置文件,联想一下Struts2的容器
		//容器的作用:提供AOP,DI即bean的注册和依赖注入等功能
		//Struts2的容器Container/ContainerImple构造函数为default只能在同类或同包下才能使用,可以看出该容器是Struts2内部专用的容器
		//Spring的容器是ApplicationContext是public构造函数,可以提供对内和对外都能使用。但是容器中的bean的访问是有限制条件的,这个条件如下:
		//通俗点说就是:new 出来的bean是不能使用Spring容器中的bean,new出来的bean是Spring容器外的bean,不归Spring容器管理。
		//即Spring bean提供被访问的前提是Spring容器中的bean相互访问,容器外的bean是不能"直接"访问容器内的bean,因为容器外的bean不是由Spring进行管理的。
		ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext-jedis.xml");
		
		System.out.println("=====>>>连接Redis服务器成功,并初始Spring容器和注册JedisPool..");
		jedisPool = (JedisPool) ctx.getBean("jedisPool");
	}
	
	//从JedisPool中获取一个Jedis实例
	public Jedis getJedis(){
		return jedisPool.getResource();
	}
	
	//释放Jedis,并未真正关闭连接,而是返回到连接池中
	public void freeJedis(Jedis jedis){
		if(null != jedis){
			jedis.close();
		}
	}
	
	
	//使用jedis操作String数据结构
	public void setString(String key ,String value){
		//从JedisPool池中获取一个Jedis实例
		Jedis jedis = getJedis();
		//使用Jedis
		jedis.set(key, value);
		//释放jedis连接,返回到连接池中
		freeJedis(jedis);
	}
	
	//从Redis服务器中获取String结构类型数据
	public String getValueStr(String key){
		//从JedisPool池中获取一个Jedis实例
		Jedis jedis = getJedis();
		//使用Jedis
		String value = jedis.get(key);
		//释放jedis连接,返回到连接池中
		freeJedis(jedis);
		
		return value;
	}
	
	/**
	 * 单元测试
	 * @param args
	 * 遇到异常:
	 * Caused by: java.lang.ClassNotFoundException:
	 *  org.springframework.expression.PropertyAccessor
	 * 解决方案:因为使用了expression即spring表达式,加入spring-expression.jar
	 * 类似异常还依赖commons-logging.jar
	 * 
	 */
	public static void main(String[] args) {
		
		JedisPoolSpring jedisPoolSpring = new JedisPoolSpring();
		//初始化Spring容器
		jedisPoolSpring.initSpringContainer();
		//这个首次运行机制后main方法后,注释掉再运行main方法查询str-key数据看看结果
		//jedisPoolSpring.setString("str-key", "baby,i love you!");//相同的key对应的value会被覆盖,跟Map特性类似
		System.out.println("从Redis中获取数据:" + jedisPoolSpring.getValueStr("str-key"));
	}
	
}

====>>>> ShardedJedisPoolSpring.java

package com.it.util;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

/**
 * ShardedJedis分布式集群(即分片模式,属性轻量级集群)
 * 
 * @author 拈花为何不一笑
 * 说明:java通过jedis客户端操作redis主要三种模式:
 * 	单机模式(JedisPool)、
 * 	分片模式(ShardedJedis)、
 * 	集群模式(BinaryJedisCluster),分片模式是一种轻量级集群
 */
public class ShardedJedisPoolSpring {

	private ShardedJedisPool shardedJedisPool;
	
	//初始化Spring容器
	public void initSpringContainer(){
		//构建Spring容器通过applicationContext-jedis.xml配置文件,联想一下Struts2的容器
		//容器的作用:提供AOP,DI即bean的注册和依赖注入等功能
		//Struts2的容器Container/ContainerImple构造函数为default只能在同类或同包下才能使用,可以看出该容器是Struts2内部专用的容器
		//Spring的容器是ApplicationContext是public构造函数,可以提供对内和对外都能使用。但是容器中的bean的访问是有限制条件的,这个条件如下:
		//通俗点说就是:new 出来的bean是不能使用Spring容器中的bean,new出来的bean是Spring容器外的bean,不归Spring容器管理。
		//即Spring bean提供被访问的前提是Spring容器中的bean相互访问,容器外的bean是不能"直接"访问容器内的bean,因为容器外的bean不是由Spring进行管理的。
		ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext-shardedJedis.xml");
		
		System.out.println("=====>>>连接Redis服务器成功,并初始Spring容器和注册shardedJedisPool..");
		shardedJedisPool = (ShardedJedisPool) ctx.getBean("shardedJedisPool");
	}
	
	//从shardedJedisPool中获取一个ShardedJedis实例
	public ShardedJedis getShardedJedis(){
		return shardedJedisPool.getResource();
	}
	
	//释放ShardedJedis,并未真正关闭连接,而是返回到连接池中
	public void freeShardedJedis(ShardedJedis shardedJedis){
		if(null != shardedJedis){
			shardedJedis.close();
		}
	}
	
	
	//使用ShardedJedis操作String数据结构
	public void setString(String key ,String value){
		//从shardedJedisPool池中获取一个ShardedJedis实例
		ShardedJedis shardedJedis = getShardedJedis();
		//使用ShardedJedis
		shardedJedis.set(key, value);
		//释放jedis连接,返回到连接池中
		freeShardedJedis(shardedJedis);
	}
	
	//从Redis服务器中获取String结构类型数据
	public String getValueStr(String key){
		//从shardedJedisPool池中获取一个ShardedJedis实例
		ShardedJedis shardedJedis = getShardedJedis();
		//使用ShardedJedis
		String value = shardedJedis.get(key);
		//释放jedis连接,返回到连接池中
		freeShardedJedis(shardedJedis);
		
		return value;
	}
	
	/**
	 * 单元测试
	 * @param args
	 * 
	 */
	public static void main(String[] args) {
		
		ShardedJedisPoolSpring sharedJedisPoolSpring = new ShardedJedisPoolSpring();
		//初始化Spring容器
		sharedJedisPoolSpring.initSpringContainer();
		//这个首次运行机制后main方法后,注释掉再运行main方法查询str-bb数据看看结果
		//sharedJedisPoolSpring.setString("str-bb", "i am sharedJedis!");
		System.out.println("从Redis中获取数据:" + sharedJedisPoolSpring.getValueStr("str-bb"));
	}
	

}

配置代码如下====
====>>>>redis.properties

#最大分配的对象数
redis.pool.maxActive=200
#最大能够保持idel状态的对象数
redis.pool.maxIdle=50
redis.pool.minIdle=10
redis.pool.maxWaitMillis=20000
#当池内没有返回对象时,最大等待时间
redis.pool.maxWait=300

#语法格式:redis://:[密码]@[服务器地址]:[端口]/[db index]
redis.uri=redis://:[email protected]:6379/0
#对比一下java连接mysql数据库使用jdbc协议,jdbc:mysql://localhost:3306/dbname
#对比一下java连接oracle数据库使用jdbc协议,jdbc:oracle:thin:@127.0.0.1:1521:orcl

redis.host=127.0.0.1
redis.port=6379
redis.timeout=30000
#这个密码是启动Redis服务器指定加载配置文件中配置的密码
#比如笔者加载这个redis.windows.conf配置文件,那么密码配置在此文件中,对应项为requirepass
redis.password=foo666k
#连接并使用Redis的数据库0,Redis数据库名称用数字表示0,1,2...
redis.database=0

====>>>> applicationContext-jedis.xml




    
    
    

	
    
    
        
        
            ${redis.pool.maxActive}
        
        
            ${redis.pool.maxIdle}
        
        
        
    

	
    
        
        
        
        
        
        
    
    

====>>>> applicationContext-shardedJedis.xml




 	
    

    
    
        
        
        
        
    

	
    
        
        
        	
            
                
                    
                
            
        
    
    

@author 拈花为何不一笑

关于与Spring集成使用注解的方式,有需要的可以联系,可以单独发源码。这里就不贴代码了。谢谢大家阅读。

你可能感兴趣的:(数据库)