代码实现Jedis池的使用和Jedis分布式


目录
1 JEDIS简介 1
2 JEDIS简单使用 1
3 JEDIS的池使用 2
4 JEDIS的分布式 4

1 Jedis简介

Jedis是Redis的java客户端。我们可以在java编程中使用它来编写java代码访问Redis服务。
关于Redis简绍: http://xmong.iteye.com/blog/1840242

要使用Jedis可以通过maven来获取
Java代码 复制代码  收藏代码
  1. <dependency>   
  2.     <groupId>redis.clients</groupId>   
  3.     <artifactId>jedis</artifactId>   
  4.     <version>2.1.0</version>   
  5.     <type>jar</type>   
  6.     <scope>compile</scope>   
  7. </dependency>  
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.1.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>


也可以通过下面路径来下载Jedis包,将包加到java工程里面就可以了。
https://github.com/xetorthio/jedis/downloads
当前使用的包名:jedis-2.1.0.jar

2 Jedis简单使用

Jedis的简单使用代码如下:
Java代码 复制代码  收藏代码
  1. package com.jedis;   
  2.   
  3. import redis.clients.jedis.Jedis;   
  4.   
  5. /**  
  6.  * 简单使用jedis  
  7.  * @author xmong  
  8.  *  
  9.  */  
  10. public class TestJedis {   
  11.   
  12.     //redis服务器主机   
  13.     static String host = "172.30.5.117";   
  14.     //端口号   
  15.     static int port = 6379;    
  16.        
  17.     public static void main(String[] args) {   
  18.         //根据redis主机和端口号实例化Jedis对象   
  19.         Jedis jedis = new Jedis(host, port);   
  20.         //添加key-value对象,如果key对象存在就覆盖该对象   
  21.         jedis.set("name""xmong");   
  22.         //查取key的value值,如果key不存在返回null   
  23.         String value = jedis.get("name");   
  24.         System.out.println(value);   
  25.         //删除key-value对象,如果key不存在则忽略此操作   
  26.         jedis.del("name");   
  27.         //判断key是否存在,不存在返回false存在返回true   
  28.         jedis.exists("name");   
  29.     }   
  30.        
  31. }  
package com.jedis;

import redis.clients.jedis.Jedis;

/**
 * 简单使用jedis
 * @author xmong
 *
 */
public class TestJedis {

	//redis服务器主机
	static String host = "172.30.5.117";
	//端口号
	static int port = 6379;	
	
	public static void main(String[] args) {
		//根据redis主机和端口号实例化Jedis对象
		Jedis jedis = new Jedis(host, port);
		//添加key-value对象,如果key对象存在就覆盖该对象
		jedis.set("name", "xmong");
		//查取key的value值,如果key不存在返回null
		String value = jedis.get("name");
		System.out.println(value);
		//删除key-value对象,如果key不存在则忽略此操作
		jedis.del("name");
		//判断key是否存在,不存在返回false存在返回true
		jedis.exists("name");
	}
	
}


3 Jedis的池使用

我们在实现jedis池使用的时候除了要将jedis包引入工程外,还需要将apache的commons-pool-xx包也引入工程,因为JedisPool实际是应用apache的GenericObjectPool来作为redis连接经管pool的,这点可以从分析Jedis的源码知道。

Commons-pool-1.6.jar包下载:
http://commons.apache.org/proper/commons-pool/download_pool.cgi

Redis配置文件(redis.properties)如下:

Java代码 复制代码  收藏代码
  1. ###redis##config########   
  2. #redis服务器ip #    
  3. redis.ip=172.30.5.117  
  4. #redis服务器端口号#   
  5. redis.port=6379  
  6.   
  7. ###jedis##pool##config###   
  8. #jedis的最大分配对象#   
  9. jedis.pool.maxActive=1024  
  10. #jedis最大保存idel状态对象数 #   
  11. jedis.pool.maxIdle=200  
  12. #jedis池没有对象返回时,最大等待时间 #   
  13. jedis.pool.maxWait=1000  
  14. #jedis调用borrowObject方法时,是否进行有效检查#   
  15. jedis.pool.testOnBorrow=true  
  16. #jedis调用returnObject方法时,是否进行有效检查 #   
  17. jedis.pool.testOnReturn=true  
