Redis Java客户端Jedis

Redis技术学习 https://www.itkc8.com

目前Redis基于Java语言的Client:

Jedis是官方提供的唯一Redis Client For Java Provider。

 

[html] view plain copy  print?在CODE上查看代码片派生到我的代码片

  1. <dependency>  
  2.             <groupId>redis.clients</groupId>  
  3.             <artifactId>jedis</artifactId>  
  4.             <version>2.6.2</version>  
  5.         </dependency>  

 

一、Jedis简单使用

 

[java] view plain copy  print?在CODE上查看代码片派生到我的代码片

  1. package cn.slimsmart.redis.demo.jedis;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6. import java.util.Set;  
  7.   
  8. import redis.clients.jedis.Jedis;  
  9.   
  10. @SuppressWarnings("resource")  
  11. public class JedisTest {  
  12.     private static final String HASH_KEY = "key";  
  13.   
  14.     public static void main(String[] args) {  
  15.         Jedis jedis = new Jedis("192.168.36.189"6379);  
  16.         /** 
  17.          * 存储String key-value 
  18.          */  
  19.         jedis.set(HASH_KEY, "value");  
  20.         /** 
  21.          * 如果已经存在key了,先删除掉 
  22.          */  
  23.         if (jedis.exists(HASH_KEY)) {  
  24.             System.out.println(jedis.get(HASH_KEY));  
  25.             jedis.del(HASH_KEY);  
  26.         }  
  27.   
  28.         /** 
  29.          * 存入单个key-value 
  30.          */  
  31.         jedis.hset(HASH_KEY, "username""yourUsername");  
  32.   
  33.         /** 
  34.          * 存入多个key-value键值对 
  35.          */  
  36.         Map<String, String> keyValueMap = new HashMap<String, String>();  
  37.         keyValueMap.put("password""YourPassword");  
  38.         keyValueMap.put("age""20");  
  39.         jedis.hmset(HASH_KEY, keyValueMap);  
  40.   
  41.         /** 
  42.          * 判断某个key是否在指定的Hash key中 
  43.          */  
  44.         boolean existsUsernameKey = jedis.hexists(HASH_KEY, "username");  
  45.         // true  
  46.         System.out.println(existsUsernameKey);  
  47.   
  48.         /** 
  49.          * 获取某个hash中键值对的数量 
  50.          */  
  51.         Long len = jedis.hlen(HASH_KEY);  
  52.         // 3  
  53.         System.out.println(len);  
  54.   
  55.         /** 
  56.          * 获取一个hash中的所有key 
  57.          */  
  58.         Set<String> keys = jedis.hkeys(HASH_KEY);  
  59.         // [password, username, age]  
  60.         System.out.println(keys);  
  61.   
  62.         /** 
  63.          * 获取一个hash中的所有values 
  64.          */  
  65.         List<String> values = jedis.hvals(HASH_KEY);  
  66.         // [yourUsername, YourPassword, 20]  
  67.         System.out.println(values);  
  68.   
  69.         /** 
  70.          * 获取指定hash的所有的键值对 
  71.          */  
  72.         Map<String, String> allKVMap = jedis.hgetAll(HASH_KEY);  
  73.         // {username=yourUsername, age=20, password=YourPassword}  
  74.         System.out.println(allKVMap);  
  75.   
  76.         /** 
  77.          * 从一个hash中获取某个field的值 
  78.          */  
  79.         String value = jedis.hget(HASH_KEY, "username");  
  80.         // yourUsername  
  81.         System.out.println(value);  
  82.   
  83.         List<String> multValues = jedis.hmget(HASH_KEY, "username""password");  
  84.         // [yourUsername, YourPassword]  
  85.         System.out.println(multValues);  
  86.     }  
  87.   
  88. }  

二、连接池的使用

 

Jedis使用commons-pool完成池化实现。
1.配置文件redis.properties

 

[plain] view plain copy  print?在CODE上查看代码片派生到我的代码片

  1. redis.pool.maxTotal=10  
  2. redis.pool.minIdle=2  
  3. redis.pool.maxIdle=10  
  4. redis.pool.maxWait=1000  
  5. redis.pool.testWhileIdle=true  
  6. redis.pool.testOnBorrow=true  
  7. redis.pool.testOnReturn=true  
  8. #IP  
  9. redis.ip=192.168.36.189  
  10. #Port  
  11. redis.port=6379  

2.实例代码

 

 

