Redis(二):Java中使用

一、Redis 数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

String(字符串)

string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

string类型是Redis最基本的数据类型,一个键最大能存储512MB。

实例

redis 127.0.0.1:6379> SET name "runoob" OK redis 127.0.0.1:6379> GET name "runoob"

在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为 runoob

注意:一个键最大能存储512MB。

Hash(哈希)

Redis hash 是一个键名对集合。

Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

实例

127.0.0.1:6379> HMSET user:1 username runoob password runoob points 200 OK 127.0.0.1:6379> HGETALL user:1 1) "username" 2) "runoob" 3) "password" 4) "runoob" 5) "points" 6) "200"

以上实例中 hash 数据类型存储了包含用户脚本信息的用户对象。 实例中我们使用了 Redis HMSET, HGETALL 命令,user:1为键值。

每个 hash 可以存储 2 32  -1 键值对(40多亿)。


List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

实例

redis 127.0.0.1:6379> lpush runoob redis (integer) 1 redis 127.0.0.1:6379> lpush runoob mongodb (integer) 2 redis 127.0.0.1:6379> lpush runoob rabitmq (integer) 3 redis 127.0.0.1:6379> lrange runoob 0 10 1) "rabitmq" 2) "mongodb" 3) "redis" redis 127.0.0.1:6379>

列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。


Set(集合)

Redis的Set是string类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

sadd 命令

添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误。

sadd key member

实例

redis 127.0.0.1:6379> sadd runoob redis (integer) 1 redis 127.0.0.1:6379> sadd runoob mongodb (integer) 1 redis 127.0.0.1:6379> sadd runoob rabitmq (integer) 1 redis 127.0.0.1:6379> sadd runoob rabitmq (integer) 0 redis 127.0.0.1:6379> smembers runoob 1) "rabitmq" 2) "mongodb" 3) "redis"

注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。

集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。


zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

zadd 命令

添加元素到集合,元素在集合中存在则更新对应score

zadd key score member

实例

redis 127.0.0.1:6379> zadd runoob 0 redis (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 mongodb(integer) 1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq (integer) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000 1) "redis" 2) "mongodb" 3) "rabitmq"

二、Java 使用 Redis

在我们的普通javaweb中使用redis非常简单
1.加入所需的jar包
//用于连接redis的数据库连接池
 //java的redis jar包
2.在配置文件中加入(appcationContext.xml)
[html]  view plain  copy
  1. <!--导入redis.xml-->  
  2. <import resource="classpath:config/spring/Jedis.xml" />  


Jedis.xml:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"  
  4.     xmlns:amq="http://activemq.apache.org/schema/core" xmlns:jms="http://www.springframework.org/schema/jms"  
  5.     xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"  
  6.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  7.     xsi:schemaLocation="  
  8.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  9.         http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd  
  10.         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd  
  11.         http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd  
  12.         http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-2.5.xsd">  
  13.   
  14.     <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">    
  15.         <property name="maxActive"  value="50" />    
  16.         <property name="maxIdle" value="10" />    
  17.         <property name="maxWait" value="1000" />    
  18.         <property name="testOnBorrow"  value="true"/>    
  19.     </bean>   
  20.       
  21.     <bean id="shardInfo" class="redis.clients.jedis.JedisShardInfo">    
  22.         <constructor-arg index="0" value="${redis.address}" />    
  23.         <constructor-arg index="1" value="${redis.port}" type="int"/>    
  24.     </bean>    
  25.     
  26.     <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">    
  27.         <constructor-arg index="0" ref="jedisPoolConfig" />    
  28.         <constructor-arg index="1">    
  29.             <list>    
  30.                 <ref bean="shardInfo" />    
  31.             </list>    
  32.         </constructor-arg>    
  33.     </bean>    
  34.     <bean id="redisUtil" class="framelib.redis.impl.RedisUtilImpl">  
  35.         <property name="shardedJedisPool" ref="shardedJedisPool"></property>  
  36.         <property name="shardedJedisPoolMap">  
  37.                <map>  
  38.                   <!-- 以后扩展redis服务,一次往后累加 -->  
  39.                   <entry key="1">  
  40.                     <ref bean="shardedJedisPool" />  
  41.                   </entry>  
  42.                </map>  
  43.           </property>  
  44.     </bean>    
  45. </beans>  

java里面我这里封装了一下,目录结构如下:



IRedisCacheConfirm.java
[java]  view plain  copy
  1. package framelib.redis;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5. /** 
  6.  * redis cache数据取得确保器 
  7.  *      该接口用于取得缓存数据时用,如果缓存中没有对应的数据, 
  8.  * @author kong.fanqing 
  9.  * 
  10.  */  
  11. public interface IRedisCacheConfirmer {  
  12.   
  13.     /** 
  14.      * 取得redis key 
  15.      * @return 
  16.      */  
  17.     public String getRedisKey();  
  18.     /** 
  19.      * 当缓存中没有数据时调用 
  20.      * @return 
  21.      */  
  22.     public Object getObject();  
  23.     /** 
  24.      * 取得缓存数据 
  25.      * @return 
  26.      */  
  27.     public Object getCacheObject(HttpServletRequest request);  
  28. }  

接口IRedisUtil:
[java]  view plain  copy
  1. package framelib.redis;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6. import java.util.Set;  
  7. /** 
  8.  * 操作redis接口 
  9.  * @author kong.fanqing 
  10.  * 
  11.  */  
  12. public interface IRedisUtil {  
  13.       
  14.   
  15.     /**存对象**/  
  16.     public String setObject(String key, Object obj);  
  17.     public String setObject(String key, Serializable value);  
  18.     public String setObject(String key, List<? extends Serializable> value);  
  19.     public String setObject(String key,Map<?, ?extends Serializable> value);  
  20.     public String setObject(String key,Set<?extends Serializable> value);  
  21.     /**取对象**/  
  22.     public Object getObject(String key);  
  23.     /**List集合**/  
  24.     public Object lindex(String key,int index);  
  25.     public Long llen(String key);  
  26.     public Object lpop(String key);  
  27.     public Object lrpop(String key);  
  28.     public Long lpush(String key,Serializable value);  
  29.     public void lpush(String key,List<? extends Serializable> value);  
  30.     public Long rpush(String key,Serializable value);  
  31.     public void rpush(String key,List<? extends Serializable> value);  
  32.     public Long lpushx(String key,Serializable value);  
  33.     public void lpushx(String key,List<? extends Serializable> value);  
  34.     public Long rpushx(String key,Serializable value);  
  35.     public void rpushx(String key,List<? extends Serializable> value);  
  36.     public List lrange(String key,int start,int end);  
  37.     public Long lrem(String key,int count,Serializable value);  
  38.     public String lset(String key,int index,Serializable value);  
  39.     public String ltrim(String key,int start,int end);  
  40.     /*忽略*/  
  41.     public String rpoplpush(String srcKey,String detKey);  
  42.     /**Set集合**/  
  43.     public Long sadd(String key,Serializable value);  
  44.     public void sadd(String key,Set<?extends Serializable> values);  
  45.     public Long scard(String key);  
  46.     public boolean sismember(String key,Serializable value);  
  47.     public Set<? extends Serializable> smembers(String key);  
  48.     public Object spop(String key);  
  49.     public Object srandmember(String key);  
  50.     public Long srem(String key,Serializable value);  
  51.     /*******Sorted set************/  
  52.     public Long zadd(String key,double score,Serializable value);  
  53.     public Long zcard(String key);  
  54.     public Long zcount(String key,double min,double max);  
  55.     public double zincrby(String key,double incrementscore,Serializable value);  
  56.     public Set<? extends Serializable> zrange(String key,int start,int end);  
  57.     public Set<? extends Serializable> zrangeByScore(String key,double min,double max);  
  58.     public Set<? extends Serializable> zrangeByScore(String key,double min,double max, int offset, int count);  
  59.     public Long zrem(String key,Serializable value);  
  60.     public Long zremrangeByRank(String key,int start ,int end);  
  61.     public Long zremrangeByScore(String key,double start,double end);  
  62.     public Set<? extends Serializable> zrevrange(String key,int start,int end);  
  63.     public Long zrank(String key,Serializable value);  
  64.     public Long zrevrank(String key,Serializable value);  
  65.     public double zscore(String key,Serializable value);  
  66.     /**********hash 表***********/  
  67.     public Long hset(String key,String field,Serializable value);  
  68.     //public void hset(String key,Map<String, ?extends Serializable> value);  
  69.     public boolean hexists(String key,String field);  
  70.     public Long hsetnx(String key,String field,Serializable value);  
  71.     public String hmset(String key,Map<String, ? extends Serializable> values);  
  72.     public Object hget(String key,String field);  
  73.     public List hmget(String key,List<String> fields);  
  74.     public Map<String,? extends Serializable> hgetAll(String key);  
  75.     public Long hdel(String key,String field);  
  76.     public Long hlen(String key);  
  77.     public Set<String> hkeys(String key);  
  78.     public List hvals(String key);  
  79.     /********************String***************************/  
  80.     public String set(String key,String value);  
  81.     public Long setnx(String key,String value);  
  82.     public String setex(String key,int seconds,String value);  
  83.     public Long append(String key,String value);  
  84.     public String get(String key);  
  85.     public String getSet(String key,String value);  
  86.     //public Long strlen(String key);  
  87.     public Long decr(String key);  
  88.     public Long decrBy(String key,long integer);  
  89.     public Long incr(String key);  
  90.     public Long incrBy(String key,long integer);  
  91.     /********************通用**************************/  
  92.     //public Pipeline pipeline(String key);  
  93.     public Long ttl(String key);  
  94.     //public Long move(String key,int dbindex);  
  95.     public String type(String key);  
  96.     public Long expire(String key,int seconds);  
  97.     public Long expireAt(String key,long timestamp);  
  98.     //public Long persist(String key);  
  99.     //public Map<String, Object> mget(List<String> keys);  
  100.     public boolean exists(String key);  
  101.     public Long del(String key);  
  102.     //public Long del(List<String> keys);  
  103.     public Set<String> keys(Integer idKey,String pattern);  
  104.     //public String flushAll();  
  105.     //public long delKeys(String pattern);  
  106. }  

RedisFactory.java
[java]  view plain  copy
  1. package framelib.redis;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5. import framelib.utils.SpringUtil;  
  6.   
  7. /** 
  8.  *  
  9.  * @author kong.fanqing 
  10.  * 
  11.  */  
  12. public class RedisFactory {  
  13.       
  14.     /** 
  15.      * 返回redisService,如果redis没有启用,则返回null 
  16.      * @return 
  17.      */  
  18.     public static IRedisUtil getIRedisService(HttpServletRequest request){  
  19.         return (IRedisUtil)SpringUtil.getWebApplicationContext(request.getSession().getServletContext()).getBean("redisUtil");  
  20.     }  
  21.       
  22. }  