###redis##config########
#redis服务器ip # 
redis.ip=172.30.5.117
#redis服务器端口号#
redis.port=6379

###jedis##pool##config###
#jedis的最大分配对象#
jedis.pool.maxActive=1024
#jedis最大保存idel状态对象数 #
jedis.pool.maxIdle=200
#jedis池没有对象返回时,最大等待时间 #
jedis.pool.maxWait=1000
#jedis调用borrowObject方法时,是否进行有效检查#
jedis.pool.testOnBorrow=true
#jedis调用returnObject方法时,是否进行有效检查 #
jedis.pool.testOnReturn=true


代码实现如下:
Java代码
  1. package com.jedis;   
  2.   
  3. import java.util.ResourceBundle;   
  4.   
  5. import redis.clients.jedis.Jedis;   
  6. import redis.clients.jedis.JedisPool;   
  7. import redis.clients.jedis.JedisPoolConfig;   
  8.   
  9. /**  
  10.  * jedis池使用  
  11.  * @author xmong  
  12.  *  
  13.  */  
  14. public class MyJedisPool {   
  15.        
  16.     //jedis池   
  17.     private static JedisPool pool;     
  18.     //静态代码初始化池配置   
  19.     static {    
  20.         //加载redis配置文件   
  21.         ResourceBundle bundle = ResourceBundle.getBundle("redis");     
  22.         if (bundle == null) {     
  23.             throw new IllegalArgumentException("[redis.properties] is not found!");     
  24.         }    
  25.         //创建jedis池配置实例   
  26.         JedisPoolConfig config = new JedisPoolConfig();    
  27.         //设置池配置项值   
  28.         config.setMaxActive(Integer.valueOf(bundle.getString("redis.pool.maxActive")));     
  29.         config.setMaxIdle(Integer.valueOf(bundle.getString("redis.pool.maxIdle")));     
  30.         config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait")));     
  31.         config.setTestOnBorrow(Boolean.valueOf(bundle.getString("redis.pool.testOnBorrow")));     
  32.         config.setTestOnReturn(Boolean.valueOf(bundle.getString("redis.pool.testOnReturn")));     
  33.         //根据配置实例化jedis池   
  34.         pool = new JedisPool(config, bundle.getString("redis.ip"),    
  35.                 Integer.valueOf(bundle.getString("redis.port")));   
  36.     }   
  37.        
  38.     /**  
  39.      * 测试jedis池方法  
  40.      */  
  41.     public static void test1(){   
  42.         //从jedis池中获取一个jedis实例   
  43.         Jedis jedis = pool.getResource();   
  44.                    
  45.         //获取jedis实例后可以对redis服务进行一系列的操作   
  46.         jedis.set("name""xmong");   
  47.         System.out.println(jedis.get("name"));   
  48.         jedis.del("name");   
  49.         System.out.println(jedis.exists("name"));   
  50.            
  51.         //释放对象池,即获取jedis实例使用后要将对象还回去   
  52.         pool.returnResource(jedis);        
  53.     }   
  54.   
  55.     public static void main(String[] args) {   
  56.         test1();//执行test1方法   
  57.     }   
  58.   
  59.        
  60. }  
package com.jedis;

import java.util.ResourceBundle;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * jedis池使用
 * @author xmong
 *
 */
public class MyJedisPool {
	