[java] view plain copy  print?在CODE上查看代码片派生到我的代码片

  1. package cn.slimsmart.redis.demo.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. public class JedisPoolTest {  
  10.     public static void main(String[] args) {  
  11.         ResourceBundle bundle = ResourceBundle.getBundle("redis");  
  12.         if (bundle == null) {  
  13.             throw new IllegalArgumentException("[redis.properties] is not found!");  
  14.         }  
  15.         JedisPoolConfig config = new JedisPoolConfig();  
  16.         config.setMaxTotal(Integer.valueOf(bundle.getString("redis.pool.maxTotal")));  
  17.         config.setMinIdle(Integer.valueOf(bundle.getString("redis.pool.minIdle")));  
  18.         config.setMaxIdle(Integer.valueOf(bundle.getString("redis.pool.maxIdle")));  
  19.         config.setMaxWaitMillis(Long.valueOf(bundle.getString("redis.pool.maxWait")));  
  20.         config.setTestWhileIdle(Boolean.valueOf(bundle.getString("redis.pool.testWhileIdle")));  
  21.         config.setTestOnBorrow(Boolean.valueOf(bundle.getString("redis.pool.testOnBorrow")));  
  22.         config.setTestOnReturn(Boolean.valueOf(bundle.getString("redis.pool.testOnReturn")));  
  23.         JedisPool pool = new JedisPool(config, bundle.getString("redis.ip"), Integer.valueOf(bundle.getString("redis.port")));  
  24.   
  25.         // 从池中获取一个Jedis对象  
  26.         Jedis jedis = pool.getResource();  
  27.         String key = "key";  
  28.         // 删数据  
  29.         jedis.del(key);  
  30.         // 存数据  
  31.         jedis.set(key, "abc123");  
  32.         // 取数据  
  33.         String value = jedis.get(key);  
  34.         System.out.println(value);  
  35.         // 释放对象池  
  36.         pool.returnResource(jedis);  
  37.     }  
  38.   
  39. }  

三、一致性哈希

 

Memcached完全基于分布式集群,而Redis是Master-Slave,如果想把Reids,做成集群模式,无外乎多做几套Master-Slave,每套Master-Slave完成各自的容灾处理,通过Client工具,完成一致性哈希。Memcached是在Server端完成Sharding,Redis只能依靠各个Client做Sharding。在Redis 3.0系列支持Server端Sharding。

shared一致性哈希采用以下方案:
1.Redis服务器节点划分:将每台服务器节点采用hash算法划分为160个虚拟节点(可以配置划分权重)
2.将划分虚拟节点采用TreeMap存储
3.对每个Redis服务器的物理连接采用LinkedHashMap存储
4.对Key采用同样的hash算法,然后从TreeMap获取大于等于键hash值得节点,取最邻近节点存储;当key的hash值大于虚拟节点hash值得最大值时,存入第一个虚拟节点
sharded采用的hash算法:MD5和MurmurHash两种;默认采用64位的MurmurHash算法。

1.配置文件redis.properties

 

[plain] view plain copy  print?在CODE上查看代码片派生到我的代码片

  1. redis.pool.maxTotal=10  
  2. redis.pool.minIdle=2  
  3. redis.pool.maxIdle=10  
  4. redis.pool.maxWait=1000  
  5. redis.pool.testWhileIdle=true  
  6. redis.pool.testOnBorrow=true  
  7. redis.pool.testOnReturn=true  
  8. #IP  
  9. redis1.ip=192.168.36.189  
  10. redis2.ip=192.168.36.54  
  11. #Port  
  12. redis.port=6379  

2.实例代码

 

 

