動態代理模式_應用(Redis工具類)

本次使用動態代理的初衷是學習Redis,使用Java操做Redis時用到Jedis的JedisPool,然後對Jedis的方法進一步封裝完善成爲一個工具類。
由於直接使用Jedis對象時,爲了保證性能,總會須要手動的獲取到鏈接池中的鏈接,使用完成後還須要手動的釋放鏈接,都是徹底重複的操做。
因此想要使用一些方法來抽取出這些重複操做,初時想到的是使用模板方法或是動態代理,但考慮到到模板方法會使用到大量的類,彷佛與主旨不符,遂使用動態代理進行增強。java

實現動態代理可以使用JDK對應的方法,或是CGlib。因爲工具類自己不會去定義接口,因此選擇CGlib。自己是在SpringBoot項目中進行,因此沒有額外導入CGlib的包(spring的面向切面就使用到了CGlib與JDK自帶的動態 代理)。redis

具體的思路就是使用動態代理來加強工具類對象,使得工具類在調用方法先後對應的進行獲取鏈接及釋放鏈接操做。在得到到加強工具類後只須要進行相關操做便可。spring

使用了Maven來管理項目,代碼所需的依賴以下apache

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

此外還須要本身電腦安裝Redis,或有對應的服務器數組

代碼以下tomcat

 

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配置文件的工具類app

用於讀取配置在.properties中的參數ide

 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);
}
相關文章
相關標籤/搜索