	//jedis池
	private static JedisPool pool;  
	//静态代码初始化池配置
	static { 
		//加载redis配置文件
	    ResourceBundle bundle = ResourceBundle.getBundle("redis");  
	    if (bundle == null) {  
	        throw new IllegalArgumentException("[redis.properties] is not found!");  
	    } 
	    //创建jedis池配置实例
	    JedisPoolConfig config = new JedisPoolConfig(); 
	    //设置池配置项值
	    config.setMaxActive(Integer.valueOf(bundle.getString("redis.pool.maxActive")));  
	    config.setMaxIdle(Integer.valueOf(bundle.getString("redis.pool.maxIdle")));  
	    config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait")));  
	    config.setTestOnBorrow(Boolean.valueOf(bundle.getString("redis.pool.testOnBorrow")));  
	    config.setTestOnReturn(Boolean.valueOf(bundle.getString("redis.pool.testOnReturn")));  
	    //根据配置实例化jedis池
	    pool = new JedisPool(config, bundle.getString("redis.ip"), 
	    		Integer.valueOf(bundle.getString("redis.port")));
	}
	
	/**
	 * 测试jedis池方法
	 */
	public static void test1(){
		//从jedis池中获取一个jedis实例
		Jedis jedis = pool.getResource();
				
		//获取jedis实例后可以对redis服务进行一系列的操作
		jedis.set("name", "xmong");
		System.out.println(jedis.get("name"));
		jedis.del("name");
		System.out.println(jedis.exists("name"));
		
		//释放对象池,即获取jedis实例使用后要将对象还回去
		pool.returnResource(jedis);		
	}

	public static void main(String[] args) {
		test1();//执行test1方法
	}

	
}


执行结果如下:
Java代码
  1. xmong   
  2. false  
xmong
false


4 Jedis的分布式

Redis在容灾处理方面可以通过服务器端配置Master-Slave模式来实现。而在分布式集群方面目前只能通过客户端工具来实现一致性哈希分布存储,即key分片存储。Redis可能会在3.0版本支持服务器端的分布存储。
下面看看Jedis是怎样实现Redis分布存储的。
在上面的列子中我们只需要修改部分代码即可实现Redis的分布存储功能。
修改Redis配置文件中reidis服务器配置选项:
Java代码
  1. ###redis##config########   
  2. #redis1服务器ip #    
  3. Redis1.ip=172.30.5.113  
  4. #redis2服务器ip #    
  5. Redis2.ip=172.30.5.117  
  6. #redis服务器端口号#   
  7. redis.port=6379  
###redis##config########
#redis1服务器ip # 
Redis1.ip=172.30.5.113
#redis2服务器ip # 
Redis2.ip=172.30.5.117
#redis服务器端口号#
redis.port=6379