RedisCacheAstractConfirmer.java
[java]  view plain  copy
  1. package framelib.redis.impl;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5. import framelib.redis.IRedisCacheConfirmer;  
  6. import framelib.redis.IRedisUtil;  
  7. import framelib.redis.RedisFactory;  
  8.   
  9.   
  10. /** 
  11.  * 缓存确保类---模板类 
  12.  * @author kong.fanqing 
  13.  * 
  14.  */  
  15. public abstract class RedisCacheAbstractConfirmer implements IRedisCacheConfirmer {  
  16.   
  17.     public Object getCacheObject(HttpServletRequest request) {  
  18.         IRedisUtil redisService = RedisFactory.getIRedisService(request);  
  19.         Object obj = null;  
  20.         if(redisService == null) {  
  21.             //不启用缓存,则直接调用getObject的返回对象  
  22.             obj = this.getObject();  
  23.         } else {  
  24.             //取得缓存key  
  25.             String redisKey = this.getRedisKey();             
  26.             //从缓存中取得对象  
  27.             obj = redisService.getObject(redisKey);  
  28.             //如果没有取得对象  
  29.             if(obj == null) {  
  30.                 //调用getObject的返回对象  
  31.                 obj = this.getObject();  
  32.                 if(obj != null) {  
  33.                     //将对象返回缓存中  
  34.                     redisService.setObject(redisKey, obj);  
  35.                 }  
  36.             }  
  37.         }  
  38.         return obj;  
  39.     }  
  40.   
  41. }  


