• 动态代理模式_应用(Redis工具类)


    本次使用动态代理的初衷是学习Redis,使用Java操作Redis时用到Jedis的JedisPool,而后对Jedis的方法进一步封装完善成为一个工具类。
    因为直接使用Jedis对象时,为了保证性能,总会需要手动的获取到连接池中的连接,使用完成后还需要手动的释放连接,都是完全重复的操作。
    所以想要使用一些方法来抽取出这些重复操作,初时想到的是使用模板方法或是动态代理,但考虑到到模板方法会使用到大量的类,似乎与主旨不符,遂使用动态代理进行加强。

    实现动态代理可使用JDK对应的方法,或是CGlib。由于工具类本身不会去定义接口,所以选择CGlib。本身是在SpringBoot项目中进行,所以没有额外导入CGlib的包(spring的面向切面就使用到了CGlib与JDK自带的动态 代理)。

    具体的思路就是使用动态代理来增强工具类对象,使得工具类在调用方法前后对应的进行获取连接及释放连接操作。在获得到增强工具类后只需要进行相关操作即可。

    使用了Maven来管理项目,代码所需的依赖如下

    1 <!-- Jedis -->
    2 <dependency>
    3     <groupId>com.redislabs</groupId>
    4     <artifactId>jredisearch-jedis</artifactId>
    5     <version>3.0.0-20180508</version>
    6 </dependency>

    此外还需要自己电脑安装Redis,或有对应的服务器

    代码如下

    Redis连接池代码

     1 package com;
     2 
     3 import org.apache.logging.log4j.Logger;
     4 
     5 import redis.clients.jedis.Jedis;
     6 import redis.clients.jedis.JedisPool;
     7 import redis.clients.jedis.JedisPoolConfig;
     8 /**
     9  * Jedis连接池
    10  * 
    11  * @author zaizouGGG
    12  *
    13  */
    14 public class RedisPool {
    15     
    16     private Logger logger = LogUtil.get(JedisUtil.class);
    17     private static SysConfigUtil sysConfigUtil = SysConfigUtil.getSysConfigUtil("redis.properties");
    18     
    19     //声明成static的原因:保证jedis连接池在tomcat启动时就加载出来
    20     //jedis连接池
    21     private static JedisPool pool;
    22     //与redis连接池连接的最大连接数
    23     private static Integer maxTotal = sysConfigUtil.getInt("redis.maxTotal");
    24     //在jedis连接池中最大的idle状态(空闲的)的jedis实例的个数
    25     private static Integer maxIdle = sysConfigUtil.getInt("redis.maxIdle");
    26     //在jedis连接池中最小的idle状态(空闲的)的jedis实例的个数
    27     private static Integer minIdle = sysConfigUtil.getInt("redis.minIdle");
    28     //在borrow一个jedis实例的时候,是否要进行验证操作,如果赋值为true,则得到的jedis实例肯定是可用的
    29     private static Boolean testOnBorrow = sysConfigUtil.getBoolean("redis.testOnBorrow");
    30     //在return一个jedis实例的时候,是否要进行验证操作,如果赋值为true,则返回jedis连接池的jedis实例肯定是可用的
    31     private static Boolean testOnReturn = sysConfigUtil.getBoolean("redis.testOnReturn");
    32     private static String redisIp = sysConfigUtil.getString("redis.host");
    33     private static Integer redisPort = sysConfigUtil.getInt("redis.port");
    34     private static String password = sysConfigUtil.getString("redis.password");
    35 
    36     //初始化连接池,只会调用一次
    37     private static void initPool() {
    38         JedisPoolConfig config = new JedisPoolConfig();
    39 
    40         config.setMaxTotal(maxTotal);
    41         config.setMaxIdle(maxIdle);
    42         config.setMinIdle(minIdle);
    43 
    44         config.setTestOnBorrow(testOnBorrow);
    45         config.setTestOnReturn(testOnReturn);
    46 
    47         //连接池耗尽的时候,是否阻塞,false会抛出异常,true阻塞直到超时,会抛出超时异常,默认为true
    48         config.setBlockWhenExhausted(true);
    49 
    50         //这里超时时间是2s
    51         if (password != null && !"".equals(password)) {
    52             // redis 设置了密码
    53             pool = new JedisPool(config, redisIp, redisPort, 1000*2, password);
    54         } else {
    55             // redis 未设置密码
    56             pool = new JedisPool(config, redisIp, redisPort, 1000*2);
    57         };
    58         
    59 
    60     }
    61 
    62     static {
    63         initPool();
    64     }
    65 
    66     //从连接池中拿取一个实例
    67     public static Jedis getJedis() {        
    68         return pool.getResource();
    69     }
    70 
    71     //返还Jedis
    72     public static void returnJedis(Jedis jedis) {
    73         jedis.close();
    74     }
    75 
    76     //被使用的连接数
    77     public static int getNumActive() {
    78         return pool.getNumActive();
    79     }
    80     
    81     //被阻塞的连接数?
    82     public static int getNumWaiters() {
    83         return pool.getNumWaiters();
    84     }
    85     
    86     //空闲的连接数
    87     public static int getNumIdle() {
    88         return pool.getNumIdle();
    89     }
    90 }

    读取.properties配置文件的工具类

    用于读取配置在.properties中的参数

     1 package com;
     2 
     3 import java.io.BufferedInputStream;
     4 import java.io.FileInputStream;
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.util.Properties;
     8 
     9 import org.apache.logging.log4j.Logger;
    10 
    11 /**
    12  * 获取自定义配置文件参数的共用方法
    13  * 
    14  * @author zaizouGGG
    15 * 16 */ 17 public class SysConfigUtil { 18 19 private static Logger logger = LogUtil.get(SysConfigUtil.class); 20 private Properties properties = null; 21 22 public SysConfigUtil() { 23 24 } 25 26 public SysConfigUtil(Properties p) { 27 properties = p; 28 } 29 30 31 public static SysConfigUtil getSysConfigUtil(String url) { 32 try(InputStream in = new BufferedInputStream(new FileInputStream(url));) { 33 Properties p = new Properties(); 34 p.load(in); 35 //return p.getProperty("jdbc.type"); 36 return new SysConfigUtil(p); 37 } catch (IOException e) { 38 // TODO Auto-generated catch block 39 logger.error("Jedis工具类初始化失败,读取配置文件 "+url+" 出错"); 40 e.printStackTrace(); 41 return null; 42 } 43 44 } 45 46 public String getString(String key) { 47 return properties.getProperty(key); 48 } 49 50 public int getInt(String key) { 51 int result = Integer.parseInt(properties.getProperty(key)); 52 return result; 53 } 54 55 public boolean getBoolean(String key) { 56 boolean result = Boolean.parseBoolean(properties.getProperty(key)); 57 return result; 58 } 59 60 public long getLong(String key) { 61 long result = Long.parseLong(properties.getProperty(key)); 62 return result; 63 } 64 }

    Redis配置文件

    此处的配置是我从网上找的,普通的使用没有问题,要应用请慎重

    redis.host=localhost
    redis.port=6379
    redis.password=root
    #在指定时刻通过pool能够获取到的最大的连接的jedis个数
    redis.maxTotal=8
    #最大能够保持idle的数量,控制一个pool最多有多少个状态为idle的jedis实例
    redis.maxIdle=8
    #最小能够保持idle的数量,控制一个pool最多有多少个状态为idle的jedis实例
    redis.minIdle=2
    #在borrow一个jedis实例的时候,是否要进行验证操作,如果赋值为true,则得到的jedis实例肯定是可用的
    redis.testOnBorrow=true
    #在return一个jedis实例的时候,是否要进行验证操作,如果赋值为true,则返回jedis连接池的jedis实例肯定是可用的
    redis.testOnReturn=false
    #当连接池内的连接耗尽时,getBlockWhenExhausted为true时,连接会阻塞,超过了阻塞的时间(设定的maxWaitMillis,单位毫秒)时会报错
    redis.maxWaitMillis=3000
    #在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;默认是false
    redis.testOnBorrow=false

    Jedis的工具类

      1 package com;
      2 
      3 import java.io.IOException;
      4 import java.util.List;
      5 import java.util.Map;
      6 import java.util.Set;
      7 
      8 import org.apache.logging.log4j.Logger;
      9 
     10 import redis.clients.jedis.Jedis;
     11 import redis.clients.jedis.JedisPool;
     12 import redis.clients.jedis.JedisPoolConfig;
     13 import redis.clients.jedis.ListPosition;
     14 
     15 /**
     16  * Jedis 通用工具类
     17  * @author zaizouGGG
     18  *
     19  */
     20 public class JedisUtil {
     21     
     22     private Logger logger = LogUtil.get(JedisUtil.class);
     23     private Jedis jedis = null;
     24     
     25     public Jedis getJedis() {
     26         return jedis;
     27     }
     28 
     29     public void setJedis(Jedis jedis) {
     30         this.jedis = jedis;
     31     }
     32 
     33     /**
     34      * 获取指定key的值,如果key不存在返回null,如果该Key存储的不是字符串,会抛出一个错误
     35      *
     36      * @param key
     37      * @return
     38      */
     39     public String get(String key) {
     40         String value = jedis.get(key);
     41         return value;
     42     }
     43 
     44     /**
     45      * 设置key的值为value
     46      *
     47      * @param key
     48      * @param value
     49      * @return
     50      */
     51     public String set(String key, String value) {
     52         String result = jedis.set(key, value);
     53         return result;
     54     }
     55     
     56     /**
     57      * 删除指定的key,也可以传入一个包含key的数组
     58      *
     59      * @param keys
     60      * @return
     61      */
     62     public Long del(String... keys) {
     63         
     64         return jedis.del(keys);
     65     }
     66 
     67     /**
     68      * 通过key向指定的value值追加值
     69      *
     70      * @param key
     71      * @param str
     72      * @return
     73      */
     74     public Long append(String key, String str) {
     75         
     76         return jedis.append(key, str);
     77     }
     78 
     79     /**
     80      * 判断key是否存在
     81      *
     82      * @param key
     83      * @return
     84      */
     85     public Boolean exists(String key) {
     86         
     87         return jedis.exists(key);
     88     }
     89 
     90     /**
     91      * 设置key value,如果key已经存在则返回0
     92      *
     93      * @param key
     94      * @param value
     95      * @return
     96      */
     97     public Long setnx(String key, String value) {
     98         
     99         return jedis.setnx(key, value);
    100     }
    101 
    102     /**
    103      * 设置key value并指定这个键值的有效期
    104      *
    105      * @param key
    106      * @param seconds
    107      * @param value
    108      * @return
    109      */
    110     public String setex(String key, String value, int seconds) {
    111         String result = jedis.setex(key, seconds, value);
    112         return result;
    113     }
    114 
    115     /**
    116      * 通过key 和offset 从指定的位置开始将原先value替换
    117      *
    118      * @param key
    119      * @param offset
    120      * @param str
    121      * @return
    122      */
    123     public Long setrange(String key, int offset, String str) {
    124         
    125         return jedis.setrange(key, offset, str);
    126     }
    127 
    128     /**
    129      * 通过批量的key获取批量的value
    130      *
    131      * @param keys
    132      * @return
    133      */
    134     public List<String> mget(String... keys) {
    135         
    136         return jedis.mget(keys);
    137     }
    138 
    139     /**
    140      * 批量的设置key:value,也可以一个
    141      *
    142      * @param keysValues
    143      * @return
    144      */
    145     public String mset(String... keysValues) {
    146         
    147         return jedis.mset(keysValues);
    148     }
    149 
    150     /**
    151      * 批量的设置key:value,可以一个,如果key已经存在则会失败,操作会回滚
    152      *
    153      * @param keysValues
    154      * @return
    155      */
    156     public Long msetnx(String... keysValues) {
    157         
    158         return jedis.msetnx(keysValues);
    159     }
    160 
    161     /**
    162      * 设置key的值,并返回一个旧值
    163      *
    164      * @param key
    165      * @param value
    166      * @return
    167      */
    168     public String getSet(String key, String value) {
    169         
    170         return jedis.getSet(key, value);
    171     }
    172 
    173     /**
    174      * 通过下标 和key 获取指定下标位置的 value
    175      *
    176      * @param key
    177      * @param startOffset
    178      * @param endOffset
    179      * @return
    180      */
    181     public String getrange(String key, int startOffset, int endOffset) {
    182         
    183         return jedis.getrange(key, startOffset, endOffset);
    184     }
    185 
    186     /**
    187      * 通过key 对value进行加值+1操作,当value不是int类型时会返回错误,当key不存在是则value为1
    188      *
    189      * @param key
    190      * @return
    191      */
    192     public Long incr(String key) {
    193         
    194         return jedis.incr(key);
    195     }
    196 
    197     /**
    198      * 通过key给指定的value加值,如果key不存在,则这是value为该值
    199      *
    200      * @param key
    201      * @param integer
    202      * @return
    203      */
    204     public Long incrBy(String key, long integer) {
    205         
    206         return jedis.incrBy(key, integer);
    207     }
    208 
    209     /**
    210      * 对key的值做减减操作,如果key不存在,则设置key为-1
    211      *
    212      * @param key
    213      * @return
    214      */
    215     public Long decr(String key) {
    216         
    217         return jedis.decr(key);
    218     }
    219 
    220     /**
    221      * 减去指定的值
    222      *
    223      * @param key
    224      * @param integer
    225      * @return
    226      */
    227     public Long decrBy(String key, long integer) {
    228         
    229         return jedis.decrBy(key, integer);
    230     }
    231 
    232     /**
    233      * 通过key获取value值的长度
    234      *
    235      * @param key
    236      * @return
    237      */
    238     public Long strLen(String key) {
    239         
    240         return jedis.strlen(key);
    241     }
    242 
    243     /**
    244      * 通过key给field设置指定的值,如果key不存在则先创建,如果field已经存在,返回0
    245      *
    246      * @param key
    247      * @param field
    248      * @param value
    249      * @return
    250      */
    251     public Long hsetnx(String key, String field, String value) {
    252         
    253         return jedis.hsetnx(key, field, value);
    254     }
    255 
    256     /**
    257      * 通过key给field设置指定的值,如果key不存在,则先创建
    258      *
    259      * @param key
    260      * @param field
    261      * @param value
    262      * @return
    263      */
    264     public Long hset(String key, String field, String value) {
    265         
    266         return jedis.hset(key, field, value);
    267     }
    268 
    269     /**
    270      * 通过key同时设置 hash的多个field
    271      *
    272      * @param key
    273      * @param hash
    274      * @return
    275      */
    276     public String hmset(String key, Map<String, String> hash) {
    277         
    278         return jedis.hmset(key, hash);
    279     }
    280 
    281     /**
    282      * 通过key 和 field 获取指定的 value
    283      *
    284      * @param key
    285      * @param failed
    286      * @return
    287      */
    288     public String hget(String key, String failed) {
    289         
    290         return jedis.hget(key, failed);
    291     }
    292 
    293     /**
    294      * 设置key的超时时间为seconds
    295      *
    296      * @param key
    297      * @param seconds
    298      * @return
    299      */
    300     public Long expire(String key, int seconds) {
    301         
    302         return jedis.expire(key, seconds);
    303     }
    304 
    305     /**
    306      * 通过key 和 fields 获取指定的value 如果没有对应的value则返回null
    307      *
    308      * @param key
    309      * @param fields 可以是 一个String 也可以是 String数组
    310      * @return
    311      */
    312     public List<String> hmget(String key, String... fields) {
    313         
    314         return jedis.hmget(key, fields);
    315     }
    316 
    317     /**
    318      * 通过key给指定的field的value加上给定的值
    319      *
    320      * @param key
    321      * @param field
    322      * @param value
    323      * @return
    324      */
    325     public Long hincrby(String key, String field, Long value) {
    326         
    327         return jedis.hincrBy(key, field, value);
    328     }
    329 
    330     /**
    331      * 通过key和field判断是否有指定的value存在
    332      *
    333      * @param key
    334      * @param field
    335      * @return
    336      */
    337     public Boolean hexists(String key, String field) {
    338         
    339         return jedis.hexists(key, field);
    340     }
    341 
    342     /**
    343      * 通过key返回field的数量
    344      *
    345      * @param key
    346      * @return
    347      */
    348     public Long hlen(String key) {
    349         
    350         return jedis.hlen(key);
    351     }
    352 
    353     /**
    354      * 通过key 删除指定的 field
    355      *
    356      * @param key
    357      * @param fields 可以是 一个 field 也可以是 一个数组
    358      * @return
    359      */
    360     public Long hdel(String key, String... fields) {
    361         
    362         return jedis.hdel(key, fields);
    363     }
    364 
    365     /**
    366      * 通过key返回所有的field
    367      *
    368      * @param key
    369      * @return
    370      */
    371     public Set<String> hkeys(String key) {
    372         
    373         return jedis.hkeys(key);
    374     }
    375 
    376     /**
    377      * 通过key返回所有和key有关的value
    378      *
    379      * @param key
    380      * @return
    381      */
    382     public List<String> hvals(String key) {
    383         
    384         return jedis.hvals(key);
    385     }
    386 
    387     /**
    388      * 通过key获取所有的field和value
    389      *
    390      * @param key
    391      * @return
    392      */
    393     public Map<String, String> hgetall(String key) {
    394         
    395         return jedis.hgetAll(key);
    396     }
    397 
    398     /**
    399      * 通过key向list头部添加字符串
    400      *
    401      * @param key
    402      * @param strs 可以是一个string 也可以是string数组
    403      * @return 返回list的value个数
    404      */
    405     public Long lpush(String key, String... strs) {
    406         
    407         return jedis.lpush(key, strs);
    408     }
    409 
    410     /**
    411      * 通过key向list尾部添加字符串
    412      *
    413      * @param key
    414      * @param strs 可以是一个string 也可以是string数组
    415      * @return 返回list的value个数
    416      */
    417     public Long rpush(String key, String... strs) {
    418         
    419         return jedis.rpush(key, strs);
    420     }
    421 
    422     /**
    423      * 通过key在list指定的位置之前或者之后 添加字符串元素
    424      *
    425      * @param key
    426      * @param where LIST_POSITION枚举类型
    427      * @param pivot list里面的value
    428      * @param value 添加的value
    429      * @return
    430      */
    431     public Long linsert(String key, ListPosition where,
    432                         String pivot, String value) {
    433         
    434         return jedis.linsert(key, where, pivot, value);
    435     }
    436 
    437     /**
    438      * 通过key设置list指定下标位置的value
    439      * 如果下标超过list里面value的个数则报错
    440      *
    441      * @param key
    442      * @param index 从0开始
    443      * @param value
    444      * @return 成功返回OK
    445      */
    446     public String lset(String key, Long index, String value) {
    447         
    448         return jedis.lset(key, index, value);
    449     }
    450 
    451     /**
    452      * 通过key从对应的list中删除指定的count个 和 value相同的元素
    453      *
    454      * @param key
    455      * @param count 当count为0时删除全部
    456      * @param value
    457      * @return 返回被删除的个数
    458      */
    459     public Long lrem(String key, long count, String value) {
    460         
    461         return jedis.lrem(key, count, value);
    462     }
    463 
    464     /**
    465      * 通过key保留list中从strat下标开始到end下标结束的value值
    466      *
    467      * @param key
    468      * @param start
    469      * @param end
    470      * @return 成功返回OK
    471      */
    472     public String ltrim(String key, long start, long end) {
    473         
    474         return jedis.ltrim(key, start, end);
    475     }
    476 
    477     /**
    478      * 通过key从list的头部删除一个value,并返回该value
    479      *
    480      * @param key
    481      * @return
    482      */
    483     public synchronized String lpop(String key) {
    484 
    485         
    486         return jedis.lpop(key);
    487     }
    488 
    489     /**
    490      * 通过key从list尾部删除一个value,并返回该元素
    491      *
    492      * @param key
    493      * @return
    494      */
    495     synchronized public String rpop(String key) {
    496         
    497         return jedis.rpop(key);
    498     }
    499 
    500     /**
    501      * 通过key从一个list的尾部删除一个value并添加到另一个list的头部,并返回该value
    502      * 如果第一个list为空或者不存在则返回null
    503      *
    504      * @param srckey
    505      * @param dstkey
    506      * @return
    507      */
    508     public String rpoplpush(String srckey, String dstkey) {
    509         
    510         return jedis.rpoplpush(srckey, dstkey);
    511     }
    512 
    513     /**
    514      * 通过key获取list中指定下标位置的value
    515      *
    516      * @param key
    517      * @param index
    518      * @return 如果没有返回null
    519      */
    520     public String lindex(String key, long index) {
    521         
    522         return jedis.lindex(key, index);
    523     }
    524 
    525     /**
    526      * 通过key返回list的长度
    527      *
    528      * @param key
    529      * @return
    530      */
    531     public Long llen(String key) {
    532         
    533         return jedis.llen(key);
    534     }
    535 
    536     /**
    537      * 通过key获取list指定下标位置的value
    538      * 如果start 为 0 end 为 -1 则返回全部的list中的value
    539      *
    540      * @param key
    541      * @param start
    542      * @param end
    543      * @return
    544      */
    545     public List<String> lrange(String key, long start, long end) {
    546         
    547         return jedis.lrange(key, start, end);
    548     }
    549 
    550     /**
    551      * 通过key向指定的set中添加value
    552      *
    553      * @param key
    554      * @param members 可以是一个String 也可以是一个String数组
    555      * @return 添加成功的个数
    556      */
    557     public Long sadd(String key, String... members) {
    558         
    559         return jedis.sadd(key, members);
    560     }
    561 
    562     /**
    563      * 通过key删除set中对应的value值
    564      *
    565      * @param key
    566      * @param members 可以是一个String 也可以是一个String数组
    567      * @return 删除的个数
    568      */
    569     public Long srem(String key, String... members) {
    570         
    571         return jedis.srem(key, members);
    572     }
    573 
    574     /**
    575      * 通过key随机删除一个set中的value并返回该值
    576      *
    577      * @param key
    578      * @return
    579      */
    580     public String spop(String key) {
    581         
    582         return jedis.spop(key);
    583     }
    584 
    585     /**
    586      * 通过key获取set中的差集
    587      * 以第一个set为标准
    588      *
    589      * @param keys 可以 是一个string 则返回set中所有的value 也可以是string数组
    590      * @return
    591      */
    592     public Set<String> sdiff(String... keys) {
    593         
    594         return jedis.sdiff(keys);
    595     }
    596 
    597     /**
    598      * 通过key获取set中的差集并存入到另一个key中
    599      * 以第一个set为标准
    600      *
    601      * @param dstkey 差集存入的key
    602      * @param keys   可以 是一个string 则返回set中所有的value 也可以是string数组
    603      * @return
    604      */
    605     public Long sdiffstore(String dstkey, String... keys) {
    606         
    607         return jedis.sdiffstore(dstkey, keys);
    608     }
    609 
    610     /**
    611      * 通过key获取指定set中的交集
    612      *
    613      * @param keys 可以 是一个string 也可以是一个string数组
    614      * @return
    615      */
    616     public Set<String> sinter(String... keys) {
    617         
    618         return jedis.sinter(keys);
    619     }
    620 
    621     /**
    622      * 通过key获取指定set中的交集 并将结果存入新的set中
    623      *
    624      * @param dstkey
    625      * @param keys   可以 是一个string 也可以是一个string数组
    626      * @return
    627      */
    628     public Long sinterstore(String dstkey, String... keys) {
    629         
    630         return jedis.sinterstore(dstkey, keys);
    631     }
    632 
    633     /**
    634      * 通过key返回所有set的并集
    635      *
    636      * @param keys 可以 是一个string 也可以是一个string数组
    637      * @return
    638      */
    639     public Set<String> sunion(String... keys) {
    640         
    641         return jedis.sunion(keys);
    642     }
    643 
    644     /**
    645      * 通过key返回所有set的并集,并存入到新的set中
    646      *
    647      * @param dstkey
    648      * @param keys   可以 是一个string 也可以是一个string数组
    649      * @return
    650      */
    651     public Long sunionstore(String dstkey, String... keys) {
    652         
    653         return jedis.sunionstore(dstkey, keys);
    654     }
    655 
    656     /**
    657      * 通过key将set中的value移除并添加到第二个set中
    658      *
    659      * @param srckey 需要移除的
    660      * @param dstkey 添加的
    661      * @param member set中的value
    662      * @return
    663      */
    664     public Long smove(String srckey, String dstkey, String member) {
    665         
    666         return jedis.smove(srckey, dstkey, member);
    667     }
    668 
    669     /**
    670      * 通过key获取set中value的个数
    671      *
    672      * @param key
    673      * @return
    674      */
    675     public Long scard(String key) {
    676         
    677         return jedis.scard(key);
    678     }
    679 
    680     /**
    681      * 通过key判断value是否是set中的元素
    682      *
    683      * @param key
    684      * @param member
    685      * @return
    686      */
    687     public Boolean sismember(String key, String member) {
    688         
    689         return jedis.sismember(key, member);
    690     }
    691 
    692     /**
    693      * 通过key获取set中随机的value,不删除元素
    694      *
    695      * @param key
    696      * @return
    697      */
    698     public String srandmember(String key) {
    699         
    700         return jedis.srandmember(key);
    701     }
    702 
    703     /**
    704      * 通过key获取set中所有的value
    705      *
    706      * @param key
    707      * @return
    708      */
    709     public Set<String> smembers(String key) {
    710         
    711         return jedis.smembers(key);
    712     }
    713 
    714 
    715     /**
    716      * 通过key向zset中添加value,score,其中score就是用来排序的
    717      * 如果该value已经存在则根据score更新元素
    718      *
    719      * @param key
    720      * @param score
    721      * @param member
    722      * @return
    723      */
    724     public Long zadd(String key, double score, String member) {
    725         
    726         return jedis.zadd(key, score, member);
    727     }
    728 
    729     /**
    730      * 通过key删除在zset中指定的value
    731      *
    732      * @param key
    733      * @param members 可以 是一个string 也可以是一个string数组
    734      * @return
    735      */
    736     public Long zrem(String key, String... members) {
    737         
    738         return jedis.zrem(key, members);
    739     }
    740 
    741     /**
    742      * 通过key增加该zset中value的score的值
    743      *
    744      * @param key
    745      * @param score
    746      * @param member
    747      * @return
    748      */
    749     public Double zincrby(String key, double score, String member) {
    750         
    751         return jedis.zincrby(key, score, member);
    752     }
    753 
    754     /**
    755      * 通过key返回zset中value的排名
    756      * 下标从小到大排序
    757      *
    758      * @param key
    759      * @param member
    760      * @return
    761      */
    762     public Long zrank(String key, String member) {
    763         
    764         return jedis.zrank(key, member);
    765     }
    766 
    767     /**
    768      * 通过key返回zset中value的排名
    769      * 下标从大到小排序
    770      *
    771      * @param key
    772      * @param member
    773      * @return
    774      */
    775     public Long zrevrank(String key, String member) {
    776         
    777         return jedis.zrevrank(key, member);
    778     }
    779 
    780     /**
    781      * 通过key将获取score从start到end中zset的value
    782      * socre从大到小排序
    783      * 当start为0 end为-1时返回全部
    784      *
    785      * @param key
    786      * @param start
    787      * @param end
    788      * @return
    789      */
    790     public Set<String> zrevrange(String key, long start, long end) {
    791         
    792         return jedis.zrevrange(key, start, end);
    793     }
    794 
    795     /**
    796      * 通过key返回指定score内zset中的value
    797      *
    798      * @param key
    799      * @param max
    800      * @param min
    801      * @return
    802      */
    803     public Set<String> zrangebyscore(String key, String max, String min) {
    804         
    805         return jedis.zrevrangeByScore(key, max, min);
    806     }
    807 
    808     /**
    809      * 通过key返回指定score内zset中的value
    810      *
    811      * @param key
    812      * @param max
    813      * @param min
    814      * @return
    815      */
    816     public Set<String> zrangeByScore(String key, double max, double min) {
    817         
    818         return jedis.zrevrangeByScore(key, max, min);
    819     }
    820 
    821     /**
    822      * 返回指定区间内zset中value的数量
    823      *
    824      * @param key
    825      * @param min
    826      * @param max
    827      * @return
    828      */
    829     public Long zcount(String key, String min, String max) {
    830         
    831         return jedis.zcount(key, min, max);
    832     }
    833 
    834     /**
    835      * 通过key返回zset中的value个数
    836      *
    837      * @param key
    838      * @return
    839      */
    840     public Long zcard(String key) {
    841         
    842         return jedis.zcard(key);
    843     }
    844 
    845     /**
    846      * 通过key获取zset中value的score值
    847      *
    848      * @param key
    849      * @param member
    850      * @return
    851      */
    852     public Double zscore(String key, String member) {
    853         
    854         return jedis.zscore(key, member);
    855     }
    856 
    857     /**
    858      * 通过key删除给定区间内的元素
    859      *
    860      * @param key
    861      * @param start
    862      * @param end
    863      * @return
    864      */
    865     public Long zremrangeByRank(String key, long start, long end) {
    866         
    867         return jedis.zremrangeByRank(key, start, end);
    868     }
    869 
    870     /**
    871      * 通过key删除指定score内的元素
    872      *
    873      * @param key
    874      * @param start
    875      * @param end
    876      * @return
    877      */
    878     public Long zremrangeByScore(String key, double start, double end) {
    879         
    880         return jedis.zremrangeByScore(key, start, end);
    881     }
    882  
    883     /**
    884      * 返回满足pattern表达式的所有key
    885      * keys(*)
    886      * 返回所有的key
    887      *
    888      * @param pattern
    889      * @return
    890      */
    891     public Set<String> keys(String pattern) {
    892         
    893         return jedis.keys(pattern);
    894     }
    895 
    896     /**
    897      * 通过key判断值得类型
    898      *
    899      * @param key
    900      * @return
    901      */
    902     public String type(String key) {
    903         
    904         return jedis.type(key);
    905     }
    906 
    907 
    908     /**
    909      * 返回一个CGlib增强的工具类对象
    910      * @return
    911      */
    912     public static JedisUtil getJedisUtil() {
    913         RedisInterceptor redisInterceptor = new RedisInterceptor();
    914         JedisUtil jedisUtil = (JedisUtil) redisInterceptor.getInstance(new JedisUtil());
    915         return jedisUtil;
    916     }
    917 
    918 }
    View Code

    Jedis工具类的动态代理类

     1 package com;
     2 
     3 import java.lang.reflect.Method;
     4 
     5 import org.apache.logging.log4j.Logger;
     6 import org.springframework.cglib.proxy.Enhancer;
     7 import org.springframework.cglib.proxy.MethodInterceptor;
     8 import org.springframework.cglib.proxy.MethodProxy;
     9 
    10 /**
    11  * Jedis工具类的动态代理
    12  * 自动获取连接及归还连接
    13  * @author zaizouGGG
    14 * 15 */ 16 public class RedisInterceptor implements MethodInterceptor { 17 18 private Logger logger = LogUtil.get(RedisInterceptor.class); 19 private JedisUtil targetObject; 20 // 这里的目标类型为Object,则可以接受任意一种参数作为被代理类,实现了动态代理 21 public Object getInstance(JedisUtil target) { 22 // 设置需要创建子类的类 23 this.targetObject = target; 24 Enhancer enhancer = new Enhancer(); 25 enhancer.setSuperclass(target.getClass()); 26 enhancer.setCallback(this); 27 return enhancer.create(); 28 } 29 30 @Override 31 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { 32 // TODO Auto-generated method stub 33 targetObject.setJedis(RedisPool.getJedis()); 34 logger.info("获取连接后连接池状态"+RedisPool.getNumActive() + "-" + RedisPool.getNumIdle() + "-" + RedisPool.getNumWaiters()); 35 Object result = proxy.invoke(targetObject, args); 36 RedisPool.returnJedis(targetObject.getJedis()); 37 logger.info("归还连接后连接池状态"+RedisPool.getNumActive() + "-" + RedisPool.getNumIdle() + "-" + RedisPool.getNumWaiters()); 38 return result; 39 } 40 41 }

    操作代码

    public static void main(String[] args){
        //实例化一个增强的工具类
        JedisUtil jedisUtil = JedisUtil.getJedisUtil();
        //进行相关操作即可
        value = jedisUtil.get(key);
    }
  • 相关阅读:
    招行面试
    今日头条面试[教育岗]
    四方精创 面试
    ArrayList 源码
    redis缓存,穿透,击穿,雪崩
    hashMap
    集合整理
    阿里CBU技术部一面
    网安面试
    php递归获取顶级父类id
  • 原文地址:https://www.cnblogs.com/zaizouggg/p/11930723.html
Copyright © 2020-2023  润新知