修改MyJedisPool实现如下:
Java代码
  1. package com.jedis;   
  2.   
  3. import java.util.LinkedList;   
  4. import java.util.List;   
  5. import java.util.ResourceBundle;   
  6.   
  7. import redis.clients.jedis.Jedis;   
  8. import redis.clients.jedis.JedisPool;   
  9. import redis.clients.jedis.JedisPoolConfig;   
  10. import redis.clients.jedis.JedisShardInfo;   
  11. import redis.clients.jedis.ShardedJedis;   
  12. import redis.clients.jedis.ShardedJedisPool;   
  13.   
  14. /**  
  15.  * jedis池使用  
  16.  * @author xmong  
  17.  *  
  18.  */  
  19. public class MyJedisPool {   
  20.        
  21.     //jedis池   
  22.     private static JedisPool pool;    
  23.     //shardedJedis池   
  24.     private static ShardedJedisPool shardPool;   
  25.     //静态代码初始化池配置   
  26.     static {    
  27.         //加载redis配置文件   
  28.         ResourceBundle bundle = ResourceBundle.getBundle("redis");     
  29.         if (bundle == null) {     
  30.             throw new IllegalArgumentException("[redis.properties] is not found!");     
  31.         }    
  32.         //创建jedis池配置实例   
  33.         JedisPoolConfig config = new JedisPoolConfig();    
  34.         //设置池配置项值   
  35.         config.setMaxActive(Integer.valueOf(bundle.getString("redis.pool.maxActive")));     
  36.         config.setMaxIdle(Integer.valueOf(bundle.getString("redis.pool.maxIdle")));     
  37.         config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait")));     
  38.         config.setTestOnBorrow(Boolean.valueOf(bundle.getString("redis.pool.testOnBorrow")));     
  39.         config.setTestOnReturn(Boolean.valueOf(bundle.getString("redis.pool.testOnReturn")));     
  40.            
  41.         //根据配置实例化jedis池   
  42. //      pool = new JedisPool(config, bundle.getString("redis.ip"),    
  43. //              Integer.valueOf(bundle.getString("redis.port")));   
  44.            
  45.         //创建多个redis共享服务   
  46.         JedisShardInfo jedisShardInfo1 = new JedisShardInfo(     
  47.                 bundle.getString("redis1.ip"), Integer.valueOf(bundle.getString("redis.port")));     
  48.         JedisShardInfo jedisShardInfo2 = new JedisShardInfo(     
  49.                 bundle.getString("redis2.ip"), Integer.valueOf(bundle.getString("redis.port")));     
  50.      
  51.         List<JedisShardInfo> list = new LinkedList<JedisShardInfo>();     
  52.         list.add(jedisShardInfo1);     
  53.         list.add(jedisShardInfo2);   
  54.            
  55.         //根据配置文件,创建shared池实例   
  56.         shardPool = new ShardedJedisPool(config, list);   
  57.            
  58.     }   
  59.        
  60.     /**  
  61.      * 测试jedis池方法  
  62.      */  
  63.     public static void test1(){   
  64.         //从jedis池中获取一个jedis实例   
  65.         Jedis jedis = pool.getResource();   
  66.                    
  67.         //获取jedis实例后可以对redis服务进行一系列的操作   
  68.         jedis.set("name""xmong");   
  69.         System.out.println(jedis.get("name"));   
  70.         jedis.del("name");   
  71.         System.out.println(jedis.exists("name"));   
  72.            
  73.         //释放对象池,即获取jedis实例使用后要将对象还回去   
  74.         pool.returnResource(jedis);        
  75.     }   
  76.        
  77.     /**  
  78.      * 测试shardedJedis池方法  
  79.      */  
  80.     public static void test2(){   
  81.         //从shard池中获取shardJedis实例   
  82.         ShardedJedis shardJedis = shardPool.getResource();   
  83.            
  84.         //向redis服务插入两个key-value对象   
  85.         shardJedis.set("aaa""xmong_aaa");   
  86.         System.out.println(shardJedis.get("aaa"));   
  87.         shardJedis.set("zzz""xmong_zzz");   
  88.         System.out.println(shardJedis.get("zzz"));   
  89.            
  90.         //释放资源   
  91.         shardPool.returnResource(shardJedis);   
  92.     }   
  93.        
  94.     public static void main(String[] args) {   
  95.         //test1();//执行test1方法   
  96.         test2();//执行test2方法   
  97.     }   
  98.        
  99. }  
package com.jedis;

import java.util.LinkedList;
import java.util.List;
import java.util.ResourceBundle;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

/**
 * jedis池使用
 * @author xmong
 *
 */
public class MyJedisPool {
	
	//jedis池
	private static JedisPool pool; 
	//shardedJedis池
	private static ShardedJedisPool shardPool;
	//静态代码初始化池配置
	static { 
		//加载redis配置文件
	    ResourceBundle bundle = ResourceBundle.getBundle("redis");  
	    if (bundle == null) {  
	        throw new IllegalArgumentException("[redis.properties] is not found!");  
	    } 
	    //创建jedis池配置实例
	    JedisPoolConfig config = new JedisPoolConfig(); 
	    //设置池配置项值
	    config.setMaxActive(Integer.valueOf(bundle.getString("redis.pool.maxActive")));  
	    config.setMaxIdle(Integer.valueOf(bundle.getString("redis.pool.maxIdle")));  
	    config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait")));  
	    config.setTestOnBorrow(Boolean.valueOf(bundle.getString("redis.pool.testOnBorrow")));  
	    config.setTestOnReturn(Boolean.valueOf(bundle.getString("redis.pool.testOnReturn")));  
	    
	    //根据配置实例化jedis池
//	    pool = new JedisPool(config, bundle.getString("redis.ip"), 
//	    		Integer.valueOf(bundle.getString("redis.port")));
	    
	    //创建多个redis共享服务
	    JedisShardInfo jedisShardInfo1 = new JedisShardInfo(  
                bundle.getString("redis1.ip"), Integer.valueOf(bundle.getString("redis.port")));  
	    JedisShardInfo jedisShardInfo2 = new JedisShardInfo(  
                bundle.getString("redis2.ip"), Integer.valueOf(bundle.getString("redis.port")));  
  
	    List<JedisShardInfo> list = new LinkedList<JedisShardInfo>();  
	    list.add(jedisShardInfo1);  
	    list.add(jedisShardInfo2);
	    
	    //根据配置文件,创建shared池实例
	    shardPool = new ShardedJedisPool(config, list);
	    
	}
	
