本次使用動態代理的初衷是學習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 }
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); }