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

1 Jedis简介

Jedis是Redis的java客户端。我们可以在java编程中使用它来编写java代码访问Redis服务。

要使用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>  



也可以通过下面路径来下载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. }  



3 Jedis的池使用

我们在实现jedis池使用的时候除了要将jedis包引入工程外,还需要将apache的commons-pool-xx包也引入工程,因为JedisPool实际是应用apache的GenericObjectPool来作为redis连接经管pool的。

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  



代码实现如下:

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. }  



执行结果如下:

Java代码
  1. xmong   
  2. 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  



修改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. }  



执行结果为:

Java代码
  1. xmong_aaa   
  2. 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. }  



执行结果:

Java代码
  1. xmong_aaa   
  2. null  


修改redis服务器

Java代码
  1. static String host = "172.30.5.117";  



执行结果:

Java代码
  1. null  
  2. xmong_zzz  



分别从不同的redis服务器查取的结果可以看到,Jedis实现了Redis的分布存储,ShardedJedis将key为aaa的值存储到了ip为113的redis服务器上,把key为zzz的值存储到了ip为117的服务器上。