	/**
	 * 测试jedis池方法
	 */
	public static void test1(){
		//从jedis池中获取一个jedis实例
		Jedis jedis = pool.getResource();
				
		//获取jedis实例后可以对redis服务进行一系列的操作
		jedis.set("name", "xmong");
		System.out.println(jedis.get("name"));
		jedis.del("name");
		System.out.println(jedis.exists("name"));
		
		//释放对象池,即获取jedis实例使用后要将对象还回去
		pool.returnResource(jedis);		
	}
	
	/**
	 * 测试shardedJedis池方法
	 */
	public static void test2(){
		//从shard池中获取shardJedis实例
		ShardedJedis shardJedis = shardPool.getResource();
		
		//向redis服务插入两个key-value对象
		shardJedis.set("aaa", "xmong_aaa");
		System.out.println(shardJedis.get("aaa"));
		shardJedis.set("zzz", "xmong_zzz");
		System.out.println(shardJedis.get("zzz"));
		
		//释放资源
		shardPool.returnResource(shardJedis);
	}
	
	public static void main(String[] args) {
		//test1();//执行test1方法
		test2();//执行test2方法
	}
	
}


执行结果为:
Java代码
  1. xmong_aaa   
  2. xmong_zzz  
xmong_aaa
xmong_zzz


可以通过下面程序访问不同的redis服务来测试结果:
Java代码
  1. package com.jedis;   
  2.   
  3. import redis.clients.jedis.Jedis;   
  4.   
  5. /**  
  6.  * 简单使用jedis  
  7.  * @author xmong  
  8.  *  
  9.  */  
  10. public class TestJedis {   
  11.   
  12.     //redis服务器主机   
  13.     static String host = "172.30.5.113";   
  14.     //端口号   
  15.     static int port = 6379;   
  16.        
  17.     public static void main(String[] args) {   
  18.         //根据redis主机和端口号实例化Jedis对象   
  19.         Jedis jedis = new Jedis(host, port);   
  20.         //查取key的value值,如果key不存在返回null   
  21.         String value1 = jedis.get("aaa");   
  22.         System.out.println(value);   
  23.         String value1 = jedis.get("zzz");   
  24.         System.out.println(value);   
  25.   
  26.     }   
  27.        
  28. }  
package com.jedis;

import redis.clients.jedis.Jedis;

/**
 * 简单使用jedis
 * @author xmong
 *
 */
public class TestJedis {

	//redis服务器主机
	static String host = "172.30.5.113";
	//端口号
	static int port = 6379;
	
	public static void main(String[] args) {
		//根据redis主机和端口号实例化Jedis对象
		Jedis jedis = new Jedis(host, port);
		//查取key的value值,如果key不存在返回null
		String value1 = jedis.get("aaa");
		System.out.println(value);
		String value1 = jedis.get("zzz");
		System.out.println(value);

	}
	
}


执行结果:
Java代码
  1. xmong_aaa   
  2. null  
xmong_aaa
null

修改redis服务器
Java代码
  1. static String host = "172.30.5.117";  
static String host = "172.30.5.117";


执行结果:
Java代码
  1. null  
  2. xmong_zzz  
null
xmong_zzz


从测试结果可以知道,ShardedJedis实现了Redis的分布存储,分别从不同的redis服务器查取结果可以得知,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值