接口实现类,用来操作redis的工具类
[java]  view plain  copy
  1. package framelib.redis.impl;  
  2.   
  3. import java.io.ByteArrayInputStream;  
  4. import java.io.ByteArrayOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.ObjectInputStream;  
  7. import java.io.ObjectOutputStream;  
  8. import java.io.Serializable;  
  9. import java.util.ArrayList;  
  10. import java.util.HashMap;  
  11. import java.util.HashSet;  
  12. import java.util.Iterator;  
  13. import java.util.LinkedHashSet;  
  14. import java.util.List;  
  15. import java.util.Map;  
  16. import java.util.Set;  
  17. import java.util.Map.Entry;  
  18.   
  19. import framelib.common.Common;  
  20.   
  21. import redis.clients.jedis.Jedis;  
  22. import redis.clients.jedis.JedisShardInfo;  
  23. import redis.clients.jedis.ShardedJedis;  
  24. import redis.clients.jedis.ShardedJedisPool;  
  25. import redis.clients.jedis.Tuple;  
  26. import framelib.redis.IRedisUtil;  
  27. /** 
  28.  * 操作redis实现类 
  29.  * @author zhang.yuwei 
  30.  * 
  31.  */  
  32. public class RedisUtilImpl implements IRedisUtil{  
  33.     /** 
  34.      * 存放key不是企业ID的数据,目前暂且不提供 
  35.      */  
  36.     private ShardedJedisPool shardedJedisPool;  
  37.     /** 
  38.      * 为提高扩展性,以后会有多个redis服务,此Map中key为redis服务个数分别为1,2,3,4.....;value为对应的redis池 
  39.      * 目前假设每10万个企业占用一台redis服务,在redis中key为每个企业ID 
  40.      */  
  41.     private Map<Integer,ShardedJedisPool> shardedJedisPoolMap;    
  42.       
  43.     /*public void setShardedJedisPool(ShardedJedisPool shardedJedisPool) { 
  44.         this.shardedJedisPool = shardedJedisPool; 
  45.     }*/  
  46.       
  47.     /** 
  48.      * 获取Jedis连接 
  49.      * @return 
  50.      */  
  51.     private  ShardedJedis  getShardedJedis(String key) {  
  52.         ShardedJedisPool pool=null;  
  53.         try{  
  54.             int id = Integer.parseInt(key);  
  55.             int redisKey = id/Common.REDIS_DATA_NUM+1;  
  56.             pool = shardedJedisPoolMap.get(redisKey);  
  57.         }catch(Exception e){  
  58.             return shardedJedisPool.getResource();    //对于存储id以外的key,有shardedJedisPool提供  
  59.         }  
  60.         if(pool!=null){  
  61.             return pool.getResource();  
  62.         }else{  
  63.             return shardedJedisPool.getResource();   //如果某一台存放企业ID的redis服务宕机,有shardedJedisPool提供临时提供服务  
  64.         }  
  65.     }  
  66.       
  67.     public void setShardedJedisPoolMap(  
  68.             Map<Integer, ShardedJedisPool> shardedJedisPoolMap) {  
  69.         this.shardedJedisPoolMap = shardedJedisPoolMap;  
  70.     }  
  71.       
  72.     public void setShardedJedisPool(ShardedJedisPool shardedJedisPool) {  
  73.         this.shardedJedisPool = shardedJedisPool;  
  74.     }  
  75.   
  76.     /** 
  77.      * 释放资源 
  78.      * @param key 
  79.      * @param redis 
  80.      */  
  81.     private void returnResource(String key,ShardedJedis shardedJedis){  
  82.         shardedJedisPool.returnResource(shardedJedis);  
  83.     /*  ShardedJedisPool pool=null; 
  84.         try{ 
  85.             int id = Integer.parseInt(key); 
  86.             int redisKey = id/Common.REDIS_DATA_NUM+1; 
  87.             pool = shardedJedisPoolMap.get(redisKey); 
  88.         }catch(Exception e){ 
  89.             shardedJedisPool.returnResource(shardedJedis);    //对于存储id以外的key,有shardedJedisPool提供 
  90.         } 
  91.         if(pool!=null){ 
  92.             pool.returnResource(shardedJedis); 
  93.         }else{ 
  94.             shardedJedisPool.returnResource(shardedJedis);  //如果某一台存放企业ID的redis服务宕机,有shardedJedisPool提供临时提供服务 
  95.         }*/  
  96.     }  
  97.     /** 
  98.      * 释放不可用的资源 
  99.      * @param key 
  100.      * @param redis 
  101.      *  
  102.      */  
  103.     private void returnBrokenResource(ShardedJedis shardedJedis){  
  104.         shardedJedisPool.returnBrokenResource(shardedJedis);  
  105.     }  
  106.     private byte[] objectToByte(Object obj) {  
  107.         byte[] bs=null;  
  108.         try {  
  109.             ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  110.             ObjectOutputStream oos = new ObjectOutputStream(bos);  
  111.             oos.writeObject(obj);  
  112.              bs =  bos.toByteArray();  
  113.             oos.close();  
  114.             bos.close();  
  115.             return bs;  
  116.         } catch (IOException e) {  
  117.               
  118.             e.printStackTrace();  
  119.         }  
  120.         return bs;  
  121.     }  
  122.     private Object byteToObject(byte[]  bs){  
  123.         Object obj = null;  
  124.         try{  
  125.             if(bs != null){  
  126.             ByteArrayInputStream bis = new ByteArrayInputStream(bs);  
  127.             ObjectInputStream inputStream = new ObjectInputStream(bis);  
  128.             obj = inputStream.readObject();  
  129.             //inputStream.close();  
  130.             //bis.close();  
  131.             }  
  132.             return obj;  
  133.         }catch (IOException e) {  
  134.             e.printStackTrace();  
  135.         }catch (ClassNotFoundException e1) {  
  136.             e1.printStackTrace();  
  137.         }   
  138.         return obj;  
  139.     }  
  140.       
  141.     /** 
  142.      * 删除给定的key 
  143.      * 当key存在 返回1 
  144.      * 当key不存在 返回0 
  145.      */  
  146.     public Long del(String key) {  
  147.         ShardedJedis shardedJedis = getShardedJedis(key);  
  148.         long count = shardedJedis.del(key);  
  149.         returnResource(key,shardedJedis);  
  150.         return count;  
  151.   
  152.     }  
  153.       
  154.   
  155.     /*************************存对象***********************************/  
  156.     /** 
  157.      * 存一个对象 
  158.      * 如果key已经存在 覆盖原值 
  159.      * 成功返回 OK 
  160.      * 失败返回 null 
  161.      */  
  162.     public String setObject(String key, Serializable value) {  
  163.         return setObjectImpl(key, value);  
  164.     }  
  165.       
  166.     /** 
  167.      * 存一个对象 
  168.      * 如果key已经存在 覆盖原值 
  169.      * 成功返回 OK 
  170.      * 失败返回 null 
  171.      */  
  172.     public String setObject(String key, Object value) {  
  173.         return setObjectImpl(key, value);  
  174.     }  
  175.       
  176.     /** 
  177.      * 存一个List 对象 
  178.      * 如果key已经存在 覆盖原值 
  179.      * 成功返回 OK 
  180.      * 失败返回 null 
  181.      */  
  182.     public String setObject(String key, List<? extends Serializable> value) {  
  183.         return setObjectImpl(key, value);  
  184.     }  
  185.     private String setObjectImpl(String key, Object value){  
  186.         ShardedJedis shardedJedis = getShardedJedis(key);  
  187.         try {  
  188.             byte[] byteArray = objectToByte(value);  
  189.             String setObjectRet = shardedJedis.set(key.getBytes(), byteArray);  
  190.             return setObjectRet;  
  191.         } catch (Exception e) {  
  192.             returnBrokenResource(shardedJedis);  
  193.             e.printStackTrace();  
  194.         }finally{  
  195.             returnResource(key,shardedJedis);  
  196.         }  
  197.         return null;  
  198.     }  
  199.       
  200.     /** 
  201.      * 存一个Map对象 
  202.      * 如果key已经存在 覆盖原值 
  203.      * 成功返回 OK 
  204.      * 失败返回 null 
  205.      */  
  206.     public String setObject(String key, Map<?, ? extends Serializable> value) {  
  207.           
  208.         return setObjectImpl(key, value);  
  209.     }  
  210.     /** 
  211.      * 存一个Set集合 
  212.      * 如果key已经存在 覆盖原值 
  213.      * 成功返回 OK 
  214.      * 失败返回 null 
  215.      */  
  216.     public String setObject(String key, Set<? extends Serializable> value) {  
  217.           
  218.         return setObjectImpl(key, value);  
  219.     }  
  220.     /*************取对象****************/  
  221.     public Object getObject(String key) {  
  222.         ShardedJedis shardedJedis = getShardedJedis(key);  
  223.         try {  
  224.             byte[] bs = shardedJedis.get(key.getBytes());  
  225.             Object obj = byteToObject(bs);  
  226.             return obj;  
  227.         } catch (Exception e2) {  
  228.             returnBrokenResource(shardedJedis);  
  229.             e2.printStackTrace();  
  230.         }finally{  
  231.             returnResource(key,shardedJedis);  
  232.         }  
  233.         return null;  
  234.     }  
  235.     /*****对List集合的操作*****/  
  236.     /** 
  237.      * String lindex(String key,int index); 
  238.      * 取出key对应的list集合中取出下标为index的值 
  239.      * 相当与list.get(index); 
  240.      * 如果key存在且对应的不是List集合 抛出异常: ERR Operation against a key holding the wrong kind of value 
  241.      */  
  242.     public Object lindex(String key, int index) {  
  243.         ShardedJedis shardedJedis = getShardedJedis(key);  
  244.         try {  
  245.             byte[] bs = shardedJedis.lindex(key.getBytes(),index);  
  246.             Object obj = byteToObject(bs);  
  247.             return obj;  
  248.         } catch (Exception e2) {  
  249.             returnBrokenResource(shardedJedis);  
  250.             e2.printStackTrace();  
  251.         }finally{  
  252.             returnResource(key,shardedJedis);  
  253.         }  
  254.         return null;  
  255.     }  
  256.     /** 
  257.      *  
  258.      * 查询 key所对应的list集合的size 
  259.      * long llen(String key); 
  260.      * key --> list对应的key 
  261.      * return key对应list的size() 
  262.      * 如果key不存在  返回0 
  263.      * 如果key对应的不是List集合 抛出异常: ERR Operation against a key holding the wrong kind of value 
  264.      */  
  265.     public Long llen(String key) {  
  266.         ShardedJedis shardedJedis = getShardedJedis(key);  
  267.         long size = 0;  
  268.         try{  
  269.             size = shardedJedis.llen(key.getBytes());  
  270.             return size;  
  271.         } catch (Exception e2) {  
  272.             returnBrokenResource(shardedJedis);  
  273.             e2.printStackTrace();  
  274.         }finally{  
  275.             returnResource(key,shardedJedis);  
  276.         }  
  277.         return size;  
  278.     }  
  279.     /** 
  280.      * 删除key对应的list中下标为0的元素 
  281.      * 返回被删除的value 
  282.      * String loop(String key); 
  283.      * key --> list对应的key 
  284.      * return value 当key不存在  返回null 
  285.      * 如果key对应的不是List集合 抛出异常: ERR Operation against a key holding the wrong kind of value 
  286.      * 例: key对应List-->[1,2,3,4,5] 
  287.      *      lpop(key);-->1 
  288.      */  
  289.     public Object lpop(String key) {  
  290.         ShardedJedis shardedJedis = getShardedJedis(key);  
  291.         try {  
  292.             byte[] bs = shardedJedis.lpop(key.getBytes());  
  293.             Object obj = byteToObject(bs);  
  294.             return obj;  
  295.         } catch (Exception e2) {  
  296.             returnBrokenResource(shardedJedis);  
  297.             e2.printStackTrace();  
  298.         }finally{  
  299.             returnResource(key,shardedJedis);  
  300.         }  
  301.         return null;  
  302.     }  
  303.     /** 
  304.      * 删除key对应的list的最后一个元素 
  305.      * String roop(String key); 
  306.      * key --> list对应的key 
  307.      * return 被删除的元素 当key不存在  返回null 
  308.      * 如果key对应的不是List集合 抛出异常: ERR Operation against a key holding the wrong kind of value 
  309.      * 例: key对应List-->[1,2,3,4,5] 
  310.      *      rpop(key);-->5 
  311.      */  
  312.     public Object lrpop(String key) {  
  313.         ShardedJedis shardedJedis = getShardedJedis(key);  
  314.         try {  
  315.             byte[] bs = shardedJedis.rpop(key.getBytes());  
  316.             Object obj = byteToObject(bs);  
  317.             return obj;  
  318.         } catch (Exception e2) {  
  319.             returnBrokenResource(shardedJedis);  
  320.             e2.printStackTrace();  
  321.         }finally{  
  322.             returnResource(key,shardedJedis);  
  323.         }  
  324.         return null;  
  325.     }  
  326.     /** 
  327.      * 向list里添加数据 加入list头部 
  328.      * long lpush(String key,String value); 
  329.      * key-->要添加的list的key 
  330.      * value-->要添加的值 
  331.      * return 当前list的size 
  332.      * 当key不存在时,会创建一个List并执行添加操作 
  333.      * 当key对应的不是List集合时 抛出异常:ERR Operation against a key holding the wrong kind of value 
  334.      * 例: key对应List-->[1,2,3,4,5] 
  335.      *      lpush(key,0);//6 
  336.      *      key对应List变为-->[0,1,2,3,4,5] 
  337.      */  
  338.     public Long lpush(String key, Serializable value) {  
  339.         ShardedJedis shardedJedis  = getShardedJedis(key);  
  340.           
  341.         try {  
  342.             byte[] byteArray = objectToByte(value);  
  343.             long size = shardedJedis.lpush(key.getBytes(), byteArray);  
  344.             return size;  
  345.         } catch (Exception e) {  
  346.             returnBrokenResource(shardedJedis);  
  347.             e.printStackTrace();  
  348.         }finally{  
  349.             returnResource(key,shardedJedis);  
  350.         }  
  351.           
  352.         return (long)0;  
  353.     }  
  354.     /** 
  355.      * 向list里添加数据 加入list尾部 
  356.      * long rpush(String key,String value); 
  357.      * key-->要添加的list的key 
  358.      * value-->要添加的值 
  359.      * return 当前list的size 
  360.      * 当key不存在时,会创建一个List并执行添加操作 
  361.      * 当key对应的不是List集合时 抛出异常:ERR Operation against a key holding the wrong kind of value 
  362.      * 例: key对应List-->[1,2,3,4,5] 
  363.      *      lpush(key,0);//6 
  364.      *      key对应List变为-->[1,2,3,4,5,0] 
  365.      */  
  366.     public Long rpush(String key, Serializable value) {  
  367.         ShardedJedis shardedJedis = getShardedJedis(key);  
  368.         try {  
  369.             byte[] byteArray = objectToByte(value);  
  370.             long size = shardedJedis.rpush(key.getBytes(), byteArray);  
  371.             return size;  
  372.         } catch (Exception e) {  
  373.             returnBrokenResource(shardedJedis);  
  374.             e.printStackTrace();  
  375.         }finally{  
  376.             returnResource(key,shardedJedis);  
  377.         }  
  378.           
  379.         return (long)0;  
  380.     }  
  381.     /** 
  382.      * 向list里添加数据 仅当list已经存在时才能执行 加入list头部 
  383.      * long lpushx(String key,String value); 
  384.      * key-->要添加的list的key 
  385.      * value-->要添加的值 
  386.      * return 当前list的size 
  387.      * 当key对应的不是List集合时 抛出异常:ERR Operation against a key holding the wrong kind of value 
  388.      */  
  389.     public Long lpushx(String key, Serializable value) {  
  390.           
  391.         if(exists(key)){  
  392.             return lpush(key, value);  
  393.         }  
  394.         return (long)0;  
  395.     }  
  396.     /** 
  397.      * 利用管道pipeline 
  398.      * 向list里添加数据 仅当list已经存在时才能执行 加入list头部 
  399.      * void lpushx(String key,list value); 
  400.      * key-->要添加的list的key 
  401.      * value-->要添加的值 
  402.      * 当key对应的不是List集合时 抛出异常:ERR Operation against a key holding the wrong kind of value 
  403.      */  
  404.     public void lpushx(String key, List<? extends Serializable> values) {  
  405.         if(exists(key)){  
  406.             lpush(key, values);  
  407.         }  
  408.     }  
  409.     /** 
  410.      * 向list里添加数据 仅当list已经存在时才能执行 加入list尾部 
  411.      * long rpushx(String key,String value); 
  412.      * key-->要添加的list的key 
  413.      * value-->要添加的值 
  414.      * return 当前list的size 
  415.      * 当key对应的不是List集合时 抛出异常:ERR Operation against a key holding the wrong kind of value 
  416.      */  
  417.     public Long rpushx(String key, Serializable value) {  
  418.         if(exists(key)){  
  419.             return rpush(key, value);  
  420.         }  
  421.         return (long)0;  
  422.     }  
  423.     /** 
  424.      * 利用管道pipeline 
  425.      * 向list里添加数据 仅当list已经存在时才能执行 加入list尾部 
  426.      * void lpushx(String key,list value); 
  427.      * key-->要添加的list的key 
  428.      * value-->要添加的值 
  429.      * 当key对应的不是List集合时 抛出异常:ERR Operation against a key holding the wrong kind of value 
  430.      */  
  431.     public void rpushx(String key, List<? extends Serializable> values) {  
  432.         if(exists(key)){  
  433.             rpush(key, values);  
  434.         }  
  435.     }  
  436.     /** 
  437.      * 取出key对应的list集合 start为起始位 最小为0,end为结束位置  当end=-1表示到最后一位(包含) -2为倒数第二位... 
  438.      * List lrange(String key,int start,int end); 
  439.      * key-->要获取的list的key 
  440.      * start-->开始位置 
  441.      * end--> 结束位置 
  442.      * 如:一个list集合["1","2","3","4","5","6"] 
  443.      * jedis.lrange("list", 0, 3); ==>["1","2","3","4"] 
  444.      * jedis.lrange("list", 0, -1);==>["1","2","3","4","5","6"] 
  445.      * 当key对应的不是List集合时 抛出异常:ERR Operation against a key holding the wrong kind of value 
  446.      */  
  447.     public List lrange(String key, int start, int end) {  
  448.         ShardedJedis shardedJedis = getShardedJedis(key);  
  449.         List list = new ArrayList();  
  450.         try {  
  451.             List<byte[]> bs = shardedJedis.lrange(key.getBytes(),start,end);  
  452.             for (int i = 0; i < bs.size(); i++) {  
  453.                 list.add(byteToObject(bs.get(i)));  
  454.             }  
  455.             return list;  
  456.         }  catch (Exception e2) {  
  457.             returnBrokenResource(shardedJedis);  
  458.             e2.printStackTrace();  
  459.         }finally{  
  460.             returnResource(key,shardedJedis);  
  461.         }  
  462.         return null;  
  463.     }  
  464.     /** 
  465.      * 从list中删除count个值为value的元素 count为正数是从首位往后删  count为负数是从末位往前删 
  466.      * long lrem(String key,int count,String value); 
  467.      * key-->key 
  468.      * count--> 数量 
  469.      * value-->值 
  470.      * return 删除的数量 
  471.      * 如:一个list集合["1","2","1","2","3","1"] 
  472.      * jedis.lrem("testList",1, "1")==>["2","1","2","3","1"] 返回1 
  473.      * jedis.lrem("testList",-1, "1")==>["1","2","1","2","3"]返回1 
  474.      * jedis.lrem("testList",5, "1")==>["2","2","3"] 返回3 
  475.      * 当key对应的不是List集合时 抛出异常:ERR Operation against a key holding the wrong kind of value 
  476.      */  
  477.     public Long lrem(String key, int count, Serializable value) {  
  478.         ShardedJedis shardedJedis = getShardedJedis(key);  
  479.         try {  
  480.             byte[] byteArray = objectToByte(value);  
  481.             long result = shardedJedis.lrem(key.getBytes(),count, byteArray);  
  482.             return result;   
  483.         } catch (Exception e) {  
  484.             returnBrokenResource(shardedJedis);  
  485.             e.printStackTrace();  
  486.         }finally{  
  487.             returnResource(key,shardedJedis);  
  488.         }  
  489.           
  490.         return (long)0;  
  491.     }  
  492.     /** 
  493.      * 把key对应的list集合中下标为index的元素改为value 下标错误的话抛出 ERR index out of range 
  494.      * String lset(String key,int index,String value); 
  495.      * key key 
  496.      * index 元素下标 
  497.      * value 值 
  498.      * return  OK 
  499.      * 当key对应的不是List集合时 抛出异常:ERR Operation against a key holding the wrong kind of value 
  500.      * 如:一个list集合["1","2","3","4"] 
  501.      * lset(list,3,"5");==>["1","2","5","4"]返回OK 
  502.      */  
  503.     public String lset(String key, int index, Serializable value) {  
  504.         ShardedJedis shardedJedis = getShardedJedis(key);  
  505.         try {  
  506.             byte[] byteArray = objectToByte(value);  
  507.             String result = shardedJedis.lset(key.getBytes(),index, byteArray);  
  508.             return result;  
  509.         } catch (Exception e) {  
  510.             returnBrokenResource(shardedJedis);  
  511.             e.printStackTrace();  
  512.         }finally{  
  513.             returnResource(key,shardedJedis);  
  514.         }  
  515.         return null;  
  516.     }  
  517.     /** 
  518.      * 删除key对应的list集合中下标范围不在start-->end 范围内的所有元素 
  519.      * String ltrim(String key,int start,int end); 
  520.      * key  key 
  521.      * start 开始下标 
  522.      * end 结束下标(包含) 
  523.      * return  OK 
  524.      * 当key对应的不是List集合时 抛出异常:ERR Operation against a key holding the wrong kind of value 
  525.      *  * 如:一个list集合["1","2","3","4","5","6","7"] 
  526.      * ltrim(list,3,5);==>["4","5","6"]返回OK 
  527.      */  
  528.     public String ltrim(String key, int start, int end) {  
  529.         ShardedJedis shardedJedis = getShardedJedis(key);  
  530.         try{  
  531.             String result = shardedJedis.ltrim(key.getBytes(),start,end);  
  532.             return result;  
  533.         } catch (Exception e2) {  
  534.             returnBrokenResource( shardedJedis);  
  535.             e2.printStackTrace();  
  536.         }finally{  
  537.             returnResource(key,shardedJedis);  
  538.         }  
  539.         return null;  
  540.     }  
  541.   
  542.     public String rpoplpush(String srcKey, String detKey) {  
  543.         return null;  
  544.     }  
  545.     /*********Set集合************/  
  546.     /** 
  547.      * 向set里添加数据 加入list尾部 
  548.      * long sadd(String key,String value); 
  549.      * key-->要添加的set的key 
  550.      * value-->要添加的值 
  551.      * return 成功返回1失败返回0 
  552.      * 当key不存在时,会创建一个set并执行添加操作 
  553.      * 当key对应的不是set集合时 抛出异常:ERR Operation against a key holding the wrong kind of value 
  554.      */  
  555.     public Long sadd(String key, Serializable value) {  
  556.         ShardedJedis shardedJedis = getShardedJedis(key);  
  557.         try {  
  558.             byte[] byteArray = objectToByte(value);  
  559.             Long sum = shardedJedis.sadd(key.getBytes(), byteArray);  
  560.             return sum;  
  561.         } catch (Exception e) {  
  562.             returnBrokenResource( shardedJedis);  
  563.             e.printStackTrace();  
  564.         }finally{  
  565.             returnResource(key,shardedJedis);  
  566.         }  
  567.         return (long0;  
  568.     }  
  569.     /** 
  570.      * 返回key对应的set集合中元素的数量==>set.size() 
  571.      * 如果key不存在  返回0 
  572.      * 如果key对应的不是set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  573.      */  
  574.     public Long scard(String key) {  
  575.         ShardedJedis shardedJedis = getShardedJedis(key);  
  576.         try{  
  577.             long size = shardedJedis.scard(key.getBytes());  
  578.             return size;  
  579.         } catch (Exception e2) {  
  580.             returnBrokenResource( shardedJedis);  
  581.             e2.printStackTrace();  
  582.         }finally{  
  583.             returnResource(key,shardedJedis);  
  584.         }  
  585.         return (long)0;  
  586.     }  
  587.     /** 
  588.      * SISMEMBER 
  589.      * public Boolean sismember(String key, Serializable member) 
  590.      * 描述:判断member元素是否是key对应的集合的成员。 
  591.      * 返回值:如果member元素是key对应的集合的成员,则返回true 
  592.      *      如果member元素不是key对应的集合的成员,或者key不存在,则返回false 
  593.      * 如果key对应的不是set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  594.      */  
  595.     public boolean sismember(String key, Serializable value) {  
  596.         ShardedJedis shardedJedis = getShardedJedis(key);  
  597.         try {  
  598.             byte[] byteArray = objectToByte(value);  
  599.             boolean flag = shardedJedis.sismember(key.getBytes(), byteArray);  
  600.             return flag;  
  601.         } catch (Exception e) {  
  602.             returnBrokenResource(shardedJedis);  
  603.             e.printStackTrace();  
  604.         }finally{  
  605.             returnResource(key,shardedJedis);  
  606.         }  
  607.         return false;  
  608.     }  
  609.     /** 
  610.      * SMEMBER 
  611.      * public Set smember(String key) 
  612.      * 描述:返回key对应的集合的所有成员。不存在key视为空。 
  613.      * 返回值: key对应的集合的所有成员集合。 
  614.      * 如果key对应的不是set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  615.      */  
  616.     public Set<? extends Serializable> smembers(String key) {  
  617.         ShardedJedis shardedJedis = getShardedJedis(key);  
  618.         Set set = new HashSet();  
  619.         try {  
  620.             Set<byte[]> bs = shardedJedis.smembers(key.getBytes());  
  621.             for (Iterator<byte[]> iterator = bs.iterator(); iterator.hasNext();) {  
  622.                 set.add(byteToObject(iterator.next()));  
  623.             }  
  624.             return set;  
  625.         } catch (Exception e2) {  
  626.             returnBrokenResource(shardedJedis);  
  627.             e2.printStackTrace();  
  628.         }finally{  
  629.             returnResource(key,shardedJedis);  
  630.         }  
  631.         return null;  
  632.     }  
  633.     /** 
  634.      * SPOP 
  635.      * public String spop(String key) 
  636.      * 描述:随即移除key对应的集合中的一个元素,并将该元素返回。 
  637.      * 返回值:key对应的集合中被随即移除的元素。 
  638.      * 当key不存在时 返回null 
  639.      *  如果key对应的不是set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  640.      */  
  641.     public Object spop(String key) {  
  642.         ShardedJedis shardedJedis = getShardedJedis(key);  
  643.         try {  
  644.             byte[] bs = shardedJedis.spop(key.getBytes());  
  645.             Object obj = byteToObject(bs);  
  646.             return obj;  
  647.         } catch (Exception e2) {  
  648.             returnBrokenResource( shardedJedis);  
  649.             e2.printStackTrace();  
  650.         }finally{  
  651.             returnResource(key,shardedJedis);  
  652.         }  
  653.         return null;  
  654.     }  
  655.     /** 
  656.      * SRANDMEMBER 
  657.      * public String srandmember(String key) 
  658.      * 描述:随即获取key对应的集合中的一个元素。 
  659.      * 返回值:随即获取key对应的集合中的一个元素。如果key不存在,则返回null。 
  660.      * 如果key对应的不是set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  661.      */  
  662.     public Object srandmember(String key) {  
  663.         ShardedJedis shardedJedis= getShardedJedis(key);  
  664.         try {  
  665.             byte[] bs = shardedJedis.srandmember(key.getBytes());  
  666.             Object obj = byteToObject(bs);  
  667.             return obj;  
  668.         }  catch (Exception e2) {  
  669.             returnBrokenResource(shardedJedis);  
  670.             e2.printStackTrace();  
  671.         }finally{  
  672.             returnResource(key,shardedJedis);  
  673.         }  
  674.         return null;  
  675.     }  
  676.     /** 
  677.      * srem 
  678.      * public String srem(String key ,Serializable value) 
  679.      * 删除key对应set集合中值为value的元素 
  680.      * 删除成功返回1 
  681.      * 如果key不存在 或者 value 不在set集合中 返回0 
  682.      * 如果key对应的不是set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  683.      */  
  684.     public Long srem(String key, Serializable value) {  
  685.         ShardedJedis shardedJedis = getShardedJedis(key);  
  686.         try {  
  687.             byte[] byteArray = objectToByte(value);  
  688.             long count = shardedJedis.srem(key.getBytes(), byteArray);  
  689.             return count;  
  690.         } catch (Exception e) {  
  691.             returnBrokenResource( shardedJedis);  
  692.             e.printStackTrace();  
  693.         }finally{  
  694.             returnResource(key,shardedJedis);  
  695.         }  
  696.         return (long)0;  
  697.     }  
  698.     /*******************Sorted set*****************************/  
  699.     /** 
  700.      * ZADD 
  701.      * public Long zadd(String key, double score, String member) 
  702.      * 描述:将一个元素member及其score值加入key对应的有序集中。如果某个member已经是有序集的成员,那么更新这个member的score值,并通过重新插入这个member元素 
  703.      *           来保证member在正确的位置上。score值可以是整数值或双精度浮点数。有序集中member的排序是根据其score升序排列的。如果key不存在,则创建一个空的有序集并执行 
  704.      *     zadd操作。当key存在但不是有序集类型时,返回一个错误。 
  705.      * 返回值:被成功添加的心成员的数量,不包含安歇被更新的,已经存在的成员。 
  706.      * 如果key对应的不是zset集合  抛出 ERR Operation against a key holding the wrong kind of value 
  707.      */  
  708.     public Long zadd(String key, double score, Serializable value) {  
  709.         ShardedJedis shardedJedis = getShardedJedis(key);  
  710.         try {  
  711.             byte[] byteArray = objectToByte(value);  
  712.             long count = shardedJedis.zadd(key.getBytes(),score, byteArray);  
  713.             return count;  
  714.         } catch (Exception e) {  
  715.             returnBrokenResource(shardedJedis);  
  716.             e.printStackTrace();  
  717.         }finally{  
  718.             returnResource(key,shardedJedis);  
  719.         }  
  720.         return (long)0;  
  721.       
  722.     }  
  723.     /** 
  724.      * ZCARD 
  725.      * public Long zcard(String key) 
  726.      * 描述:返回key对应的有序集的基数。 
  727.      * 返回值:当key存在且是有序集类型时,返回有序集的基数。 
  728.      *               当key不存在时,返回0。 
  729.      *       当key对应的不是有序集类型时  抛出 ERR Operation against a key holding the wrong kind of value 
  730.      */  
  731.     public Long zcard(String key) {  
  732.         ShardedJedis shardedJedis = getShardedJedis(key);  
  733.         long size = 0;  
  734.         try{  
  735.             size = shardedJedis.zcard(key.getBytes());  
  736.             return size;  
  737.         } catch (Exception e2) {  
  738.             returnBrokenResource(shardedJedis);  
  739.             e2.printStackTrace();  
  740.         }finally{  
  741.             returnResource(key,shardedJedis);  
  742.         }  
  743.         return size;  
  744.     }  
  745.     /** 
  746.      * ZCOUNT 
  747.      * public Long zcount(String key) 
  748.      * 描述:返回key对应的有序集 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。 
  749.      * 返回值:返回key对应的有序集 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。 
  750.      * 例: jedis.zcount("testzcard", 8, 9)==》testzcard对应的有序集中8<=score<=9的个数 
  751.      * 当key对应的不是有序集类型时  抛出 ERR Operation against a key holding the wrong kind of value 
  752.      */  
  753.     public Long zcount(String key, double min, double max) {  
  754.         ShardedJedis shardedJedis = getShardedJedis(key);  
  755.         long size = 0;  
  756.         try{  
  757.             size = shardedJedis.zcount(key.getBytes(),min,max);  
  758.             return size;  
  759.         } catch (Exception e2) {  
  760.             returnBrokenResource(shardedJedis);  
  761.             e2.printStackTrace();  
  762.         }finally{  
  763.             returnResource(key,shardedJedis);  
  764.         }  
  765.         return size;  
  766.           
  767.     }  
  768.     /** 
  769.      * ZINCRBY 
  770.      * public Double zincrby(String key, double incrementscore, Serializable member) 
  771.      * 描述:为key对应的有序集中member的score值加上增量incrementscore。当key对应的不是有序集是返回一个错误。 
  772.      * 返回值:member的新的score值。 
  773.      * 例:jedis.zincrby("testzincrby", 10, "google")==>testzincrby对应的有序集中google的score + 10 
  774.      * 当key对应的不是有序集类型时  抛出 ERR Operation against a key holding the wrong kind of value 
  775.      */  
  776.     public double zincrby(String key, double incrementscore, Serializable value) {  
  777.         ShardedJedis shardedJedis = getShardedJedis(key);  
  778.         try {  
  779.               
  780.             byte[] byteArray = objectToByte(value);  
  781.             double score = shardedJedis.zincrby(key.getBytes(),incrementscore, byteArray);  
  782.             return score;  
  783.         } catch (Exception e) {  
  784.             returnBrokenResource(shardedJedis);  
  785.             e.printStackTrace();  
  786.         }finally{  
  787.             returnResource(key,shardedJedis);  
  788.         }  
  789.         return 0;  
  790.     }  
  791.     /** 
  792.      * zrange 
  793.      * public Set zrange(String key,int start,int end) 
  794.      * 描述:返回key对应的有序set集合的所有成员。不存在key视为空。 
  795.      * 返回值: key对应的有序set集合的所有成员集合。 
  796.      * 如果key对应的不是有序set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  797.      */  
  798.     public Set<? extends Serializable> zrange(String key, int start, int end) {  
  799.         ShardedJedis shardedJedis = getShardedJedis(key);  
  800.         Set set = new LinkedHashSet();  
  801.         try {  
  802.             Set<byte[]> bs = shardedJedis.zrange(key.getBytes(),start,end);  
  803.             ByteArrayInputStream bis = null;  
  804.             ObjectInputStream inputStream = null;  
  805.             for (Iterator<byte[]> iterator = bs.iterator(); iterator.hasNext();) {  
  806.                 set.add(byteToObject(iterator.next()));  
  807.   
  808.             }  
  809.             return set;  
  810.         }  catch (Exception e2) {  
  811.             returnBrokenResource( shardedJedis);  
  812.             e2.printStackTrace();  
  813.         }finally{  
  814.             returnResource(key,shardedJedis);  
  815.         }  
  816.         return null;  
  817.     }  
  818.     /** 
  819.      * ZRANGEBYSCORE 
  820.      * public Set<String> zrangeByScore(String key, double min, double max) 
  821.      * 描述:返回key对应有序集 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。  
  822.      * 返回值:指定区间内的有序集成员集合。 、 
  823.      * 如果key对应的不是有序set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  824.      */  
  825.     public Set<? extends Serializable> zrangeByScore(String key, double min,  
  826.             double max) {  
  827.         ShardedJedis shardedJedis = getShardedJedis(key);  
  828.         Set set = new LinkedHashSet();  
  829.         try {  
  830.             Set<byte[]> bs = shardedJedis.zrangeByScore(key.getBytes(),min,max);  
  831.             for (Iterator<byte[]> iterator = bs.iterator(); iterator.hasNext();) {  
  832.                 set.add(byteToObject(iterator.next()));  
  833.             }  
  834.             return set;  
  835.         }  catch (Exception e2) {  
  836.             returnBrokenResource( shardedJedis);  
  837.             e2.printStackTrace();  
  838.         }finally{  
  839.             returnResource(key,shardedJedis);  
  840.         }  
  841.         return null;  
  842.     }  
  843.     /** 
  844.      * ZREM 
  845.      * public Long zrem(String key, Serializable members) 
  846.      * 描述:移除key对应的有序集中的member(s)元素,不存在的将被忽略。 
  847.      * 返回值:删除成功 返回1 
  848.      * 否则 返回0 
  849.      *  
  850.      * 如果key对应的不是有序set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  851.      */  
  852.     public Long zrem(String key, Serializable value) {  
  853.         ShardedJedis shardedJedis= getShardedJedis(key);  
  854.         try {  
  855.             byte[] byteArray = objectToByte(value);  
  856.             long count = shardedJedis.zrem(key.getBytes(), byteArray);  
  857.             return count;  
  858.         } catch (Exception e) {  
  859.             returnBrokenResource(shardedJedis);  
  860.             e.printStackTrace();  
  861.         }finally{  
  862.             returnResource(key,shardedJedis);  
  863.         }  
  864.         return (long)0;  
  865.     }  
  866.     /** 
  867.      * ZREMRANGEBYRANK 
  868.      * public  Long zremrangeByRank(String key, int start, int end) 
  869.      * 描述:移除key对应的有序集中指定区间【start,end】内的所有成员。 
  870.      *     下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。 
  871.      *     你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。 
  872.      * 返回值:被移除的成员的数量。 
  873.      * 如果key对应的不是有序set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  874.      */  
  875.     public Long zremrangeByRank(String key, int start, int end) {  
  876.         ShardedJedis shardedJedis = getShardedJedis(key);  
  877.         long count = 0;  
  878.         try{  
  879.             count = shardedJedis.zremrangeByRank(key.getBytes(),start,end);  
  880.             return count;  
  881.         } catch (Exception e2) {  
  882.             returnBrokenResource(shardedJedis);  
  883.             e2.printStackTrace();  
  884.         }finally{  
  885.             returnResource(key,shardedJedis);  
  886.         }  
  887.         return count;  
  888.     }  
  889.     /** 
  890.      * ZREMRANGEBYSCORE 
  891.      * public  Long zremrangeByScore(String key, double start, double end) 
  892.      * 描述:移除key对应的有序集中score在区间【start,end】内的所有成员。 
  893.      *     下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。 
  894.      *     你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。 
  895.      * 返回值:被移除的成员的数量。 
  896.      * 例:jedis.zremrangeByScore("testZinterstore", 150, 200);==》testZinterstore删除元素150<=score<=160 
  897.      * 如果key对应的不是有序set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  898.      */  
  899.     public Long zremrangeByScore(String key, double start, double end) {  
  900.         ShardedJedis shardedJedis = getShardedJedis(key);  
  901.         long count = 0;  
  902.         try{  
  903.             count = shardedJedis.zremrangeByScore(key.getBytes(),start,end);  
  904.             return count;  
  905.         } catch (Exception e2) {  
  906.             returnBrokenResource( shardedJedis);  
  907.             e2.printStackTrace();  
  908.         }finally{  
  909.             returnResource(key,shardedJedis);  
  910.         }  
  911.         return count;  
  912.           
  913.     }  
  914.     /** 
  915.      * ZREVRANGE  
  916.      * public Set<String> zrevrange(String key, long start, long end) 
  917.      * 描述:返回key对应的有序集中指定区间内的成员。其中成员的的位置是按照score值得降序来排序的。 
  918.      *     下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。 
  919.      *     你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。 
  920.      * 返回值:指定区间内的有序集成员集合。 
  921.      *  
  922.      * 如果key对应的不是有序set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  923.      */  
  924.     public Set<? extends Serializable> zrevrange(String key, int start, int end) {  
  925.         ShardedJedis shardedJedis = getShardedJedis(key);  
  926.             Set set = new LinkedHashSet();  
  927.             try {  
  928.                 Set<byte[]> bs = shardedJedis.zrevrange(key.getBytes(),start,end);  
  929.                 for (Iterator<byte[]> iterator = bs.iterator(); iterator.hasNext();) {  
  930.                     set.add(byteToObject(iterator.next()));  
  931.                 }  
  932.                 return set;  
  933.             } catch (Exception e2) {  
  934.                 returnBrokenResource( shardedJedis);  
  935.                 e2.printStackTrace();  
  936.             }finally{  
  937.                 returnResource(key,shardedJedis);  
  938.             }  
  939.             return null;  
  940.     }  
  941.     /** 
  942.      * ZRANK 
  943.      * public Long zrank(String key, Serializable member) 
  944.      * 描述:返回key对应的有序集 中成员 member 的排名。其中有序集成员按 score 值递增排序。 
  945.      *     排名以 0 为底,也就是说, score 值最大的成员排名为 0 。 
  946.      * 返回值:如果 member 是key对应的有序集 中成员 ,返回 member 的排名。 
  947.      *      如果 member 不是key对应的有序集 中成员 ,返回 null  
  948.      * 如果key对应的不是有序set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  949.      */  
  950.     public Long zrank(String key, Serializable value) {  
  951.         ShardedJedis shardedJedis = getShardedJedis(key);  
  952.         try {  
  953.             byte[] byteArray = objectToByte(value);  
  954.             long rank = shardedJedis.zrank(key.getBytes(), byteArray);  
  955.             return rank;  
  956.         } catch (Exception e) {  
  957.             returnBrokenResource(shardedJedis);  
  958.             e.printStackTrace();  
  959.         }finally{  
  960.             returnResource(key,shardedJedis);  
  961.         }  
  962.         return (long)0;  
  963.     }  
  964.     /** 
  965.      * ZREVRANK 
  966.      * public  Long zrevrank(String key, Serializable member) 
  967.      * 描述:返回key对应的有序集 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。 
  968.      *     排名以 0 为底,也就是说, score 值最大的成员排名为 0 。 
  969.      * 返回值:如果 member 是key对应的有序集 中成员 ,返回 member 的排名。 
  970.      *      如果 member 不是key对应的有序集 中成员 ,返回 null  
  971.      * 如果key对应的不是有序set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  972.      */  
  973.     public Long zrevrank(String key, Serializable value) {  
  974.         ShardedJedis shardedJedis = getShardedJedis(key);  
  975.         try {  
  976.             byte[] byteArray = objectToByte(value);  
  977.             long rank = shardedJedis.zrevrank(key.getBytes(), byteArray);  
  978.             return rank;  
  979.         } catch (Exception e) {  
  980.             returnBrokenResource( shardedJedis);  
  981.             e.printStackTrace();  
  982.         }finally{  
  983.             returnResource(key,shardedJedis);  
  984.         }  
  985.         return (long)0;  
  986.     }  
  987.     /** 
  988.      * ZSCORE 
  989.      * public Double zscore(String key, Serializable member) 
  990.      * 描述:返回key对应的有序集中member对应的score值。 
  991.      * 返回值:member成员的score值。 
  992.      * 如果key对应的不是有序set集合  抛出 ERR Operation against a key holding the wrong kind of value 
  993.      */  
  994.     public double zscore(String key, Serializable value) {  
  995.         ShardedJedis shardedJedis = getShardedJedis(key);  
  996.         try {  
  997.             byte[] byteArray = objectToByte(value);  
  998.             double score = shardedJedis.zscore(key.getBytes(), byteArray);  
  999.             return score;  
  1000.         } catch (Exception e) {  
  1001.             returnBrokenResource(shardedJedis);  
  1002.             e.printStackTrace();  
  1003.         }finally{  
  1004.             returnResource(key,shardedJedis);  
  1005.         }  
  1006.         return 0;  
  1007.     }  
  1008.     /********************************Hash 表**********************************************/  
  1009.     /** 
  1010.      * String hset(String key,Map<String,String>) 
  1011.      * 同时将多个field-value以Map集合设置到key对应的哈希表中 
  1012.      * 此命令会覆盖哈希表中已存在的域 
  1013.      * 如果key不存在  会创建一个空哈希表 并执行此方法 
  1014.      * 返回  成功返回OK 
  1015.      * 如果key对应的不是哈希表  返回 ERR Operation against a key holding the wrong kind of value 
  1016.      *  
  1017.      */  
  1018.     public Long hset(String key, String field, Serializable value) {  
  1019.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1020.         try {  
  1021.             byte[] byteArray = objectToByte(value);  
  1022.             Long result = shardedJedis.hset(key.getBytes(),field.getBytes(), byteArray);  
  1023.             return result;  
  1024.         } catch (Exception e) {  
  1025.             returnBrokenResource( shardedJedis);  
  1026.             e.printStackTrace();  
  1027.         }finally{  
  1028.             returnResource(key,shardedJedis);  
  1029.         }  
  1030.         return (long)0;  
  1031.     }  
  1032.     /** 
  1033.      * Boolean hexists(String key,String field); 
  1034.      * 查看key对应的哈希表中,是不是存在给定的域field 
  1035.      * 如果存在 返回true 
  1036.      * 如果不含有指定域 或者key不存在 返回false 
  1037.      * 如果key对应的不是哈希表 抛出ERR Operation against a key holding the wrong kind of value 
  1038.      */  
  1039.     public boolean hexists(String key, String field) {  
  1040.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1041.         try{  
  1042.             boolean flag = shardedJedis.hexists(key.getBytes(),field.getBytes());  
  1043.             returnResource(key,shardedJedis);  
  1044.             return flag;  
  1045.         } catch (Exception e2) {  
  1046.             returnBrokenResource( shardedJedis);  
  1047.             e2.printStackTrace();  
  1048.         }  
  1049.         return false;  
  1050.     }  
  1051.     /** 
  1052.      * Long hsetnx(String key,String field,String value); 
  1053.      * 在key对应的哈希表中,当且仅当域field不存在时,新建域field设置值为value 
  1054.      * 如果域field已经存在 不执行操作 
  1055.      * 如果key不存在  新建一个哈希表然后进行hsetnx操作 
  1056.      * 如果key存在且对应的不是哈希表 ERR Operation against a key holding the wrong kind of value 
  1057.      * 返回: 
  1058.      *      设置成功 返回1 
  1059.      *      如果给定的域已经存在且没有操作被执行 返回0 
  1060.      *  
  1061.      */  
  1062.     public Long hsetnx(String key, String field, Serializable value) {  
  1063.         ShardedJedis shardedJedis= getShardedJedis(key);  
  1064.         try {  
  1065.             byte[] byteArray = objectToByte(value);  
  1066.             Long result = shardedJedis.hsetnx(key.getBytes(),field.getBytes(), byteArray);  
  1067.             return result;  
  1068.         } catch (Exception e) {  
  1069.             returnBrokenResource(shardedJedis);  
  1070.             e.printStackTrace();  
  1071.         }finally{  
  1072.             returnResource(key,shardedJedis);  
  1073.         }  
  1074.         return (long)0;  
  1075.     }  
  1076.     /** 
  1077.      * String hmset(String key,Map<String,String>) 
  1078.      * 同时将多个field-value以Map集合设置到key对应的哈希表中 
  1079.      * 此命令会覆盖哈希表中已存在的域 
  1080.      * 如果key不存在  会创建一个空哈希表 并执行此方法 
  1081.      * 返回  成功返回OK 
  1082.      * 如果key对应的不是哈希表  返回 ERR Operation against a key holding the wrong kind of value 
  1083.      *  
  1084.      */  
  1085.     public String hmset(String key, Map<String, ? extends Serializable> values) {  
  1086.         Map<byte[], byte[]> hash = new HashMap<byte[], byte[]>();  
  1087.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1088.         try {  
  1089.             for (Entry<String, ? extends Serializable> e : values.entrySet()) {  
  1090.                 String skey = e.getKey();  
  1091.                 Serializable value = e.getValue();  
  1092.                 byte[] byteArray = objectToByte(value);  
  1093.                 hash.put(skey.getBytes(),byteArray);  
  1094.             }  
  1095.             String result = shardedJedis.hmset(key.getBytes(),hash);  
  1096.             return result;  
  1097.         } catch (Exception e) {  
  1098.             returnBrokenResource(shardedJedis);  
  1099.             e.printStackTrace();  
  1100.         }finally{  
  1101.             returnResource(key,shardedJedis);  
  1102.         }  
  1103.         return null;  
  1104.     }  
  1105.     /** 
  1106.      * Object hget(String key,String field); 
  1107.      * 返回key对应哈系表中给定的域field的值 
  1108.      * 当给定域不存在或者key不存在时 返回null 
  1109.      * 如果key对应的不是哈希表 抛出ERR Operation against a key holding the wrong kind of value 
  1110.      */  
  1111.     public Object hget(String key, String field) {  
  1112.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1113.         try {  
  1114.             byte[] bs = shardedJedis.hget(key.getBytes(),field.getBytes());  
  1115.             Object obj = byteToObject(bs);  
  1116.             return obj;  
  1117.         } catch (Exception e2) {  
  1118.             returnBrokenResource(shardedJedis);  
  1119.             e2.printStackTrace();  
  1120.         }finally{  
  1121.             returnResource(key,shardedJedis);  
  1122.         }  
  1123.         return null;  
  1124.     }  
  1125.     /** 
  1126.      * List hmget(String key,String ...fields); 
  1127.      * 返回哈希表 key 中,一个或多个给定域的值。 
  1128.      * 当给定域不存在或者key不存在时 返回空的List 
  1129.      * 如果key对应的不是哈希表 抛出ERR Operation against a key holding the wrong kind of value 
  1130.      */  
  1131.     public List hmget(String key, List<String> fields) {  
  1132.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1133.         byte[][] bytes = new byte[fields.size()][];  
  1134.         for (int i = 0; i < fields.size(); i++) {  
  1135.             bytes[i] = fields.get(i).getBytes();  
  1136.         }  
  1137.         List list = new ArrayList();  
  1138.         try {  
  1139.             List<byte[]> bs = shardedJedis.hmget(key.getBytes(),bytes);  
  1140.             Object obj = null;  
  1141.             for (int i = 0; i < bs.size(); i++) {  
  1142.                 list.add(byteToObject(bs.get(i)));  
  1143.             }  
  1144.             return list;  
  1145.         }  catch (Exception e2) {  
  1146.             returnBrokenResource(shardedJedis);  
  1147.             e2.printStackTrace();  
  1148.         }finally{  
  1149.             returnResource(key,shardedJedis);  
  1150.         }  
  1151.         return list;  
  1152.     }  
  1153.     /** 
  1154.      * Map<String,String> hgetAll(String key); 
  1155.      * 以Map集合的形式返回key对应的哈希表中所有的域和值 
  1156.      * 如果key不存在 返回一个空Map 
  1157.      * 如果key对应的不是哈希表 抛出ERR Operation against a key holding the wrong kind of value 
  1158.      */  
  1159.     public Map<String, ? extends Serializable> hgetAll(String key) {  
  1160.         Map map = new HashMap();  
  1161.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1162.         try {  
  1163.             Map<byte[], byte[]> bbs = shardedJedis.hgetAll(key.getBytes());  
  1164.             Object obj = null;  
  1165.             for (Entry<byte[], byte[]> e:bbs.entrySet()) {  
  1166.                 byte[] bkey = e.getKey();  
  1167.                 byte[] bs = e.getValue();  
  1168.                 obj = byteToObject(bs);  
  1169.                 map.put(new String(bkey), obj);  
  1170.             }  
  1171.             return map;  
  1172.         } catch (Exception e2) {  
  1173.             returnBrokenResource(shardedJedis);  
  1174.             e2.printStackTrace();  
  1175.         } finally{  
  1176.             returnResource(key,shardedJedis);  
  1177.         }  
  1178.         return map;  
  1179.     }  
  1180.     /** 
  1181.      * Long hdel(String key,String field); 
  1182.      * 删除key对应的哈希表中一个指定域 
  1183.      * 不存在的域被忽略 
  1184.      * 返回 删除成功 1 
  1185.      * 如果key不存在时 返回0 
  1186.      * 当key对应的不是哈希表 抛出 ERR Operation against a key holding the wrong kind of value 
  1187.      */  
  1188.     public Long hdel(String key, String field) {  
  1189.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1190.         try{  
  1191.             long result = shardedJedis.hdel(key.getBytes(),field.getBytes());  
  1192.             return result;  
  1193.         } catch (Exception e2) {  
  1194.             returnBrokenResource(shardedJedis);  
  1195.             e2.printStackTrace();  
  1196.         }finally{  
  1197.             returnResource(key,shardedJedis);  
  1198.         }  
  1199.         return (long)0;  
  1200.     }  
  1201.     /** 
  1202.      * Long hlen(String key); 
  1203.      * 返回 key对应哈希表中域的数量 
  1204.      * 当key不存在时 返回0 
  1205.      * 如果key对应的不是哈希表 抛出ERR Operation against a key holding the wrong kind of value 
  1206.      */  
  1207.     public Long hlen(String key) {  
  1208.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1209.         try{  
  1210.             long result = shardedJedis.hlen(key.getBytes());  
  1211.             return result;  
  1212.         } catch (Exception e2) {  
  1213.             returnBrokenResource( shardedJedis);  
  1214.             e2.printStackTrace();  
  1215.         }finally{  
  1216.             returnResource(key,shardedJedis);  
  1217.         }  
  1218.         return (long)0;  
  1219.     }  
  1220.     /** 
  1221.      * Set<String> hkeys(String key); 
  1222.      * 以Set集合的形式返回key对应哈希表中所有域 
  1223.      * 如果key不存在 返回一个空Set集合 
  1224.      * 如果key对应的不是哈希表 抛出ERR Operation against a key holding the wrong kind of value 
  1225.      */  
  1226.     public Set<String> hkeys(String key) {  
  1227.         Set<String> set = new HashSet<String>();  
  1228.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1229.         try {  
  1230.             Set<byte[]> bs = shardedJedis.hkeys(key.getBytes());  
  1231.             for (Iterator<byte[]> iterator = bs.iterator(); iterator.hasNext();) {  
  1232.                 set.add(new String(iterator.next()));  
  1233.             }  
  1234.             return set;  
  1235.         } catch (Exception e2) {  
  1236.             returnBrokenResource(shardedJedis);  
  1237.             e2.printStackTrace();  
  1238.         }finally{  
  1239.             returnResource(key,shardedJedis);  
  1240.         }  
  1241.         return set;  
  1242.     }  
  1243.     /** 
  1244.      * List<String> hvals(String key); 
  1245.      * 以List集合的形式返回key对应的哈希表中所有域的值 
  1246.      * 当key不存在时,返回一个空List集合 
  1247.      * key存在且对应的不是哈希表 ERR Operation against a key holding the wrong kind of value 
  1248.      * 返回值: 
  1249.      *      一个包含哈希表中所有值的表 
  1250.      */  
  1251.     public List hvals(String key) {  
  1252.         List list = new ArrayList();  
  1253.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1254.         try {  
  1255.             List<byte[]> bbs = (List<byte[]>) shardedJedis.hvals(key.getBytes());  
  1256.             Object obj = null;  
  1257.             for (byte[] bs : bbs) {  
  1258.                 list.add(byteToObject(bs));  
  1259.             }  
  1260.             return list;  
  1261.         }  catch (Exception e2) {  
  1262.             returnBrokenResource(shardedJedis);  
  1263.             e2.printStackTrace();  
  1264.         }finally{  
  1265.             returnResource(key,shardedJedis);  
  1266.         }  
  1267.         return list;  
  1268.     }  
  1269.     /*********************String*****************************/  
  1270.     /** 
  1271.      * String set(String key,String value); 
  1272.      * 将字符串值value 存到key中 
  1273.      * 如果 key 已经持有其他值, 就覆写旧值,无视类型。 
  1274.      * 返回值:OK 
  1275.      *       
  1276.      */  
  1277.     public String set(String key, String value) {  
  1278.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1279.         String result = null;  
  1280.         try {  
  1281.              result = shardedJedis.set(key,value);  
  1282.             return result;  
  1283.         } catch (Exception e2) {  
  1284.             returnBrokenResource(shardedJedis);  
  1285.             e2.printStackTrace();  
  1286.         }finally{  
  1287.             returnResource(key,shardedJedis);  
  1288.         }  
  1289.         return result;  
  1290.     }  
  1291.     /** 
  1292.      * String setnx(String key,String value); 
  1293.      * 当且仅当key不存在 将字符串值value 存到key中 
  1294.      * 如果 key 已经存在 不做任何操作 返回0 
  1295.      * 成功 返回1 
  1296.      *       
  1297.      */  
  1298.     public Long setnx(String key, String value) {  
  1299.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1300.         long result = 0;  
  1301.         try {  
  1302.              result = shardedJedis.setnx(key,value);  
  1303.             return result;  
  1304.         } catch (Exception e2) {  
  1305.             returnBrokenResource(shardedJedis);  
  1306.             e2.printStackTrace();  
  1307.         }finally{  
  1308.             returnResource(key,shardedJedis);  
  1309.         }  
  1310.         return result;  
  1311.     }  
  1312.     /** 
  1313.      * SETEX 
  1314.      * public String setex(String key, int seconds, String value) 
  1315.      * 描述: 将值value关联到key,并将key的生存时间设置为seconds(以秒为单位)。如果key已关联在其他值,SETEX将复写旧值。 
  1316.      * 参数:key  seconds  value 
  1317.      * 返回值:设置成功时返回OK。 
  1318.      *  当seconds参数不合法时,返回 ERR invalid expire time in SETEX  
  1319.      *  
  1320.      */   
  1321.     public String setex(String key, int seconds, String value) {  
  1322.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1323.         String result = null;  
  1324.         try {  
  1325.              result = shardedJedis.setex(key, seconds, value);  
  1326.             return result;  
  1327.         } catch (Exception e2) {  
  1328.             returnBrokenResource(shardedJedis);  
  1329.             e2.printStackTrace();  
  1330.         }finally{  
  1331.             returnResource(key,shardedJedis);  
  1332.         }  
  1333.         return result;  
  1334.     }  
  1335.     /** 
  1336.      * Long append(String key,String value); 
  1337.      * 如果key存在并且是一个字符串 将value追加到key原来的值的末尾 
  1338.      * 如果key不存在  就添加一个key 对应value 就像执行SET key value一样 
  1339.      * 如果key对应的不是一个字符串时,抛出 ERR Operation against a key holding the wrong kind of value 
  1340.      * return 追加value之后,key中字符串的长度 
  1341.      */  
  1342.     public Long append(String key, String value) {  
  1343.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1344.         long result = 0;  
  1345.         try {  
  1346.              result = shardedJedis.append(key, value);  
  1347.             return result;  
  1348.         } catch (Exception e2) {  
  1349.             returnBrokenResource(shardedJedis);  
  1350.             e2.printStackTrace();  
  1351.         }finally{  
  1352.             returnResource(key,shardedJedis);  
  1353.         }  
  1354.         return result;  
  1355.     }  
  1356.     /** 
  1357.      * String get(String key); 
  1358.      * 返回key对应的字符串值 
  1359.      * 如果key不存在 返回null 
  1360.      * 如果key储存的值不时字符串类型,抛出ERR Operation against a key holding the wrong kind of value 
  1361.      */  
  1362.     public String get(String key) {  
  1363.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1364.         String result = null;  
  1365.         try {  
  1366.              result = shardedJedis.get(key);  
  1367.             return result;  
  1368.         } catch (Exception e2) {  
  1369.             returnBrokenResource( shardedJedis);  
  1370.             e2.printStackTrace();  
  1371.         }finally{  
  1372.             returnResource(key,shardedJedis);  
  1373.         }  
  1374.         return result;  
  1375.     }  
  1376.     /** 
  1377.      * String getSet(String key,String value); 
  1378.      * 将给定key对应的值设为value 并返回 旧值 
  1379.      * 当 key对应的值不是字符串类型时 抛出ERR Operation against a key holding the wrong kind of value 
  1380.      * 当 key不存在时 新建一个空key并将value存入  返回null 
  1381.      * 当新值=旧值时,覆盖  
  1382.      */  
  1383.     public String getSet(String key, String value) {  
  1384.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1385.         String result = null;  
  1386.         try {  
  1387.              result = shardedJedis.getSet(key, value);  
  1388.             return result;  
  1389.         } catch (Exception e2) {  
  1390.             returnBrokenResource(shardedJedis);  
  1391.             e2.printStackTrace();  
  1392.         }finally{  
  1393.             returnResource(key,shardedJedis);  
  1394.         }  
  1395.         return result;  
  1396.     }  
  1397.     /** 
  1398.      * Long decr(String key); 
  1399.      * 将key中所储存的数字值减1  注:key中存的必须是64位(long)整数,可以是负数 
  1400.      * 然后把这个修改后的数字值返回 
  1401.      * 如果key不存在 key的值会被初始化为0然后执行decr() 也就是-1 
  1402.      * 如果key对应的value不是数值 抛出 ERR value is not an integer or out of range 
  1403.      */  
  1404.     public Long decr(String key) {  
  1405.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1406.         long result = 0;  
  1407.         try {  
  1408.              result = shardedJedis.decr(key);  
  1409.             return result;  
  1410.         } catch (Exception e2) {  
  1411.             returnBrokenResource(shardedJedis);  
  1412.             e2.printStackTrace();  
  1413.         }finally{  
  1414.             returnResource(key,shardedJedis);  
  1415.         }  
  1416.         return result;  
  1417.     }  
  1418.     /** 
  1419.      * Long decrBy(String key,long integer); 
  1420.      * 将key所储存的值减去integer 
  1421.      * 如果key不存在,那么key的值会先被初始化为0,然后执行decrBy操作 
  1422.      * 然后把这个修改后的数字值返回 
  1423.      * 如果key对应的value不是数值 抛出 ERR value is not an integer or out of range 
  1424.      */  
  1425.     public Long decrBy(String key, long integer) {  
  1426.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1427.         long result = 0;  
  1428.         try {  
  1429.              result = shardedJedis.decrBy(key,integer);  
  1430.             return result;  
  1431.         } catch (Exception e2) {  
  1432.             returnBrokenResource(shardedJedis);  
  1433.             e2.printStackTrace();  
  1434.         }finally{  
  1435.             returnResource(key,shardedJedis);  
  1436.         }  
  1437.         return result;  
  1438.     }  
  1439.     /** 
  1440.      * Long incr(String key); 
  1441.      * 将key中所储存的数字值加1  注:key中存的必须是64位(long)整数,可以是负数 
  1442.      * 然后把这个修改后的数字值返回 
  1443.      * 如果key不存在 key的值会被初始化为0然后执行incr() 也就是-1 
  1444.      * 如果key对应的value不是数值 抛出 ERR value is not an integer or out of range 
  1445.      */  
  1446.     public Long incr(String key) {  
  1447.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1448.         long result = 0;  
  1449.         try {  
  1450.              result = shardedJedis.incr(key);  
  1451.             return result;  
  1452.         } catch (Exception e2) {  
  1453.             returnBrokenResource(shardedJedis);  
  1454.             e2.printStackTrace();  
  1455.         }finally{  
  1456.             returnResource(key,shardedJedis);  
  1457.         }  
  1458.         return result;  
  1459.     }  
  1460.     /** 
  1461.      * Long incrBy(String key,long integer); 
  1462.      * 将key所储存的值加上integer 
  1463.      * 如果key不存在,那么key的值会先被初始化为0,然后执行incrBy操作 
  1464.      * 然后把这个修改后的数字值返回 
  1465.      * 如果key对应的value不是数值 抛出 ERR value is not an integer or out of range 
  1466.      */  
  1467.     public Long incrBy(String key, long integer) {  
  1468.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1469.         long result = 0;  
  1470.         try {  
  1471.              result = shardedJedis.incrBy(key, integer);  
  1472.             return result;  
  1473.         } catch (Exception e2) {  
  1474.             returnBrokenResource(shardedJedis);  
  1475.             e2.printStackTrace();  
  1476.         }finally{  
  1477.             returnResource(key,shardedJedis);  
  1478.         }  
  1479.         return result;  
  1480.     }  
  1481.     /** 
  1482.      * Long ttl(String key); 
  1483.      * 以秒为单位,返回给定 key 的剩余生存时间。 
  1484.      * 当 key 不存在或没有设置生存时间时,返回 -1 。 
  1485.      * 否则,返回 key 的剩余生存时间(以秒为单位)。 
  1486.      */  
  1487.     public Long ttl(String key) {  
  1488.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1489.         long result = 0;  
  1490.         try {  
  1491.              result = shardedJedis.ttl(key.getBytes());  
  1492.             return result;  
  1493.         } catch (Exception e2) {  
  1494.             returnBrokenResource( shardedJedis);  
  1495.             e2.printStackTrace();  
  1496.         }finally{  
  1497.             returnResource(key,shardedJedis);  
  1498.         }  
  1499.         return result;  
  1500.     }  
  1501.     /** 
  1502.      * 判断key是不是已经存在 
  1503.      * @param key 
  1504.      * 存在 返回true 
  1505.      * 否则 返回false 
  1506.      */  
  1507.     public boolean exists(String key) {  
  1508.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1509.         boolean result = false;  
  1510.         try {  
  1511.              result = shardedJedis.exists(key.getBytes());  
  1512.             return result;  
  1513.         } catch (Exception e2) {  
  1514.             returnBrokenResource(shardedJedis);  
  1515.             e2.printStackTrace();  
  1516.         }finally{  
  1517.             returnResource(key,shardedJedis);  
  1518.         }  
  1519.         return result;  
  1520.     }  
  1521.     /** 
  1522.      * TYPE 
  1523.      * public String type(String key) 
  1524.      * 描述:返回key所对应的value的类型。 
  1525.      * 返回值:none - key不存在 
  1526.      *      string - 字符串 
  1527.      *      list - 列表 
  1528.      *      set - 集合 
  1529.      *      zset - 有序集 
  1530.      *      hash - 哈希表 
  1531.      */  
  1532.     public String type(String key) {  
  1533.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1534.         String result = null;  
  1535.         try {  
  1536.              result = shardedJedis.type(key.getBytes());  
  1537.             return result;  
  1538.         } catch (Exception e2) {  
  1539.             returnBrokenResource(shardedJedis);  
  1540.             e2.printStackTrace();  
  1541.         }finally{  
  1542.             returnResource(key,shardedJedis);  
  1543.         }  
  1544.         return result;  
  1545.     }  
  1546.     /** 
  1547.      * Long expire(String key,int seconds); 
  1548.      * 给指定的key设置生存时间 以秒为单位 当key过期时,会被自动删除 
  1549.      * 如果key不存在 返回0 
  1550.      * 设置成功返回1 
  1551.      * 过期时间的延迟在1秒钟之内,也就是,就算key已经过期,但它还是可能在1秒之内被访问到 
  1552.      */  
  1553.     public Long expire(String key, int seconds) {  
  1554.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1555.         long result = 0;  
  1556.         try {  
  1557.              result = shardedJedis.expire(key.getBytes(), seconds);  
  1558.             return result;  
  1559.         } catch (Exception e2) {  
  1560.             returnBrokenResource(shardedJedis);  
  1561.             e2.printStackTrace();  
  1562.         }finally{  
  1563.             returnResource(key,shardedJedis);  
  1564.         }  
  1565.         return result;  
  1566.     }  
  1567.     /** 
  1568.      * long expireAt(String key,long timestamp); 
  1569.      * expireAt作用和expire类似,都用于为key设置生存时间、 
  1570.      * 但是expireAt接受的时间参数是时间戳 即毫秒(ms) 
  1571.      * 如果设置生存时间成功,返回1 
  1572.      * 当key不存在或没办法设置生存时间  返回0 
  1573.      */  
  1574.     public Long expireAt(String key, long timestamp) {  
  1575.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1576.         long result = 0;  
  1577.         try {  
  1578.             result = shardedJedis.expireAt(key.getBytes(), timestamp);  
  1579.             return result;  
  1580.         } catch (Exception e2) {  
  1581.             returnBrokenResource(shardedJedis);  
  1582.             e2.printStackTrace();  
  1583.         }finally{  
  1584.             returnResource(key,shardedJedis);  
  1585.         }  
  1586.         return result;  
  1587.     }  
  1588.   
  1589.     public void lpush(String key, List<? extends Serializable> value) {  
  1590.         // TODO Auto-generated method stub  
  1591.           
  1592.     }  
  1593.   
  1594.     public void rpush(String key, List<? extends Serializable> value) {  
  1595.         // TODO Auto-generated method stub  
  1596.           
  1597.     }  
  1598.   
  1599.     public void sadd(String key, Set<? extends Serializable> values) {  
  1600.         // TODO Auto-generated method stub  
  1601.           
  1602.     }  
  1603.   
  1604.     public Set<String> keys(Integer idKey, String pattern) {  
  1605.         String key = new String(idKey+"");  
  1606.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1607.         Set<String> keys = null;  
  1608.         try{  
  1609.             Jedis shard = shardedJedis.getShard(key);  
  1610.             keys = shard.keys(pattern);  
  1611.             if(keys==null){  
  1612.                 return new HashSet<String>();  
  1613.             }  
  1614.         }catch (Exception e2) {  
  1615.             returnResource(key,shardedJedis);  
  1616.             e2.printStackTrace();  
  1617.         }finally{  
  1618.             returnResource(key,shardedJedis);  
  1619.         }  
  1620.         return keys;  
  1621.     }  
  1622.   
  1623.     /** 
  1624.      * 范围查找 + 分页  
  1625.      * 2013-11-13, 下午04:15:20 
  1626.      * 方法描述: 
  1627.      * @param key 
  1628.      * @param min 
  1629.      * @param max 
  1630.      * @param offset 
  1631.      * @param count 
  1632.      * @return 
  1633.      */  
  1634.     public Set<? extends Serializable> zrangeByScore(String key,  
  1635.             double min, double max, int offset, int count) {  
  1636.         ShardedJedis shardedJedis = getShardedJedis(key);  
  1637.         Set set = new LinkedHashSet();  
  1638.         try {  
  1639.             Set<byte[]> bs = shardedJedis.zrangeByScore(key.getBytes(),min,max,offset,count);  
  1640.             for (Iterator<byte[]> iterator = bs.iterator(); iterator.hasNext();) {  
  1641.                 set.add(byteToObject(iterator.next()));  
  1642.             }  
  1643.             return set;  
  1644.         }  catch (Exception e2) {  
  1645.             returnBrokenResource( shardedJedis);  
  1646.             e2.printStackTrace();  
  1647.         }finally{  
  1648.             returnResource(key,shardedJedis);  
  1649.         }  
  1650.         return null;  
  1651.     }  
  1652.   
  1653.   
  1654. }  

redis的配置问题:

daemonize    如果需要在后台运行,把该项改为yes  

pidfile      配置多个pid的地址 默认在/var/run/redis.pid

bind 绑定ip,设置后只接受来自该ip的请求

port 监听端口,默认为6379

timeout      设置客户端连接时的超时时间,单位为秒

loglevel     分为4级,debug、verbose、notice、warning

logfile      配置log文件地址

databases    设置数据库的个数,默认使用的数据库为0

save         设置redis进行数据库镜像的频率

rdbcompression    在进行镜像备份时,是否进行压缩

Dbfilename        镜像备份文件的文件名

Dir   数据库镜像备份的文件放置路径

Slaveof     设置数据库为其他数据库的从数据库

Masterauth 主数据库连接需要的密码验证

Requirepass     设置登录时需要使用的密码

Maxclients 限制同时连接的客户数量

Maxmemory 设置redis能够使用的最大内存

Appendonly 开启append only模式

以下了解即可:

Appendfsync 设置对appendonly.aof文件同步的频率

vm-enabled 是否开启虚拟内存支持

vm-swap-file 设置虚拟内存的交换文件路径

vm-max-memory 设置redis使用的最大物理内存大小

vm-page-size 设置虚拟内存的页大小

vm-pages 设置交换文件的总的page数量

vm-max-threads 设置VM IO同时使用的线程数量

Glueoutputbuf 把小的输出缓存存放在一起

hash-max-zipmap-entries 设置hash的临界值

Activerehashing 重新hash




补充(20170828):

再次回到redis,在工作中会碰到这样一个问题,究竟在何种场景使用redis?如何使用效率最高?

下面为大家一一解答:

1.何种场景?

一个充分的例子是 用来存储比如一个新闻网页最新的10条信息,一般我们都是 select * from news order by update_time  desc  limit 10;(找到最新的10条信息)

但是这样的效率是很低的,所以,我们放入redis中:

LPUSH latest.comments <ID> 

放入一个List中或者其他的存储结构,就可以快速查询了

2.如何使效率最高

string:用来存储基本的key-value类型的数据(理论上所有的数据都可以通过这种方式存储,但是为了效率以及操作的便利性,这里只存储最基本的k-v数据,比方说一个user信息,里面有user_id,user_name,user_sex等等,这里如果用key-value来存储,那么,就会出现很多的键(userId:1,userId:2等等),这样多了就会造成内存的大面积浪费,所以应当采取其他的存储结构)

hash:他的value是hashmap类型的,数据量少的时候是另外一种类型,如果多的话就会变成hashmap类型,利用hashmap类型可以很方便的解决上面例子中的问题

List: 主要用于队列和栈的储存结构,存储一系列的数据,比如说分页查询的10条数据

set:  和上面的一样,但是有一点不同,set可以除重,这是更高级的用法

zset:有序的set,在存储进redis的时候就会被存储为有序的,效率自然是杠杠滴~

另外还有Pub/sub(订阅/发布)的模式,可以用来做多人聊天,一个人发布信息,让这个群组的所有人接受。

转载:https://blog.csdn.net/yzj479622672/article/details/77479032


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值