zoukankan      html  css  js  c++  java
  • Redis连接池Lettuce Jedis 区别

    Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server。

    pring boot框架中已经集成了redis,在1.x.x的版本时默认使用的jedis客户端,现在是2.x.x版本默认使用的lettuce客户端。

    Jedis
    Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接

    Lettuce
    Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
    lettuce主要利用netty实现与redis的同步和异步通信。

    转载链接:https://blog.csdn.net/weixin_37264997/article/details/90026602

    SpringBoot集成Jedis:

     1 <dependency>
     2       <groupId>org.springframework.boot</groupId>
     3       <artifactId>spring-boot-starter-data-redis</artifactId>
     4 </dependency>
     5 
     6 <dependency>
     7        <groupId>redis.clients</groupId>
     8        <artifactId>jedis</artifactId>
     9        <version>2.9.0</version>
    10 </dependency>
    JedisConfig配置类
     1 import lombok.extern.slf4j.Slf4j;
     2 import org.springframework.beans.factory.annotation.Value;
     3 import org.springframework.context.annotation.Bean;
     4 import org.springframework.context.annotation.Configuration;
     5 import redis.clients.jedis.JedisPool;
     6 import redis.clients.jedis.JedisPoolConfig;
     7 
     8 @Configuration
     9 @Slf4j
    10 public class JedisConfig {
    11 
    12     @Value("${spring.redis.host}")
    13     private String host;
    14 
    15     @Value("${spring.redis.port}")
    16     private int port;
    17 
    18     @Value("${spring.redis.timeout}")
    19     private int timeout;
    20 
    21     @Value("${spring.redis.jedis.pool.max-idle}")
    22     private int maxIdle;
    23 
    24     @Value("${spring.redis.jedis.pool.max-wait}")
    25     private long maxWaitMillis;
    26 
    27     @Value("${spring.redis.password}")
    28     private String password;
    29 
    30     @Value("${spring.redis.block-when-exhausted}")
    31     private boolean  blockWhenExhausted;
    32 
    33     @Bean
    34     public JedisPool redisPoolFactory()  throws Exception{
    35         log.info("JedisPool注入成功!!");
    36         log.info("redis地址:" + host + ":" + port);
    37         JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    38         jedisPoolConfig.setMaxIdle(maxIdle);
    39         jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
    40         // 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
    41         jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted);
    42         // 是否启用pool的jmx管理功能, 默认true
    43         jedisPoolConfig.setJmxEnabled(true);
    44         /**
    45          * 這裏password參數填null,不然會報錯(jedis連接數據庫沒設置密碼填null,填其他回報這個錯):
    46          * Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set
    47          */
    48         JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, null);
    49         return jedisPool;
    50     }
    51 
    52 }
    SerializeUtil
     1 import lombok.extern.slf4j.Slf4j;
     2 import org.springframework.stereotype.Component;
     3 import java.io.*;
     4 
     5 @Component
     6 @Slf4j
     7 public class SerializeUtil {
     8 
     9     // 序列化
    10     public static byte[] serialize(Object object) {
    11 
    12         ObjectOutputStream oos = null;
    13         ByteArrayOutputStream baos = null;
    14         byte[] bytes = null;
    15         try {
    16             baos = new ByteArrayOutputStream();
    17             oos = new ObjectOutputStream(baos);
    18             oos.writeObject(object);
    19             bytes = baos.toByteArray();
    20         } catch (Exception e) {
    21             System.err.println("序列化失败" + e.getMessage());
    22         }
    23         return bytes;
    24     }
    25 
    26     // 反序列化
    27     public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
    28 
    29         ByteArrayInputStream bais = null;
    30         ObjectInputStream ois = null;
    31         try {
    32             bais = new ByteArrayInputStream(bytes);
    33             ois = new ObjectInputStream(bais);
    34         } catch (Exception e) {
    35             System.err.println("反序列化失败" + e.getMessage());
    36         }
    37         return ois.readObject();
    38     }
    39 
    40 }
    JedisUtil
       1 package com.example.redis.util;
       2 
       3 import lombok.extern.slf4j.Slf4j;
       4 import org.springframework.stereotype.Component;
       5 import java.io.ByteArrayInputStream;
       6 import java.io.ByteArrayOutputStream;
       7 import java.io.ObjectInputStream;
       8 import java.io.ObjectOutputStream;
       9 import java.util.List;
      10 import java.util.Map;
      11 import java.util.Set;
      12 import org.springframework.beans.factory.annotation.Autowired;
      13 import redis.clients.jedis.BinaryClient.LIST_POSITION;
      14 import redis.clients.jedis.Jedis;
      15 import redis.clients.jedis.JedisPool;
      16 import redis.clients.jedis.SortingParams;
      17 
      18 @Component
      19 @Slf4j
      20 public class JedisUtil {
      21 
      22     @Autowired
      23     private JedisPool jedisPool;
      24 
      25     /**
      26      * 通过key获取储存在redis中的value
      27      * 并释放连接
      28      * @param key
      29      * @param indexdb 选择redis库 0-15
      30      * @return 成功返回value 失败返回null
      31      */
      32     public String get(String key,int indexdb) {
      33         Jedis jedis = null;
      34         String value = null;
      35         try {
      36             jedis = jedisPool.getResource();
      37             jedis.select(indexdb);
      38             value = jedis.get(key);
      39             log.info(value);
      40         } catch (Exception e) {
      41 
      42             log.error(e.getMessage());
      43         } finally {
      44             returnResource(jedisPool, jedis);
      45         }
      46         return value;
      47     }
      48 
      49     /**
      50      * 通过key获取储存在redis中的value
      51      * 并释放连接
      52      * @param key
      53      * @param indexdb 选择redis库 0-15
      54      * @return 成功返回value 失败返回null
      55      */
      56     public byte[] get(byte[] key,int indexdb) {
      57         Jedis jedis = null;
      58         byte[] value = null;
      59         try {
      60             jedis = jedisPool.getResource();
      61             jedis.select(indexdb);
      62             value = jedis.get(key);
      63         } catch (Exception e) {
      64 
      65             log.error(e.getMessage());
      66         } finally {
      67             returnResource(jedisPool, jedis);
      68         }
      69         return value;
      70     }
      71     /**
      72      * 向redis存入key和value,并释放连接资源
      73      * 如果key已经存在 则覆盖
      74      * @param key
      75      * @param value
      76      * @param indexdb 选择redis库 0-15
      77      * @return 成功 返回OK 失败返回 0
      78      */
      79     public String set(String key, String value,int indexdb) {
      80         Jedis jedis = null;
      81         try {
      82             jedis = jedisPool.getResource();
      83             jedis.select(indexdb);
      84             return jedis.set(key, value);
      85         } catch (Exception e) {
      86 
      87             log.error(e.getMessage());
      88             return "0";
      89         } finally {
      90             returnResource(jedisPool, jedis);
      91         }
      92     }
      93     /**
      94      * 向redis存入key和value,并释放连接资源
      95      * 如果key已经存在 则覆盖
      96      * @param key
      97      * @param value
      98      * @param indexdb 选择redis库 0-15
      99      * @return 成功 返回OK 失败返回 0
     100      */
     101     public String set(byte[] key, byte[] value,int indexdb) {
     102         Jedis jedis = null;
     103         try {
     104             jedis = jedisPool.getResource();
     105             jedis.select(indexdb);
     106             return jedis.set(key, value);
     107         } catch (Exception e) {
     108 
     109             log.error(e.getMessage());
     110             return "0";
     111         } finally {
     112             returnResource(jedisPool, jedis);
     113         }
     114     }
     115     /**
     116      * 删除指定的key,也可以传入一个包含key的数组
     117      * @param keys 一个key 也可以使 string 数组
     118      * @return 返回删除成功的个数
     119      */
     120     public Long del(String... keys) {
     121         Jedis jedis = null;
     122         try {
     123             jedis = jedisPool.getResource();
     124             return jedis.del(keys);
     125         } catch (Exception e) {
     126 
     127             log.error(e.getMessage());
     128             return 0L;
     129         } finally {
     130             returnResource(jedisPool, jedis);
     131         }
     132     }
     133     /**
     134      * 删除指定的key,也可以传入一个包含key的数组
     135      * @param indexdb 选择redis库 0-15
     136      * @param keys 一个key 也可以使 string 数组
     137      * @return 返回删除成功的个数
     138      */
     139     public Long del(int indexdb,String... keys) {
     140         Jedis jedis = null;
     141         try {
     142             jedis = jedisPool.getResource();
     143             jedis.select(indexdb);
     144             return jedis.del(keys);
     145         } catch (Exception e) {
     146 
     147             log.error(e.getMessage());
     148             return 0L;
     149         } finally {
     150             returnResource(jedisPool, jedis);
     151         }
     152     }
     153     /**
     154      * 删除指定的key,也可以传入一个包含key的数组
     155      * @param indexdb 选择redis库 0-15
     156      * @param keys 一个key 也可以使 string 数组
     157      * @return 返回删除成功的个数
     158      */
     159     public Long del(int indexdb,byte[]... keys) {
     160         Jedis jedis = null;
     161         try {
     162             jedis = jedisPool.getResource();
     163             jedis.select(indexdb);
     164             return jedis.del(keys);
     165         } catch (Exception e) {
     166 
     167             log.error(e.getMessage());
     168             return 0L;
     169         } finally {
     170             returnResource(jedisPool, jedis);
     171         }
     172     }
     173     /**
     174      * 通过key向指定的value值追加值
     175      * @param key
     176      * @param str
     177      * @return 成功返回 添加后value的长度 失败 返回 添加的 value 的长度 异常返回0L
     178      */
     179     public Long append(String key, String str) {
     180         Jedis jedis = null;
     181         Long res = null;
     182         try {
     183             jedis = jedisPool.getResource();
     184             res = jedis.append(key, str);
     185         } catch (Exception e) {
     186 
     187             log.error(e.getMessage());
     188             return 0L;
     189         } finally {
     190             returnResource(jedisPool, jedis);
     191         }
     192         return res;
     193     }
     194 
     195     /**
     196      * 判断key是否存在
     197      * @param key
     198      * @return true OR false
     199      */
     200     public Boolean exists(String key) {
     201         Jedis jedis = null;
     202         try {
     203             jedis = jedisPool.getResource();
     204             return jedis.exists(key);
     205         } catch (Exception e) {
     206 
     207             log.error(e.getMessage());
     208             return false;
     209         } finally {
     210             returnResource(jedisPool, jedis);
     211         }
     212     }
     213 
     214     /**
     215      * 清空当前数据库中的所有 key,此命令从不失败。
     216      * @return 总是返回 OK
     217      */
     218     public String flushDB() {
     219         Jedis jedis = null;
     220         try {
     221             jedis = jedisPool.getResource();
     222             return jedis.flushDB();
     223         } catch (Exception e) {
     224             log.error(e.getMessage());
     225         } finally {
     226             returnResource(jedisPool, jedis);
     227         }
     228         return null;
     229     }
     230 
     231     /**
     232      * 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
     233      * @param key
     234      * @param value
     235      *            过期时间,单位:秒
     236      * @return 成功返回1 如果存在 和 发生异常 返回 0
     237      */
     238     public Long expire(String key, int value, int indexdb) {
     239         Jedis jedis = null;
     240         try {
     241             jedis = jedisPool.getResource();
     242             jedis.select(indexdb);
     243             return jedis.expire(key, value);
     244         } catch (Exception e) {
     245             log.error(e.getMessage());
     246             return 0L;
     247         } finally {
     248             returnResource(jedisPool, jedis);
     249         }
     250     }
     251 
     252     /**
     253      * <p>
     254      * 以秒为单位,返回给定 key 的剩余生存时间
     255      * </p>
     256      *
     257      * @param key
     258      * @return 当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。否则,以秒为单位,返回 key
     259      *         的剩余生存时间。 发生异常 返回 0
     260      */
     261     public Long ttl(String key,int indexdb) {
     262         Jedis jedis = null;
     263         try {
     264             jedis = jedisPool.getResource();
     265             jedis.select(indexdb);
     266             return jedis.ttl(key);
     267         } catch (Exception e) {
     268 
     269             log.error(e.getMessage());
     270             return 0L;
     271         } finally {
     272             returnResource(jedisPool, jedis);
     273         }
     274     }
     275 
     276     /**
     277      * <p>
     278      * 移除给定 key 的生存时间,将这个 key 从『易失的』(带生存时间 key )转换成『持久的』(一个不带生存时间、永不过期的 key )
     279      * </p>
     280      *
     281      * @param key
     282      * @return 当生存时间移除成功时,返回 1 .如果 key 不存在或 key 没有设置生存时间,返回 0 , 发生异常 返回 -1
     283      */
     284     public Long persist(String key) {
     285         Jedis jedis = null;
     286         try {
     287             jedis = jedisPool.getResource();
     288             return jedis.persist(key);
     289         } catch (Exception e) {
     290 
     291             log.error(e.getMessage());
     292             return -1L;
     293         } finally {
     294             returnResource(jedisPool, jedis);
     295         }
     296     }
     297 
     298     /**
     299      * <p>
     300      * 新增key,并将 key 的生存时间 (以秒为单位)
     301      * </p>
     302      *
     303      * @param key
     304      * @param seconds
     305      *            生存时间 单位:秒
     306      * @param value
     307      * @return 设置成功时返回 OK 。当 seconds 参数不合法时,返回一个错误。
     308      */
     309     public String setex(String key, int seconds, String value) {
     310         Jedis jedis = null;
     311         try {
     312             jedis = jedisPool.getResource();
     313             return jedis.setex(key, seconds, value);
     314         } catch (Exception e) {
     315 
     316             log.error(e.getMessage());
     317         } finally {
     318             returnResource(jedisPool, jedis);
     319         }
     320         return null;
     321     }
     322 
     323     /**
     324      * <p>
     325      * 设置key value,如果key已经存在则返回0,nx==> not exist
     326      * </p>
     327      *
     328      * @param key
     329      * @param value
     330      * @return 成功返回1 如果存在 和 发生异常 返回 0
     331      */
     332     public Long setnx(String key, String value) {
     333         Jedis jedis = null;
     334         try {
     335             jedis = jedisPool.getResource();
     336             return jedis.setnx(key, value);
     337         } catch (Exception e) {
     338 
     339             log.error(e.getMessage());
     340             return 0L;
     341         } finally {
     342             returnResource(jedisPool, jedis);
     343         }
     344     }
     345 
     346     /**
     347      * <p>
     348      * 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
     349      * </p>
     350      * <p>
     351      * 当 key 存在但不是字符串类型时,返回一个错误。
     352      * </p>
     353      *
     354      * @param key
     355      * @param value
     356      * @return 返回给定 key 的旧值。当 key 没有旧值时,也即是, key 不存在时,返回 nil
     357      */
     358     public String getSet(String key, String value) {
     359         Jedis jedis = null;
     360         try {
     361             jedis = jedisPool.getResource();
     362             return jedis.getSet(key, value);
     363         } catch (Exception e) {
     364 
     365             log.error(e.getMessage());
     366         } finally {
     367             returnResource(jedisPool, jedis);
     368         }
     369         return null;
     370     }
     371 
     372     /**
     373      * <p>
     374      * 设置key value并制定这个键值的有效期
     375      * </p>
     376      *
     377      * @param key
     378      * @param value
     379      * @param seconds
     380      *            单位:秒
     381      * @return 成功返回OK 失败和异常返回null
     382      */
     383     public String setex(String key, String value, int seconds) {
     384         Jedis jedis = null;
     385         String res = null;
     386         try {
     387             jedis = jedisPool.getResource();
     388             res = jedis.setex(key, seconds, value);
     389         } catch (Exception e) {
     390 
     391             log.error(e.getMessage());
     392         } finally {
     393             returnResource(jedisPool, jedis);
     394         }
     395         return res;
     396     }
     397 
     398     /**
     399      * <p>
     400      * 通过key 和offset 从指定的位置开始将原先value替换
     401      * </p>
     402      * <p>
     403      * 下标从0开始,offset表示从offset下标开始替换
     404      * </p>
     405      * <p>
     406      * 如果替换的字符串长度过小则会这样
     407      * </p>
     408      * <p>
     409      * example:
     410      * </p>
     411      * <p>
     412      * value : bigsea@zto.cn
     413      * </p>
     414      * <p>
     415      * str : abc
     416      * </p>
     417      * <P>
     418      * 从下标7开始替换 则结果为
     419      * </p>
     420      * <p>
     421      * RES : bigsea.abc.cn
     422      * </p>
     423      *
     424      * @param key
     425      * @param str
     426      * @param offset
     427      *            下标位置
     428      * @return 返回替换后 value 的长度
     429      */
     430     public Long setrange(String key, String str, int offset) {
     431         Jedis jedis = null;
     432         try {
     433             jedis = jedisPool.getResource();
     434             return jedis.setrange(key, offset, str);
     435         } catch (Exception e) {
     436 
     437             log.error(e.getMessage());
     438             return 0L;
     439         } finally {
     440             returnResource(jedisPool, jedis);
     441         }
     442     }
     443 
     444     /**
     445      * <p>
     446      * 通过批量的key获取批量的value
     447      * </p>
     448      *
     449      * @param keys
     450      *            string数组 也可以是一个key
     451      * @return 成功返回value的集合, 失败返回null的集合 ,异常返回空
     452      */
     453     public List<String> mget(String... keys) {
     454         Jedis jedis = null;
     455         List<String> values = null;
     456         try {
     457             jedis = jedisPool.getResource();
     458             values = jedis.mget(keys);
     459         } catch (Exception e) {
     460 
     461             log.error(e.getMessage());
     462         } finally {
     463             returnResource(jedisPool, jedis);
     464         }
     465         return values;
     466     }
     467 
     468     /**
     469      * <p>
     470      * 批量的设置key:value,可以一个
     471      * </p>
     472      * <p>
     473      * example:
     474      * </p>
     475      * <p>
     476      * obj.mset(new String[]{"key2","value1","key2","value2"})
     477      * </p>
     478      *
     479      * @param keysvalues
     480      * @return 成功返回OK 失败 异常 返回 null
     481      *
     482      */
     483     public String mset(String... keysvalues) {
     484         Jedis jedis = null;
     485         String res = null;
     486         try {
     487             jedis = jedisPool.getResource();
     488             res = jedis.mset(keysvalues);
     489         } catch (Exception e) {
     490 
     491             log.error(e.getMessage());
     492         } finally {
     493             returnResource(jedisPool, jedis);
     494         }
     495         return res;
     496     }
     497 
     498     /**
     499      * <p>
     500      * 批量的设置key:value,可以一个,如果key已经存在则会失败,操作会回滚
     501      * </p>
     502      * <p>
     503      * example:
     504      * </p>
     505      * <p>
     506      * obj.msetnx(new String[]{"key2","value1","key2","value2"})
     507      * </p>
     508      *
     509      * @param keysvalues
     510      * @return 成功返回1 失败返回0
     511      */
     512     public Long msetnx(String... keysvalues) {
     513         Jedis jedis = null;
     514         Long res = 0L;
     515         try {
     516             jedis = jedisPool.getResource();
     517             res = jedis.msetnx(keysvalues);
     518         } catch (Exception e) {
     519 
     520             log.error(e.getMessage());
     521         } finally {
     522             returnResource(jedisPool, jedis);
     523         }
     524         return res;
     525     }
     526 
     527     /**
     528      * <p>
     529      * 设置key的值,并返回一个旧值
     530      * </p>
     531      *
     532      * @param key
     533      * @param value
     534      * @return 旧值 如果key不存在 则返回null
     535      */
     536     public String getset(String key, String value) {
     537         Jedis jedis = null;
     538         String res = null;
     539         try {
     540             jedis = jedisPool.getResource();
     541             res = jedis.getSet(key, value);
     542         } catch (Exception e) {
     543 
     544             log.error(e.getMessage());
     545         } finally {
     546             returnResource(jedisPool, jedis);
     547         }
     548         return res;
     549     }
     550 
     551     /**
     552      * <p>
     553      * 通过下标 和key 获取指定下标位置的 value
     554      * </p>
     555      *
     556      * @param key
     557      * @param startOffset
     558      *            开始位置 从0 开始 负数表示从右边开始截取
     559      * @param endOffset
     560      * @return 如果没有返回null
     561      */
     562     public String getrange(String key, int startOffset, int endOffset) {
     563         Jedis jedis = null;
     564         String res = null;
     565         try {
     566             jedis = jedisPool.getResource();
     567             res = jedis.getrange(key, startOffset, endOffset);
     568         } catch (Exception e) {
     569 
     570             log.error(e.getMessage());
     571         } finally {
     572             returnResource(jedisPool, jedis);
     573         }
     574         return res;
     575     }
     576 
     577     /**
     578      * <p>
     579      * 通过key 对value进行加值+1操作,当value不是int类型时会返回错误,当key不存在是则value为1
     580      * </p>
     581      *
     582      * @param key
     583      * @return 加值后的结果
     584      */
     585     public Long incr(String key) {
     586         Jedis jedis = null;
     587         Long res = null;
     588         try {
     589             jedis = jedisPool.getResource();
     590             res = jedis.incr(key);
     591         } catch (Exception e) {
     592 
     593             log.error(e.getMessage());
     594         } finally {
     595             returnResource(jedisPool, jedis);
     596         }
     597         return res;
     598     }
     599 
     600     /**
     601      * <p>
     602      * 通过key给指定的value加值,如果key不存在,则这是value为该值
     603      * </p>
     604      *
     605      * @param key
     606      * @param integer
     607      * @return
     608      */
     609     public Long incrBy(String key, Long integer) {
     610         Jedis jedis = null;
     611         Long res = null;
     612         try {
     613             jedis = jedisPool.getResource();
     614             res = jedis.incrBy(key, integer);
     615         } catch (Exception e) {
     616 
     617             log.error(e.getMessage());
     618         } finally {
     619             returnResource(jedisPool, jedis);
     620         }
     621         return res;
     622     }
     623 
     624     /**
     625      * <p>
     626      * 对key的值做减减操作,如果key不存在,则设置key为-1
     627      * </p>
     628      *
     629      * @param key
     630      * @return
     631      */
     632     public Long decr(String key) {
     633         Jedis jedis = null;
     634         Long res = null;
     635         try {
     636             jedis = jedisPool.getResource();
     637             res = jedis.decr(key);
     638         } catch (Exception e) {
     639 
     640             log.error(e.getMessage());
     641         } finally {
     642             returnResource(jedisPool, jedis);
     643         }
     644         return res;
     645     }
     646 
     647     /**
     648      * <p>
     649      * 减去指定的值
     650      * </p>
     651      *
     652      * @param key
     653      * @param integer
     654      * @return
     655      */
     656     public Long decrBy(String key, Long integer) {
     657         Jedis jedis = null;
     658         Long res = null;
     659         try {
     660             jedis = jedisPool.getResource();
     661             res = jedis.decrBy(key, integer);
     662         } catch (Exception e) {
     663 
     664             log.error(e.getMessage());
     665         } finally {
     666             returnResource(jedisPool, jedis);
     667         }
     668         return res;
     669     }
     670 
     671     /**
     672      * <p>
     673      * 通过key获取value值的长度
     674      * </p>
     675      *
     676      * @param key
     677      * @return 失败返回null
     678      */
     679     public Long serlen(String key) {
     680         Jedis jedis = null;
     681         Long res = null;
     682         try {
     683             jedis = jedisPool.getResource();
     684             res = jedis.strlen(key);
     685         } catch (Exception e) {
     686 
     687             log.error(e.getMessage());
     688         } finally {
     689             returnResource(jedisPool, jedis);
     690         }
     691         return res;
     692     }
     693 
     694     /**
     695      * <p>
     696      * 通过key给field设置指定的值,如果key不存在,则先创建
     697      * </p>
     698      *
     699      * @param key
     700      * @param field
     701      *            字段
     702      * @param value
     703      * @return 如果存在返回0 异常返回null
     704      */
     705     public Long hset(String key, String field, String value) {
     706         Jedis jedis = null;
     707         Long res = null;
     708         try {
     709             jedis = jedisPool.getResource();
     710             res = jedis.hset(key, field, value);
     711         } catch (Exception e) {
     712 
     713             log.error(e.getMessage());
     714         } finally {
     715             returnResource(jedisPool, jedis);
     716         }
     717         return res;
     718     }
     719 
     720     /**
     721      * <p>
     722      * 通过key给field设置指定的值,如果key不存在则先创建,如果field已经存在,返回0
     723      * </p>
     724      *
     725      * @param key
     726      * @param field
     727      * @param value
     728      * @return
     729      */
     730     public Long hsetnx(String key, String field, String value) {
     731         Jedis jedis = null;
     732         Long res = null;
     733         try {
     734             jedis = jedisPool.getResource();
     735             res = jedis.hsetnx(key, field, value);
     736         } catch (Exception e) {
     737 
     738             log.error(e.getMessage());
     739         } finally {
     740             returnResource(jedisPool, jedis);
     741         }
     742         return res;
     743     }
     744 
     745     /**
     746      * <p>
     747      * 通过key同时设置 hash的多个field
     748      * </p>
     749      *
     750      * @param key
     751      * @param hash
     752      * @return 返回OK 异常返回null
     753      */
     754     public String hmset(String key, Map<String, String> hash, int indexdb) {
     755         Jedis jedis = null;
     756         String res = null;
     757         try {
     758             jedis = jedisPool.getResource();
     759             jedis.select(indexdb);
     760             res = jedis.hmset(key, hash);
     761         } catch (Exception e) {
     762 
     763             log.error(e.getMessage());
     764         } finally {
     765             returnResource(jedisPool, jedis);
     766         }
     767         return res;
     768     }
     769 
     770     /**
     771      * <p>
     772      * 通过key 和 field 获取指定的 value
     773      * </p>
     774      *
     775      * @param key
     776      * @param field
     777      * @return 没有返回null
     778      */
     779     public String hget(String key, String field) {
     780         Jedis jedis = null;
     781         String res = null;
     782         try {
     783             jedis = jedisPool.getResource();
     784             res = jedis.hget(key, field);
     785         } catch (Exception e) {
     786 
     787             log.error(e.getMessage());
     788         } finally {
     789             returnResource(jedisPool, jedis);
     790         }
     791         return res;
     792     }
     793 
     794     /**
     795      * <p>
     796      * 通过key 和 fields 获取指定的value 如果没有对应的value则返回null
     797      * </p>
     798      *
     799      * @param key
     800      * @param fields
     801      *            可以使 一个String 也可以是 String数组
     802      * @return
     803      */
     804     public List<String> hmget(String key, int indexdb, String... fields) {
     805         Jedis jedis = null;
     806         List<String> res = null;
     807         try {
     808             jedis = jedisPool.getResource();
     809             jedis.select(indexdb);
     810             res = jedis.hmget(key, fields);
     811         } catch (Exception e) {
     812 
     813             log.error(e.getMessage());
     814         } finally {
     815             returnResource(jedisPool, jedis);
     816         }
     817         return res;
     818     }
     819 
     820     /**
     821      * <p>
     822      * 通过key给指定的field的value加上给定的值
     823      * </p>
     824      *
     825      * @param key
     826      * @param field
     827      * @param value
     828      * @return
     829      */
     830     public Long hincrby(String key, String field, Long value) {
     831         Jedis jedis = null;
     832         Long res = null;
     833         try {
     834             jedis = jedisPool.getResource();
     835             res = jedis.hincrBy(key, field, value);
     836         } catch (Exception e) {
     837 
     838             log.error(e.getMessage());
     839         } finally {
     840             returnResource(jedisPool, jedis);
     841         }
     842         return res;
     843     }
     844 
     845     /**
     846      * <p>
     847      * 通过key和field判断是否有指定的value存在
     848      * </p>
     849      *
     850      * @param key
     851      * @param field
     852      * @return
     853      */
     854     public Boolean hexists(String key, String field) {
     855         Jedis jedis = null;
     856         Boolean res = false;
     857         try {
     858             jedis = jedisPool.getResource();
     859             res = jedis.hexists(key, field);
     860         } catch (Exception e) {
     861 
     862             log.error(e.getMessage());
     863         } finally {
     864             returnResource(jedisPool, jedis);
     865         }
     866         return res;
     867     }
     868 
     869     /**
     870      * <p>
     871      * 通过key返回field的数量
     872      * </p>
     873      *
     874      * @param key
     875      * @return
     876      */
     877     public Long hlen(String key) {
     878         Jedis jedis = null;
     879         Long res = null;
     880         try {
     881             jedis = jedisPool.getResource();
     882             res = jedis.hlen(key);
     883         } catch (Exception e) {
     884 
     885             log.error(e.getMessage());
     886         } finally {
     887             returnResource(jedisPool, jedis);
     888         }
     889         return res;
     890 
     891     }
     892 
     893     /**
     894      * <p>
     895      * 通过key 删除指定的 field
     896      * </p>
     897      *
     898      * @param key
     899      * @param fields
     900      *            可以是 一个 field 也可以是 一个数组
     901      * @return
     902      */
     903     public Long hdel(String key, String... fields) {
     904         Jedis jedis = null;
     905         Long res = null;
     906         try {
     907             jedis = jedisPool.getResource();
     908             res = jedis.hdel(key, fields);
     909         } catch (Exception e) {
     910 
     911             log.error(e.getMessage());
     912         } finally {
     913             returnResource(jedisPool, jedis);
     914         }
     915         return res;
     916     }
     917 
     918     /**
     919      * <p>
     920      * 通过key返回所有的field
     921      * </p>
     922      *
     923      * @param key
     924      * @return
     925      */
     926     public Set<String> hkeys(String key) {
     927         Jedis jedis = null;
     928         Set<String> res = null;
     929         try {
     930             jedis = jedisPool.getResource();
     931             res = jedis.hkeys(key);
     932         } catch (Exception e) {
     933 
     934             log.error(e.getMessage());
     935         } finally {
     936             returnResource(jedisPool, jedis);
     937         }
     938         return res;
     939     }
     940 
     941     /**
     942      * <p>
     943      * 通过key返回所有和key有关的value
     944      * </p>
     945      *
     946      * @param key
     947      * @return
     948      */
     949     public List<String> hvals(String key) {
     950         Jedis jedis = null;
     951         List<String> res = null;
     952         try {
     953             jedis = jedisPool.getResource();
     954             res = jedis.hvals(key);
     955         } catch (Exception e) {
     956 
     957             log.error(e.getMessage());
     958         } finally {
     959             returnResource(jedisPool, jedis);
     960         }
     961         return res;
     962     }
     963 
     964     /**
     965      * <p>
     966      * 通过key获取所有的field和value
     967      * </p>
     968      *
     969      * @param key
     970      * @return
     971      */
     972     public Map<String, String> hgetall(String key, int indexdb) {
     973         Jedis jedis = null;
     974         Map<String, String> res = null;
     975         try {
     976             jedis = jedisPool.getResource();
     977             jedis.select(indexdb);
     978             res = jedis.hgetAll(key);
     979         } catch (Exception e) {
     980             log.error(e.getMessage());
     981         } finally {
     982             returnResource(jedisPool, jedis);
     983         }
     984         return res;
     985     }
     986 
     987     /**
     988      * <p>
     989      * 通过key向list头部添加字符串
     990      * </p>
     991      *
     992      * @param key
     993      * @param strs
     994      *            可以使一个string 也可以使string数组
     995      * @return 返回list的value个数
     996      */
     997     public Long lpush(int indexdb, String key, String... strs) {
     998         Jedis jedis = null;
     999         Long res = null;
    1000         try {
    1001             jedis = jedisPool.getResource();
    1002             jedis.select(indexdb);
    1003             res = jedis.lpush(key, strs);
    1004         } catch (Exception e) {
    1005 
    1006             log.error(e.getMessage());
    1007         } finally {
    1008             returnResource(jedisPool, jedis);
    1009         }
    1010         return res;
    1011     }
    1012 
    1013     /**
    1014      * <p>
    1015      * 通过key向list尾部添加字符串
    1016      * </p>
    1017      *
    1018      * @param key
    1019      * @param strs
    1020      *            可以使一个string 也可以使string数组
    1021      * @return 返回list的value个数
    1022      */
    1023     public Long rpush(String key, String... strs) {
    1024         Jedis jedis = null;
    1025         Long res = null;
    1026         try {
    1027             jedis = jedisPool.getResource();
    1028             res = jedis.rpush(key, strs);
    1029         } catch (Exception e) {
    1030 
    1031             log.error(e.getMessage());
    1032         } finally {
    1033             returnResource(jedisPool, jedis);
    1034         }
    1035         return res;
    1036     }
    1037 
    1038     /**
    1039      * <p>
    1040      * 通过key在list指定的位置之前或者之后 添加字符串元素
    1041      * </p>
    1042      *
    1043      * @param key
    1044      * @param where
    1045      *            LIST_POSITION枚举类型
    1046      * @param pivot
    1047      *            list里面的value
    1048      * @param value
    1049      *            添加的value
    1050      * @return
    1051      */
    1052     public Long linsert(String key, LIST_POSITION where, String pivot,
    1053                         String value) {
    1054         Jedis jedis = null;
    1055         Long res = null;
    1056         try {
    1057             jedis = jedisPool.getResource();
    1058             res = jedis.linsert(key, where, pivot, value);
    1059         } catch (Exception e) {
    1060 
    1061             log.error(e.getMessage());
    1062         } finally {
    1063             returnResource(jedisPool, jedis);
    1064         }
    1065         return res;
    1066     }
    1067 
    1068     /**
    1069      * <p>
    1070      * 通过key设置list指定下标位置的value
    1071      * </p>
    1072      * <p>
    1073      * 如果下标超过list里面value的个数则报错
    1074      * </p>
    1075      *
    1076      * @param key
    1077      * @param index
    1078      *            从0开始
    1079      * @param value
    1080      * @return 成功返回OK
    1081      */
    1082     public String lset(String key, Long index, String value) {
    1083         Jedis jedis = null;
    1084         String res = null;
    1085         try {
    1086             jedis = jedisPool.getResource();
    1087             res = jedis.lset(key, index, value);
    1088         } catch (Exception e) {
    1089 
    1090             log.error(e.getMessage());
    1091         } finally {
    1092             returnResource(jedisPool, jedis);
    1093         }
    1094         return res;
    1095     }
    1096 
    1097     /**
    1098      * <p>
    1099      * 通过key从对应的list中删除指定的count个 和 value相同的元素
    1100      * </p>
    1101      *
    1102      * @param key
    1103      * @param count
    1104      *            当count为0时删除全部
    1105      * @param value
    1106      * @return 返回被删除的个数
    1107      */
    1108     public Long lrem(String key, long count, String value) {
    1109         Jedis jedis = null;
    1110         Long res = null;
    1111         try {
    1112             jedis = jedisPool.getResource();
    1113             res = jedis.lrem(key, count, value);
    1114         } catch (Exception e) {
    1115 
    1116             log.error(e.getMessage());
    1117         } finally {
    1118             returnResource(jedisPool, jedis);
    1119         }
    1120         return res;
    1121     }
    1122 
    1123     /**
    1124      * <p>
    1125      * 通过key保留list中从strat下标开始到end下标结束的value值
    1126      * </p>
    1127      *
    1128      * @param key
    1129      * @param start
    1130      * @param end
    1131      * @return 成功返回OK
    1132      */
    1133     public String ltrim(String key, long start, long end) {
    1134         Jedis jedis = null;
    1135         String res = null;
    1136         try {
    1137             jedis = jedisPool.getResource();
    1138             res = jedis.ltrim(key, start, end);
    1139         } catch (Exception e) {
    1140 
    1141             log.error(e.getMessage());
    1142         } finally {
    1143             returnResource(jedisPool, jedis);
    1144         }
    1145         return res;
    1146     }
    1147 
    1148     /**
    1149      * <p>
    1150      * 通过key从list的头部删除一个value,并返回该value
    1151      * </p>
    1152      *
    1153      * @param key
    1154      * @return
    1155      */
    1156     synchronized public String lpop(String key) {
    1157         Jedis jedis = null;
    1158         String res = null;
    1159         try {
    1160             jedis = jedisPool.getResource();
    1161             res = jedis.lpop(key);
    1162         } catch (Exception e) {
    1163 
    1164             log.error(e.getMessage());
    1165         } finally {
    1166             returnResource(jedisPool, jedis);
    1167         }
    1168         return res;
    1169     }
    1170 
    1171     /**
    1172      * <p>
    1173      * 通过key从list尾部删除一个value,并返回该元素
    1174      * </p>
    1175      *
    1176      * @param key
    1177      * @return
    1178      */
    1179     synchronized public String rpop(String key, int indexdb) {
    1180         Jedis jedis = null;
    1181         String res = null;
    1182         try {
    1183             jedis = jedisPool.getResource();
    1184             jedis.select(indexdb);
    1185             res = jedis.rpop(key);
    1186         } catch (Exception e) {
    1187 
    1188             log.error(e.getMessage());
    1189         } finally {
    1190             returnResource(jedisPool, jedis);
    1191         }
    1192         return res;
    1193     }
    1194 
    1195     /**
    1196      * <p>
    1197      * 通过key从一个list的尾部删除一个value并添加到另一个list的头部,并返回该value
    1198      * </p>
    1199      * <p>
    1200      * 如果第一个list为空或者不存在则返回null
    1201      * </p>
    1202      *
    1203      * @param srckey
    1204      * @param dstkey
    1205      * @return
    1206      */
    1207     public String rpoplpush(String srckey, String dstkey, int indexdb) {
    1208         Jedis jedis = null;
    1209         String res = null;
    1210         try {
    1211             jedis = jedisPool.getResource();
    1212             jedis.select(indexdb);
    1213             res = jedis.rpoplpush(srckey, dstkey);
    1214         } catch (Exception e) {
    1215 
    1216             log.error(e.getMessage());
    1217         } finally {
    1218             returnResource(jedisPool, jedis);
    1219         }
    1220         return res;
    1221     }
    1222 
    1223     /**
    1224      * <p>
    1225      * 通过key获取list中指定下标位置的value
    1226      * </p>
    1227      *
    1228      * @param key
    1229      * @param index
    1230      * @return 如果没有返回null
    1231      */
    1232     public String lindex(String key, long index) {
    1233         Jedis jedis = null;
    1234         String res = null;
    1235         try {
    1236             jedis = jedisPool.getResource();
    1237             res = jedis.lindex(key, index);
    1238         } catch (Exception e) {
    1239 
    1240             log.error(e.getMessage());
    1241         } finally {
    1242             returnResource(jedisPool, jedis);
    1243         }
    1244         return res;
    1245     }
    1246 
    1247     /**
    1248      * <p>
    1249      * 通过key返回list的长度
    1250      * </p>
    1251      *
    1252      * @param key
    1253      * @return
    1254      */
    1255     public Long llen(String key) {
    1256         Jedis jedis = null;
    1257         Long res = null;
    1258         try {
    1259             jedis = jedisPool.getResource();
    1260             res = jedis.llen(key);
    1261         } catch (Exception e) {
    1262 
    1263             log.error(e.getMessage());
    1264         } finally {
    1265             returnResource(jedisPool, jedis);
    1266         }
    1267         return res;
    1268     }
    1269 
    1270     /**
    1271      * <p>
    1272      * 通过key获取list指定下标位置的value
    1273      * </p>
    1274      * <p>
    1275      * 如果start 为 0 end 为 -1 则返回全部的list中的value
    1276      * </p>
    1277      *
    1278      * @param key
    1279      * @param start
    1280      * @param end
    1281      * @return
    1282      */
    1283     public List<String> lrange(String key, long start, long end, int indexdb) {
    1284         Jedis jedis = null;
    1285         List<String> res = null;
    1286         try {
    1287             jedis = jedisPool.getResource();
    1288             jedis.select(indexdb);
    1289             res = jedis.lrange(key, start, end);
    1290         } catch (Exception e) {
    1291 
    1292             log.error(e.getMessage());
    1293         } finally {
    1294             returnResource(jedisPool, jedis);
    1295         }
    1296         return res;
    1297     }
    1298 
    1299     /**
    1300      * <p>
    1301      * 将列表 key 下标为 index 的元素的值设置为 value
    1302      * </p>
    1303      *
    1304      * @param key
    1305      * @param index
    1306      * @param value
    1307      * @return 操作成功返回 ok ,否则返回错误信息
    1308      */
    1309     public String lset(String key, long index, String value) {
    1310         Jedis jedis = null;
    1311         try {
    1312             jedis = jedisPool.getResource();
    1313             return jedis.lset(key, index, value);
    1314         } catch (Exception e) {
    1315 
    1316             log.error(e.getMessage());
    1317         } finally {
    1318             returnResource(jedisPool, jedis);
    1319         }
    1320         return null;
    1321     }
    1322 
    1323     /**
    1324      * <p>
    1325      * 返回给定排序后的结果
    1326      * </p>
    1327      *
    1328      * @param key
    1329      * @param sortingParameters
    1330      * @return 返回列表形式的排序结果
    1331      */
    1332     public List<String> sort(String key, SortingParams sortingParameters) {
    1333         Jedis jedis = null;
    1334         try {
    1335             jedis = jedisPool.getResource();
    1336             return jedis.sort(key, sortingParameters);
    1337         } catch (Exception e) {
    1338 
    1339             log.error(e.getMessage());
    1340         } finally {
    1341             returnResource(jedisPool, jedis);
    1342         }
    1343         return null;
    1344     }
    1345 
    1346     /**
    1347      * <p>
    1348      * 返回排序后的结果,排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较。
    1349      * </p>
    1350      *
    1351      * @param key
    1352      * @return 返回列表形式的排序结果
    1353      */
    1354     public List<String> sort(String key) {
    1355         Jedis jedis = null;
    1356         try {
    1357             jedis = jedisPool.getResource();
    1358             return jedis.sort(key);
    1359         } catch (Exception e) {
    1360 
    1361             log.error(e.getMessage());
    1362         } finally {
    1363             returnResource(jedisPool, jedis);
    1364         }
    1365         return null;
    1366     }
    1367 
    1368     /**
    1369      * <p>
    1370      * 通过key向指定的set中添加value
    1371      * </p>
    1372      *
    1373      * @param key
    1374      * @param members
    1375      *            可以是一个String 也可以是一个String数组
    1376      * @return 添加成功的个数
    1377      */
    1378     public Long sadd(String key, String... members) {
    1379         Jedis jedis = null;
    1380         Long res = null;
    1381         try {
    1382             jedis = jedisPool.getResource();
    1383             res = jedis.sadd(key, members);
    1384         } catch (Exception e) {
    1385 
    1386             log.error(e.getMessage());
    1387         } finally {
    1388             returnResource(jedisPool, jedis);
    1389         }
    1390         return res;
    1391     }
    1392 
    1393     /**
    1394      * <p>
    1395      * 通过key删除set中对应的value值
    1396      * </p>
    1397      *
    1398      * @param key
    1399      * @param members
    1400      *            可以是一个String 也可以是一个String数组
    1401      * @return 删除的个数
    1402      */
    1403     public Long srem(String key, String... members) {
    1404         Jedis jedis = null;
    1405         Long res = null;
    1406         try {
    1407             jedis = jedisPool.getResource();
    1408             res = jedis.srem(key, members);
    1409         } catch (Exception e) {
    1410 
    1411             log.error(e.getMessage());
    1412         } finally {
    1413             returnResource(jedisPool, jedis);
    1414         }
    1415         return res;
    1416     }
    1417 
    1418     /**
    1419      * <p>
    1420      * 通过key随机删除一个set中的value并返回该值
    1421      * </p>
    1422      *
    1423      * @param key
    1424      * @return
    1425      */
    1426     public String spop(String key) {
    1427         Jedis jedis = null;
    1428         String res = null;
    1429         try {
    1430             jedis = jedisPool.getResource();
    1431             res = jedis.spop(key);
    1432         } catch (Exception e) {
    1433 
    1434             log.error(e.getMessage());
    1435         } finally {
    1436             returnResource(jedisPool, jedis);
    1437         }
    1438         return res;
    1439     }
    1440 
    1441     /**
    1442      * <p>
    1443      * 通过key获取set中的差集
    1444      * </p>
    1445      * <p>
    1446      * 以第一个set为标准
    1447      * </p>
    1448      *
    1449      * @param keys
    1450      *            可以使一个string 则返回set中所有的value 也可以是string数组
    1451      * @return
    1452      */
    1453     public Set<String> sdiff(String... keys) {
    1454         Jedis jedis = null;
    1455         Set<String> res = null;
    1456         try {
    1457             jedis = jedisPool.getResource();
    1458             res = jedis.sdiff(keys);
    1459         } catch (Exception e) {
    1460 
    1461             log.error(e.getMessage());
    1462         } finally {
    1463             returnResource(jedisPool, jedis);
    1464         }
    1465         return res;
    1466     }
    1467 
    1468     /**
    1469      * <p>
    1470      * 通过key获取set中的差集并存入到另一个key中
    1471      * </p>
    1472      * <p>
    1473      * 以第一个set为标准
    1474      * </p>
    1475      *
    1476      * @param dstkey
    1477      *            差集存入的key
    1478      * @param keys
    1479      *            可以使一个string 则返回set中所有的value 也可以是string数组
    1480      * @return
    1481      */
    1482     public Long sdiffstore(String dstkey, String... keys) {
    1483         Jedis jedis = null;
    1484         Long res = null;
    1485         try {
    1486             jedis = jedisPool.getResource();
    1487             res = jedis.sdiffstore(dstkey, keys);
    1488         } catch (Exception e) {
    1489 
    1490             log.error(e.getMessage());
    1491         } finally {
    1492             returnResource(jedisPool, jedis);
    1493         }
    1494         return res;
    1495     }
    1496 
    1497     /**
    1498      * <p>
    1499      * 通过key获取指定set中的交集
    1500      * </p>
    1501      *
    1502      * @param keys
    1503      *            可以使一个string 也可以是一个string数组
    1504      * @return
    1505      */
    1506     public Set<String> sinter(String... keys) {
    1507         Jedis jedis = null;
    1508         Set<String> res = null;
    1509         try {
    1510             jedis = jedisPool.getResource();
    1511             res = jedis.sinter(keys);
    1512         } catch (Exception e) {
    1513 
    1514             log.error(e.getMessage());
    1515         } finally {
    1516             returnResource(jedisPool, jedis);
    1517         }
    1518         return res;
    1519     }
    1520 
    1521     /**
    1522      * <p>
    1523      * 通过key获取指定set中的交集 并将结果存入新的set中
    1524      * </p>
    1525      *
    1526      * @param dstkey
    1527      * @param keys
    1528      *            可以使一个string 也可以是一个string数组
    1529      * @return
    1530      */
    1531     public Long sinterstore(String dstkey, String... keys) {
    1532         Jedis jedis = null;
    1533         Long res = null;
    1534         try {
    1535             jedis = jedisPool.getResource();
    1536             res = jedis.sinterstore(dstkey, keys);
    1537         } catch (Exception e) {
    1538 
    1539             log.error(e.getMessage());
    1540         } finally {
    1541             returnResource(jedisPool, jedis);
    1542         }
    1543         return res;
    1544     }
    1545 
    1546     /**
    1547      * <p>
    1548      * 通过key返回所有set的并集
    1549      * </p>
    1550      *
    1551      * @param keys
    1552      *            可以使一个string 也可以是一个string数组
    1553      * @return
    1554      */
    1555     public Set<String> sunion(String... keys) {
    1556         Jedis jedis = null;
    1557         Set<String> res = null;
    1558         try {
    1559             jedis = jedisPool.getResource();
    1560             res = jedis.sunion(keys);
    1561         } catch (Exception e) {
    1562 
    1563             log.error(e.getMessage());
    1564         } finally {
    1565             returnResource(jedisPool, jedis);
    1566         }
    1567         return res;
    1568     }
    1569 
    1570     /**
    1571      * <p>
    1572      * 通过key返回所有set的并集,并存入到新的set中
    1573      * </p>
    1574      *
    1575      * @param dstkey
    1576      * @param keys
    1577      *            可以使一个string 也可以是一个string数组
    1578      * @return
    1579      */
    1580     public Long sunionstore(String dstkey, String... keys) {
    1581         Jedis jedis = null;
    1582         Long res = null;
    1583         try {
    1584             jedis = jedisPool.getResource();
    1585             res = jedis.sunionstore(dstkey, keys);
    1586         } catch (Exception e) {
    1587 
    1588             log.error(e.getMessage());
    1589         } finally {
    1590             returnResource(jedisPool, jedis);
    1591         }
    1592         return res;
    1593     }
    1594 
    1595     /**
    1596      * <p>
    1597      * 通过key将set中的value移除并添加到第二个set中
    1598      * </p>
    1599      *
    1600      * @param srckey
    1601      *            需要移除的
    1602      * @param dstkey
    1603      *            添加的
    1604      * @param member
    1605      *            set中的value
    1606      * @return
    1607      */
    1608     public Long smove(String srckey, String dstkey, String member) {
    1609         Jedis jedis = null;
    1610         Long res = null;
    1611         try {
    1612             jedis = jedisPool.getResource();
    1613             res = jedis.smove(srckey, dstkey, member);
    1614         } catch (Exception e) {
    1615 
    1616             log.error(e.getMessage());
    1617         } finally {
    1618             returnResource(jedisPool, jedis);
    1619         }
    1620         return res;
    1621     }
    1622 
    1623     /**
    1624      * <p>
    1625      * 通过key获取set中value的个数
    1626      * </p>
    1627      *
    1628      * @param key
    1629      * @return
    1630      */
    1631     public Long scard(String key) {
    1632         Jedis jedis = null;
    1633         Long res = null;
    1634         try {
    1635             jedis = jedisPool.getResource();
    1636             res = jedis.scard(key);
    1637         } catch (Exception e) {
    1638 
    1639             log.error(e.getMessage());
    1640         } finally {
    1641             returnResource(jedisPool, jedis);
    1642         }
    1643         return res;
    1644     }
    1645 
    1646     /**
    1647      * <p>
    1648      * 通过key判断value是否是set中的元素
    1649      * </p>
    1650      *
    1651      * @param key
    1652      * @param member
    1653      * @return
    1654      */
    1655     public Boolean sismember(String key, String member) {
    1656         Jedis jedis = null;
    1657         Boolean res = null;
    1658         try {
    1659             jedis = jedisPool.getResource();
    1660             res = jedis.sismember(key, member);
    1661         } catch (Exception e) {
    1662 
    1663             log.error(e.getMessage());
    1664         } finally {
    1665             returnResource(jedisPool, jedis);
    1666         }
    1667         return res;
    1668     }
    1669 
    1670     /**
    1671      * <p>
    1672      * 通过key获取set中随机的value,不删除元素
    1673      * </p>
    1674      *
    1675      * @param key
    1676      * @return
    1677      */
    1678     public String srandmember(String key) {
    1679         Jedis jedis = null;
    1680         String res = null;
    1681         try {
    1682             jedis = jedisPool.getResource();
    1683             res = jedis.srandmember(key);
    1684         } catch (Exception e) {
    1685 
    1686             log.error(e.getMessage());
    1687         } finally {
    1688             returnResource(jedisPool, jedis);
    1689         }
    1690         return res;
    1691     }
    1692 
    1693     /**
    1694      * <p>
    1695      * 通过key获取set中所有的value
    1696      * </p>
    1697      *
    1698      * @param key
    1699      * @return
    1700      */
    1701     public Set<String> smembers(String key) {
    1702         Jedis jedis = null;
    1703         Set<String> res = null;
    1704         try {
    1705             jedis = jedisPool.getResource();
    1706             res = jedis.smembers(key);
    1707         } catch (Exception e) {
    1708 
    1709             log.error(e.getMessage());
    1710         } finally {
    1711             returnResource(jedisPool, jedis);
    1712         }
    1713         return res;
    1714     }
    1715 
    1716     /**
    1717      * <p>
    1718      * 通过key向zset中添加value,score,其中score就是用来排序的
    1719      * </p>
    1720      * <p>
    1721      * 如果该value已经存在则根据score更新元素
    1722      * </p>
    1723      *
    1724      * @param key
    1725      * @param score
    1726      * @param member
    1727      * @return
    1728      */
    1729     public Long zadd(String key, double score, String member) {
    1730         Jedis jedis = null;
    1731         Long res = null;
    1732         try {
    1733             jedis = jedisPool.getResource();
    1734             res = jedis.zadd(key, score, member);
    1735         } catch (Exception e) {
    1736 
    1737             log.error(e.getMessage());
    1738         } finally {
    1739             returnResource(jedisPool, jedis);
    1740         }
    1741         return res;
    1742     }
    1743 
    1744     /**
    1745      * <p>
    1746      * 返回有序集 key 中,指定区间内的成员。min=0,max=-1代表所有元素
    1747      * </p>
    1748      *
    1749      * @param key
    1750      * @param min
    1751      * @param max
    1752      * @return 指定区间内的有序集成员的列表。
    1753      */
    1754     public Set<String> zrange(String key, long min, long max) {
    1755         Jedis jedis = null;
    1756         try {
    1757             jedis = jedisPool.getResource();
    1758             return jedis.zrange(key, min, max);
    1759         } catch (Exception e) {
    1760 
    1761             log.error(e.getMessage());
    1762         } finally {
    1763             returnResource(jedisPool, jedis);
    1764         }
    1765         return null;
    1766     }
    1767 
    1768     /**
    1769      * <p>
    1770      * 统计有序集 key 中,值在 min 和 max 之间的成员的数量
    1771      * </p>
    1772      *
    1773      * @param key
    1774      * @param min
    1775      * @param max
    1776      * @return 值在 min 和 max 之间的成员的数量。异常返回0
    1777      */
    1778     public Long zcount(String key, double min, double max) {
    1779         Jedis jedis = null;
    1780         try {
    1781             jedis = jedisPool.getResource();
    1782             return jedis.zcount(key, min, max);
    1783         } catch (Exception e) {
    1784 
    1785             log.error(e.getMessage());
    1786             return 0L;
    1787         } finally {
    1788             returnResource(jedisPool, jedis);
    1789         }
    1790 
    1791     }
    1792 
    1793     /**
    1794      * <p>
    1795      * 为哈希表 key 中的域 field 的值加上增量 increment 。增量也可以为负数,相当于对给定域进行减法操作。 如果 key
    1796      * 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
    1797      * 对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。本操作的值被限制在 64 位(bit)有符号数字表示之内。
    1798      * </p>
    1799      * <p>
    1800      * 将名称为key的hash中field的value增加integer
    1801      * </p>
    1802      *
    1803      * @param key
    1804      * @param value
    1805      * @param increment
    1806      * @return 执行 HINCRBY 命令之后,哈希表 key 中域 field的值。异常返回0
    1807      */
    1808     public Long hincrBy(String key, String value, long increment) {
    1809         Jedis jedis = null;
    1810         try {
    1811             jedis = jedisPool.getResource();
    1812             return jedis.hincrBy(key, value, increment);
    1813         } catch (Exception e) {
    1814             log.error(e.getMessage());
    1815             return 0L;
    1816         } finally {
    1817             returnResource(jedisPool, jedis);
    1818         }
    1819 
    1820     }
    1821 
    1822     /**
    1823      * <p>
    1824      * 通过key删除在zset中指定的value
    1825      * </p>
    1826      *
    1827      * @param key
    1828      * @param members
    1829      *            可以使一个string 也可以是一个string数组
    1830      * @return
    1831      */
    1832     public Long zrem(String key, String... members) {
    1833         Jedis jedis = null;
    1834         Long res = null;
    1835         try {
    1836             jedis = jedisPool.getResource();
    1837             res = jedis.zrem(key, members);
    1838         } catch (Exception e) {
    1839 
    1840             log.error(e.getMessage());
    1841         } finally {
    1842             returnResource(jedisPool, jedis);
    1843         }
    1844         return res;
    1845     }
    1846 
    1847     /**
    1848      * <p>
    1849      * 通过key增加该zset中value的score的值
    1850      * </p>
    1851      *
    1852      * @param key
    1853      * @param score
    1854      * @param member
    1855      * @return
    1856      */
    1857     public Double zincrby(String key, double score, String member) {
    1858         Jedis jedis = null;
    1859         Double res = null;
    1860         try {
    1861             jedis = jedisPool.getResource();
    1862             res = jedis.zincrby(key, score, member);
    1863         } catch (Exception e) {
    1864 
    1865             log.error(e.getMessage());
    1866         } finally {
    1867             returnResource(jedisPool, jedis);
    1868         }
    1869         return res;
    1870     }
    1871 
    1872     /**
    1873      * <p>
    1874      * 通过key返回zset中value的排名
    1875      * </p>
    1876      * <p>
    1877      * 下标从小到大排序
    1878      * </p>
    1879      *
    1880      * @param key
    1881      * @param member
    1882      * @return
    1883      */
    1884     public Long zrank(String key, String member) {
    1885         Jedis jedis = null;
    1886         Long res = null;
    1887         try {
    1888             jedis = jedisPool.getResource();
    1889             res = jedis.zrank(key, member);
    1890         } catch (Exception e) {
    1891 
    1892             log.error(e.getMessage());
    1893         } finally {
    1894             returnResource(jedisPool, jedis);
    1895         }
    1896         return res;
    1897     }
    1898 
    1899     /**
    1900      * <p>
    1901      * 通过key返回zset中value的排名
    1902      * </p>
    1903      * <p>
    1904      * 下标从大到小排序
    1905      * </p>
    1906      *
    1907      * @param key
    1908      * @param member
    1909      * @return
    1910      */
    1911     public Long zrevrank(String key, String member) {
    1912         Jedis jedis = null;
    1913         Long res = null;
    1914         try {
    1915             jedis = jedisPool.getResource();
    1916             res = jedis.zrevrank(key, member);
    1917         } catch (Exception e) {
    1918 
    1919             log.error(e.getMessage());
    1920         } finally {
    1921             returnResource(jedisPool, jedis);
    1922         }
    1923         return res;
    1924     }
    1925 
    1926     /**
    1927      * <p>
    1928      * 通过key将获取score从start到end中zset的value
    1929      * </p>
    1930      * <p>
    1931      * socre从大到小排序
    1932      * </p>
    1933      * <p>
    1934      * 当start为0 end为-1时返回全部
    1935      * </p>
    1936      *
    1937      * @param key
    1938      * @param start
    1939      * @param end
    1940      * @return
    1941      */
    1942     public Set<String> zrevrange(String key, long start, long end) {
    1943         Jedis jedis = null;
    1944         Set<String> res = null;
    1945         try {
    1946             jedis = jedisPool.getResource();
    1947             res = jedis.zrevrange(key, start, end);
    1948         } catch (Exception e) {
    1949 
    1950             log.error(e.getMessage());
    1951         } finally {
    1952             returnResource(jedisPool, jedis);
    1953         }
    1954         return res;
    1955     }
    1956 
    1957     /**
    1958      * <p>
    1959      * 通过key返回指定score内zset中的value
    1960      * </p>
    1961      *
    1962      * @param key
    1963      * @param max
    1964      * @param min
    1965      * @return
    1966      */
    1967     public Set<String> zrangebyscore(String key, String max, String min) {
    1968         Jedis jedis = null;
    1969         Set<String> res = null;
    1970         try {
    1971             jedis = jedisPool.getResource();
    1972             res = jedis.zrevrangeByScore(key, max, min);
    1973         } catch (Exception e) {
    1974 
    1975             log.error(e.getMessage());
    1976         } finally {
    1977             returnResource(jedisPool, jedis);
    1978         }
    1979         return res;
    1980     }
    1981 
    1982     /**
    1983      * <p>
    1984      * 通过key返回指定score内zset中的value
    1985      * </p>
    1986      *
    1987      * @param key
    1988      * @param max
    1989      * @param min
    1990      * @return
    1991      */
    1992     public Set<String> zrangeByScore(String key, double max, double min) {
    1993         Jedis jedis = null;
    1994         Set<String> res = null;
    1995         try {
    1996             jedis = jedisPool.getResource();
    1997             res = jedis.zrevrangeByScore(key, max, min);
    1998         } catch (Exception e) {
    1999 
    2000             log.error(e.getMessage());
    2001         } finally {
    2002             returnResource(jedisPool, jedis);
    2003         }
    2004         return res;
    2005     }
    2006 
    2007     /**
    2008      * <p>
    2009      * 返回指定区间内zset中value的数量
    2010      * </p>
    2011      *
    2012      * @param key
    2013      * @param min
    2014      * @param max
    2015      * @return
    2016      */
    2017     public Long zcount(String key, String min, String max) {
    2018         Jedis jedis = null;
    2019         Long res = null;
    2020         try {
    2021             jedis = jedisPool.getResource();
    2022             res = jedis.zcount(key, min, max);
    2023         } catch (Exception e) {
    2024 
    2025             log.error(e.getMessage());
    2026         } finally {
    2027             returnResource(jedisPool, jedis);
    2028         }
    2029         return res;
    2030     }
    2031 
    2032     /**
    2033      * <p>
    2034      * 通过key返回zset中的value个数
    2035      * </p>
    2036      *
    2037      * @param key
    2038      * @return
    2039      */
    2040     public Long zcard(String key) {
    2041         Jedis jedis = null;
    2042         Long res = null;
    2043         try {
    2044             jedis = jedisPool.getResource();
    2045             res = jedis.zcard(key);
    2046         } catch (Exception e) {
    2047 
    2048             log.error(e.getMessage());
    2049         } finally {
    2050             returnResource(jedisPool, jedis);
    2051         }
    2052         return res;
    2053     }
    2054 
    2055     /**
    2056      * <p>
    2057      * 通过key获取zset中value的score值
    2058      * </p>
    2059      *
    2060      * @param key
    2061      * @param member
    2062      * @return
    2063      */
    2064     public Double zscore(String key, String member) {
    2065         Jedis jedis = null;
    2066         Double res = null;
    2067         try {
    2068             jedis = jedisPool.getResource();
    2069             res = jedis.zscore(key, member);
    2070         } catch (Exception e) {
    2071 
    2072             log.error(e.getMessage());
    2073         } finally {
    2074             returnResource(jedisPool, jedis);
    2075         }
    2076         return res;
    2077     }
    2078 
    2079     /**
    2080      * <p>
    2081      * 通过key删除给定区间内的元素
    2082      * </p>
    2083      *
    2084      * @param key
    2085      * @param start
    2086      * @param end
    2087      * @return
    2088      */
    2089     public Long zremrangeByRank(String key, long start, long end) {
    2090         Jedis jedis = null;
    2091         Long res = null;
    2092         try {
    2093             jedis = jedisPool.getResource();
    2094             res = jedis.zremrangeByRank(key, start, end);
    2095         } catch (Exception e) {
    2096 
    2097             log.error(e.getMessage());
    2098         } finally {
    2099             returnResource(jedisPool, jedis);
    2100         }
    2101         return res;
    2102     }
    2103 
    2104     /**
    2105      * <p>
    2106      * 通过key删除指定score内的元素
    2107      * </p>
    2108      *
    2109      * @param key
    2110      * @param start
    2111      * @param end
    2112      * @return
    2113      */
    2114     public Long zremrangeByScore(String key, double start, double end) {
    2115         Jedis jedis = null;
    2116         Long res = null;
    2117         try {
    2118             jedis = jedisPool.getResource();
    2119             res = jedis.zremrangeByScore(key, start, end);
    2120         } catch (Exception e) {
    2121 
    2122             log.error(e.getMessage());
    2123         } finally {
    2124             returnResource(jedisPool, jedis);
    2125         }
    2126         return res;
    2127     }
    2128 
    2129     /**
    2130      * <p>
    2131      * 返回满足pattern表达式的所有key
    2132      * </p>
    2133      * <p>
    2134      * keys(*)
    2135      * </p>
    2136      * <p>
    2137      * 返回所有的key
    2138      * </p>
    2139      *
    2140      * @param pattern
    2141      * @return
    2142      */
    2143     public Set<String> keys(String pattern) {
    2144         Jedis jedis = null;
    2145         Set<String> res = null;
    2146         try {
    2147             jedis = jedisPool.getResource();
    2148             res = jedis.keys(pattern);
    2149         } catch (Exception e) {
    2150 
    2151             log.error(e.getMessage());
    2152         } finally {
    2153             returnResource(jedisPool, jedis);
    2154         }
    2155         return res;
    2156     }
    2157 
    2158     public Set<String> keysBySelect(String pattern,int database) {
    2159         Jedis jedis = null;
    2160         Set<String> res = null;
    2161         try {
    2162             jedis = jedisPool.getResource();
    2163             jedis.select(database);
    2164             res = jedis.keys(pattern);
    2165         } catch (Exception e) {
    2166 
    2167             log.error(e.getMessage());
    2168         } finally {
    2169             returnResource(jedisPool, jedis);
    2170         }
    2171         return res;
    2172     }
    2173 
    2174 
    2175     /**
    2176      * 通过key判断值得类型
    2177      * @param key
    2178      * @return
    2179      */
    2180     public String type(String key) {
    2181         Jedis jedis = null;
    2182         String res = null;
    2183         try {
    2184             jedis = jedisPool.getResource();
    2185             res = jedis.type(key);
    2186         } catch (Exception e) {
    2187 
    2188             log.error(e.getMessage());
    2189         } finally {
    2190             returnResource(jedisPool, jedis);
    2191         }
    2192         return res;
    2193     }
    2194 
    2195     /**
    2196      * 序列化对象
    2197      * @param obj
    2198      * @return
    2199      * 对象需实现Serializable接口
    2200      */
    2201     public static byte[] ObjTOSerialize(Object obj) {
    2202         ObjectOutputStream oos = null;
    2203         ByteArrayOutputStream byteOut = null;
    2204         try {
    2205             byteOut = new ByteArrayOutputStream();
    2206             oos = new ObjectOutputStream(byteOut);
    2207             oos.writeObject(obj);
    2208             byte[] bytes = byteOut.toByteArray();
    2209             return bytes;
    2210         } catch (Exception e) {
    2211         }
    2212         return null;
    2213     }
    2214 
    2215     /**
    2216      * 反序列化对象
    2217      * @param bytes
    2218      * @return
    2219      * 对象需实现Serializable接口
    2220      */
    2221     public static Object unserialize(byte[] bytes) {
    2222         ByteArrayInputStream bais = null;
    2223         try {
    2224             //反序列化
    2225             bais = new ByteArrayInputStream(bytes);
    2226             ObjectInputStream ois = new ObjectInputStream(bais);
    2227             return ois.readObject();
    2228         } catch (Exception e) {
    2229         }
    2230         return null;
    2231     }
    2232 
    2233     /**
    2234      * 返还到连接池
    2235      *
    2236      * @param jedisPool
    2237      * @param jedis
    2238      */
    2239     public static void returnResource(JedisPool jedisPool, Jedis jedis) {
    2240         if (jedis != null) {
    2241             jedisPool.returnResource(jedis);
    2242         }
    2243     }
    2244 }

        application.properties

     1 # Redis数据库索引(默认为0)
     2 spring.redis.database=0
     3 # Redis服务器地址
     4 spring.redis.host=127.0.0.1
     5 # Redis服务器连接端口
     6 spring.redis.port=6379
     7 # Redis服务器连接密码(默认为空)
     8 spring.redis.password=
     9 # 连接超时时间(毫秒)
    10 spring.redis.timeout=1000
    11
    12 # 连接池最大连接数(使用负值表示没有限制)
    13 spring.redis.jedis.pool.max-active=200
    14 # 连接池最大阻塞等待时间(使用负值表示没有限制)
    15 spring.redis.jedis.pool.max-wait=1000
    16 # 连接池中的最大空闲连接
    17 spring.redis.jedis.pool.max-idle=8
    18 # 连接池中的最小空闲连接
    19 spring.redis.jedis.pool.min-idle=0
    20 # 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
    21 spring.redis.block-when-exhausted=true

    Jedis单元测试

     1 import com.example.redis.pojo.User;
     2 import com.example.redis.util.JedisUtil;
     3 import com.example.redis.util.SerializeUtil;
     4 import org.junit.Test;
     5 import org.junit.runner.RunWith;
     6 import org.springframework.beans.factory.annotation.Autowired;
     7 import org.springframework.boot.test.context.SpringBootTest;
     8 import org.springframework.data.redis.core.RedisTemplate;
     9 import org.springframework.data.redis.core.ValueOperations;
    10 import org.springframework.test.context.junit4.SpringRunner;
    11 import redis.clients.jedis.JedisPool;
    12 import java.io.IOException;
    13 
    14 @RunWith(SpringRunner.class)
    15 @SpringBootTest
    16 public class RedisApplicationTests {
    17 
    18     @Autowired
    19     private JedisUtil redisUtil;
    20     @Autowired
    21     private SerializeUtil serializeUtil;
    22     @Autowired
    23     private JedisPool jedisPool;
    24 
    25     /**
    26      * 測試jedis連接池
    27      */
    28     @Test
    29     public void testJedis() {
    30         User user = new User(1L, "問女何所思", "000000002", "123456");
    31         User user1 = new User(1L, "問女何所憶", "000000003", "123456");
    32         String set = redisUtil.set("qq".getBytes(), serializeUtil.serialize(user), 0);
    33         //jedisPool.getResource().set("qq".getBytes(), serializeUtil.serialize(user));
    34         String set1 = redisUtil.set("weixin".getBytes(), serializeUtil.serialize(user1), 0);
    35         //jedisPool.getResource().set("weixin".getBytes(), serializeUtil.serialize(user1));
    36 
    37         byte[] bytes = redisUtil.get("qq".getBytes(), 0);
    38         System.out.println("redis存放結果: " + bytes);
    39         byte[] bytes1 = redisUtil.get("weixin".getBytes(), 0);
    40         System.out.println("redis存放結果: " + bytes1);
    41         try {
    42             User user2 = (User)serializeUtil.deserialize(bytes);
    43             System.out.println(user2);
    44 
    45             User user3 = (User)serializeUtil.deserialize(bytes1);
    46             System.out.println(user3);
    47         } catch (IOException e) {
    48             e.printStackTrace();
    49         } catch (ClassNotFoundException e) {
    50             e.printStackTrace();
    51         }
    52     }
    53 
    54 }

     SpringBoot集成Lettuce连接池:

     1 <dependency>
     2       <groupId>org.springframework.boot</groupId>
     3       <artifactId>spring-boot-starter-data-redis</artifactId>
     4 </dependency>
     5 
     6 <!--lettuce pool連接池-->
     7 <dependency>
     8       <groupId>org.apache.commons</groupId>
     9       <artifactId>commons-pool2</artifactId>
    10 </dependency>
    RedisConfig
     1 import org.springframework.context.annotation.Bean;
     2 import org.springframework.context.annotation.Configuration;
     3 import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
     4 import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
     5 import org.springframework.data.redis.core.RedisTemplate;
     6 import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
     7 import org.springframework.data.redis.serializer.StringRedisSerializer;
     8 import java.io.Serializable;
     9 
    10 @Configuration
    11 public class RedisConfig {
    12 
    13     @Bean
    14     public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) {
    15         RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
    16         redisTemplate.setKeySerializer(new StringRedisSerializer());
    17         redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    18         redisTemplate.setConnectionFactory(connectionFactory);
    19         //redisTemplate.setConnectionFactory(new JedisConnectionFactory());
    20         return redisTemplate;
    21     }
    22 
    23 }

    application.properties

     1 # Redis数据库索引(默认为0)
     2 spring.redis.database=0
     3 # Redis服务器地址
     4 spring.redis.host=127.0.0.1
     5 # Redis服务器连接端口
     6 spring.redis.port=6379
     7 # Redis服务器连接密码(默认为空)
     8 spring.redis.password=
     9 # 连接池最大连接数(使用负值表示没有限制)
    10 spring.redis.lettuce.pool.max-active=200
    11 # 连接池最大阻塞等待时间(使用负值表示没有限制)
    12 spring.redis.lettuce.pool.max-wait=-1
    13 # 连接池中的最大空闲连接
    14 spring.redis.lettuce.pool.max-idle=10
    15 # 连接池中的最小空闲连接
    16 spring.redis.lettuce.pool.min-idle=0
    17 # 连接超时时间(毫秒)
    18 spring.redis.timeout=1000

    Lettuce单元测试

     1 import com.example.redis.pojo.User;
     2 import com.example.redis.util.JedisUtil;
     3 import com.example.redis.util.SerializeUtil;
     4 import org.junit.Test;
     5 import org.junit.runner.RunWith;
     6 import org.springframework.beans.factory.annotation.Autowired;
     7 import org.springframework.boot.test.context.SpringBootTest;
     8 import org.springframework.data.redis.core.RedisTemplate;
     9 import org.springframework.data.redis.core.ValueOperations;
    10 import org.springframework.test.context.junit4.SpringRunner;
    11 import redis.clients.jedis.JedisPool;
    12 import java.io.IOException;
    13 
    14 @RunWith(SpringRunner.class)
    15 @SpringBootTest
    16 public class RedisApplicationTests {
    17 
    18     @Autowired
    19     private RedisTemplate redisTemplate;
    20 
    21     /**
    22      * 測試redisTemplate
    23      */
    24     @Test
    25     public void contextLoads() {
    26         User user = new User(1L, "666先生的救贖", "000000001", "123456");
    27         ValueOperations<String, User> operations = redisTemplate.opsForValue();
    28         operations.set("maxinhai", user);
    29         Boolean exists = redisTemplate.hasKey("maxinhai");
    30         System.out.println("redis是否在存在相應的key: " + exists);
    31         User user1 = (User)redisTemplate.opsForValue().get("maxinhai");
    32         System.out.println(user1);
    33     }
    34 
    35 }

     redis存储的对象要实现Serializable接口。

  • 相关阅读:
    LeetCode#237 Delete Node in a Linked List
    数据库概念
    请基于 TCP/IP 五层网络模型描述下当我们在浏览器请求 https ://pp.io 站点时,发生了哪些事情
    高并发大流量
    mysql关于索引
    php基础——会话控制
    php基础——运算符知识
    php基础——常量及数据类型考察
    引用变量和cow机制
    关系基本特性的运算封闭性
  • 原文地址:https://www.cnblogs.com/mxh-java/p/12310408.html
Copyright © 2011-2022 走看看