[java] view plain copy  print?在CODE上查看代码片派生到我的代码片

  1. package cn.slimsmart.redis.demo.jedis;  
  2.   
  3. import java.util.LinkedList;  
  4. import java.util.List;  
  5. import java.util.ResourceBundle;  
  6.   
  7. import redis.clients.jedis.JedisPoolConfig;  
  8. import redis.clients.jedis.JedisShardInfo;  
  9. import redis.clients.jedis.ShardedJedis;  
  10. import redis.clients.jedis.ShardedJedisPool;  
  11.   
  12. public class JedisShardInfoTest {  
  13.   
  14.     public static void main(String[] args) {  
  15.         ResourceBundle bundle = ResourceBundle.getBundle("redis");  
  16.         if (bundle == null) {  
  17.             throw new IllegalArgumentException("[redis.properties] is not found!");  
  18.         }  
  19.         JedisPoolConfig config = new JedisPoolConfig();  
  20.         config.setMaxTotal(Integer.valueOf(bundle.getString("redis.pool.maxTotal")));  
  21.         config.setMinIdle(Integer.valueOf(bundle.getString("redis.pool.minIdle")));  
  22.         config.setMaxIdle(Integer.valueOf(bundle.getString("redis.pool.maxIdle")));  
  23.         config.setMaxWaitMillis(Long.valueOf(bundle.getString("redis.pool.maxWait")));  
  24.         config.setTestWhileIdle(Boolean.valueOf(bundle.getString("redis.pool.testWhileIdle")));  
  25.         config.setTestOnBorrow(Boolean.valueOf(bundle.getString("redis.pool.testOnBorrow")));  
  26.         config.setTestOnReturn(Boolean.valueOf(bundle.getString("redis.pool.testOnReturn")));  
  27.   
  28.         JedisShardInfo jedisShardInfo1 = new JedisShardInfo(bundle.getString("redis1.ip"), Integer.valueOf(bundle.getString("redis.port")));  
  29.         JedisShardInfo jedisShardInfo2 = new JedisShardInfo(bundle.getString("redis2.ip"), Integer.valueOf(bundle.getString("redis.port")));  
  30.         List<JedisShardInfo> list = new LinkedList<JedisShardInfo>();  
  31.         list.add(jedisShardInfo1);  
  32.         list.add(jedisShardInfo2);  
  33.         // 初始化ShardedJedisPool代替JedisPool  
  34.         ShardedJedisPool pool = new ShardedJedisPool(config, list);    
  35.         // 从池中获取一个Jedis对象  
  36.         ShardedJedis jedis = pool.getResource();  
  37.         String keys = "key";  
  38.         String value = "abc123";  
  39.         // 删数据  
  40.         jedis.del(keys);  
  41.         // 存数据  
  42.         jedis.set(keys, value);  
  43.         // 取数据  
  44.         String v = jedis.get(keys);  
  45.         System.out.println(v);  
  46.         // 释放对象池  
  47.         pool.returnResource(jedis);  
  48.     }  
  49. }  

通过以上方式,向redis进行set操作的key-value,会通过hash而均匀的分配到pool里的redis机器中。

四、spring集成

 

如果有必要,可以用Spring封装初始化。

 

[html] view plain copy  print?在CODE上查看代码片派生到我的代码片

  1. <context:property-placeholder location="classpath:redis.properties" />  
  2. <bean  
  3.     id="jedisPoolConfig"  
  4.     class="redis.clients.jedis.JedisPoolConfig">  
  5.     <property  
  6.         name="maxTotal"  
  7.         value="${redis.pool.maxTotal}" />  
  8.     <property  
  9.         name="minIdle"  
  10.         value="${redis.pool.minIdle}" />   
  11.     <property  
  12.         name="maxIdle"  
  13.         value="${redis.pool.maxIdle}" />  
  14.     <property  
  15.         name="maxWait"  
  16.         value="${redis.pool.maxWait}" />  
  17.     <property  
  18.         name="testWhileIdle"  
  19.         value="${redis.pool.testWhileIdle}" />  
  20.     <property  
  21.         name="testOnBorrow"  
  22.         value="${redis.pool.testOnBorrow}" />  
  23.     <property  
  24.         name="testOnReturn"  
  25.         value="${redis.pool.testOnReturn}" />  
  26. </bean>  
  27. <bean  
  28.     id="shardedJedisPool"  
  29.     class="redis.clients.jedis.ShardedJedisPool">  
  30.     <constructor-arg  
  31.         index="0"  
  32.         ref="jedisPoolConfig" />  
  33.     <constructor-arg index="1">  
  34.         <list>  
  35.             <bean class="redis.clients.jedis.JedisShardInfo">  
  36.                 <constructor-arg  
  37.                     index="0"  
  38.                     value="${redis1.ip}" />  
  39.                 <constructor-arg  
  40.                     index="1"  
  41.                     value="${redis.port}"  
  42.                     type="int" />  
  43.             </bean>  
  44.             <bean class="redis.clients.jedis.JedisShardInfo">  
  45.                 <constructor-arg  
  46.                     index="0"  
  47.                     value="${redis2.ip}" />  
  48.                 <constructor-arg  
  49.                     index="1"  
  50.                     value="${redis.port}"  
  51.                     type="int" />  
  52.             </bean>  
  53.         </list>  
  54.     </constructor-arg>  
  55. </bean>  

当然,Spring提供了对于Redis的专门支持:spring-data-redis

Redis技术学习 https://www.itkc8.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值