1.
maven項目,加入這一個依賴包即可,
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
使用2.9.0版本的原因是穩定,且3以上的版本有問題,部分參數會缺失

2.
配置文件redis.properties,
redis.hostname=127.0.0.1
redis.port=6379
redis.database=0
redis.pool.maxActive=600
redis.pool.maxIdle=300
redis.pool.maxWait=3000
redis.pool.testOnBorrow=true
redis.password=853396015
redis.timeout=2000

3.
新建一個xml文件,名為 redisSpringContext.xml ,打開折疊可查看
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 7 http://www.springframework.org/schema/context 8 http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 9 10 <!-- <!– 導入redis數據庫配置文件 –>--> 11 <context:property-placeholder location="classpath:redis.properties"/> 12 13 <!-- Redis連接池配置 --> 14 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> 15 <!-- 控制一個pool能分配多少個jedis實例 --> 16 <property name="maxTotal" value="${redis.pool.maxActive}"/> 17 <!-- 連接池中最多空閑多少個maxIdle個連接,這里為20,表示即使沒有數據庫連接時依然可以保持20空閑的連接,而不被清除,處於待命狀態,隨時連接 --> 18 <property name="maxIdle" value="${redis.pool.maxIdle}"/> 19 <!-- 最大等待時間,當沒有可用連接時,連接池等待連接被歸還的最大時間(以毫秒計數),超過時間即拋出異常 --> 20 <property name="maxWaitMillis" value="${redis.pool.maxWait}"/> 21 <!-- 在獲取連接時,檢查有效性 --> 22 <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/> 23 </bean> 24 <!-- 創建Redis連接池,並做相關配置 --> 25 <bean id="jedisWritePool" class="redis.JedisPoolWriper" 26 depends-on="jedisPoolConfig"> 27 <constructor-arg index="0" ref="jedisPoolConfig"/> 28 <constructor-arg index="1" value="${redis.hostname}"/> 29 <constructor-arg index="2" value="${redis.port}" type="int"/> 30 <constructor-arg index="3" value="${redis.timeout}" type="int"/> 31 <constructor-arg index="4" value="${redis.password}"/> 32 </bean> 33 <!-- 創建Redis工具類,封裝好Redis的連接以進行相關操作 --> 34 <bean id="jedisUtil" class="redis.JedisUtil" 35 > 36 <property name="jedisPool" ref="jedisWritePool"/> 37 </bean> 38 <!-- 這里的紅色下划線提示不是指寫錯了,而是警告,如果使用自動補全修正,會報錯UnsatisfiedDependencyException 39 為什么使用$進行隔開呢,是因為這是兩個類嵌套定義,因為不是文件路徑,無法使用.符號進行區分,故使用$符號時沒問題的 40 --> 41 <bean id="jedisKeys" class="redis.JedisUtil$Keys" 42 > 43 <constructor-arg ref="jedisUtil"/> 44 </bean> 45 <bean id="jedisStrings" class="redis.JedisUtil$Strings" 46 > 47 <constructor-arg ref="jedisUtil"/> 48 </bean> 49 <bean id="jedisLists" class="redis.JedisUtil$Lists" 50 > 51 <constructor-arg ref="jedisUtil"/> 52 </bean> 53 <bean id="jedisSets" class="redis.JedisUtil$Sets" 54 > 55 <constructor-arg ref="jedisUtil"/> 56 </bean> 57 <bean id="jedisHash" class="redis.JedisUtil$Hash" 58 scope="singleton"> 59 <constructor-arg ref="jedisUtil"/> 60 </bean> 61 62 </beans>

記得將該xml文件導入
dispatcher-servlet.xml中
<import resource="redisSpringContext.xml"/>

4.
新建兩個類,

1 package redis; 2 3 import redis.clients.jedis.JedisPool; 4 import redis.clients.jedis.JedisPoolConfig; 5 6 /** 7 * 強指定redis的JedisPool接口構造函數,這樣才能在centos成功創建jedispool 8 * 9 * @author xiangze 10 * 11 */ 12 public class JedisPoolWriper { 13 //連接池對象 14 private JedisPool jedisPool; 15 16 public JedisPoolWriper(final JedisPoolConfig poolConfig, final String host, 17 final int port ,final int timeout ,final String password) { 18 try { 19 //通過連接池配置信息,IP,端口構造連接池對象 20 jedisPool = new JedisPool(poolConfig, host, port,timeout,password); 21 } catch (Exception e) { 22 e.printStackTrace(); 23 } 24 } 25 //獲取redis連接池對象 26 public JedisPool getJedisPool() { 27 return jedisPool; 28 } 29 //注入redis連接池對象 30 public void setJedisPool(JedisPool jedisPool) { 31 this.jedisPool = jedisPool; 32 } 33 34 }
1 package redis; 2 3 4 5 import java.util.List; 6 import java.util.Map; 7 import java.util.Set; 8 9 import redis.clients.jedis.Jedis; 10 import redis.clients.jedis.JedisPool; 11 import redis.clients.jedis.SortingParams; 12 13 import redis.clients.jedis.BinaryClient.LIST_POSITION; 14 import redis.clients.util.SafeEncoder; 15 16 /* 17 下面這兩個在高版本的redis.clients依賴包里面沒有,需要降低版本才有,如2.9.0 18 *import redis.clients.jedis.BinaryClient.LIST_POSITION; 19 import redis.clients.util.SafeEncoder; 20 */ 21 22 public class JedisUtil { 23 /** 24 * 緩存生存時間 25 */ 26 private final int expire = 60000; 27 /** 操作Key的方法 */ 28 public Keys KEYS; 29 /** 對存儲結構為Set類型的操作 */ 30 public Sets SETS; 31 /** 對存儲結構為HashMap類型的操作 */ 32 public Hash HASH; 33 /** 對存儲結構為String類型的操作 */ 34 public Strings STRINGS; 35 /** 對存儲結構為List類型的操作 */ 36 public Lists LISTS; 37 38 39 40 private JedisPool jedisPool; 41 42 public JedisPool getJedisPool() { 43 return jedisPool; 44 } 45 46 public void setJedisPool(JedisPoolWriper jedisPoolWriper) { 47 this.jedisPool = jedisPoolWriper.getJedisPool(); 48 } 49 50 public JedisPool getPool() { 51 return jedisPool; 52 } 53 54 /** 55 * 從jedis連接池中獲取獲取jedis對象 56 * 57 * @return 58 */ 59 public Jedis getJedis() { 60 return jedisPool.getResource(); 61 } 62 63 /** 64 * 設置過期時間 65 * 66 * @author ruan 2013-4-11 67 * @param key 68 * @param seconds 69 */ 70 public void expire(String key, int seconds) { 71 if (seconds <= 0) { 72 return; 73 } 74 Jedis jedis = getJedis(); 75 jedis.expire(key, seconds); 76 jedis.close(); 77 } 78 79 /** 80 * 設置默認過期時間 81 * 82 * @author ruan 2013-4-11 83 * @param key 84 */ 85 public void expire(String key) { 86 expire(key, expire); 87 } 88 89 // *******************************************Keys*******************************************// 90 public class Keys { 91 92 93 /** 94 * 清空所有key 95 */ 96 public String flushAll() { 97 Jedis jedis = getJedis(); 98 String stata = jedis.flushAll(); 99 jedis.close(); 100 return stata; 101 } 102 103 /** 104 * 更改key 105 * 106 // * @param String 107 * oldkey 108 // * @param String 109 * newkey 110 * @return 狀態碼 111 * */ 112 public String rename(String oldkey, String newkey) { 113 return rename(SafeEncoder.encode(oldkey), 114 SafeEncoder.encode(newkey)); 115 } 116 117 /** 118 * 更改key,僅當新key不存在時才執行 119 * 120 // * @param String 121 * oldkey 122 // * @param String 123 * newkey 124 * @return 狀態碼 125 * */ 126 public long renamenx(String oldkey, String newkey) { 127 Jedis jedis = getJedis(); 128 long status = jedis.renamenx(oldkey, newkey); 129 jedis.close(); 130 return status; 131 } 132 133 /** 134 * 更改key 135 * 136 // * @param String 137 * oldkey 138 // * @param String 139 * newkey 140 * @return 狀態碼 141 * */ 142 public String rename(byte[] oldkey, byte[] newkey) { 143 Jedis jedis = getJedis(); 144 String status = jedis.rename(oldkey, newkey); 145 jedis.close(); 146 return status; 147 } 148 149 /** 150 * 設置key的過期時間,以秒為單位 151 * 152 // * @param String 153 * key 154 // * @param 時間 155 * ,已秒為單位 156 * @return 影響的記錄數 157 * */ 158 public long expired(String key, int seconds) { 159 Jedis jedis = getJedis(); 160 long count = jedis.expire(key, seconds); 161 jedis.close(); 162 return count; 163 } 164 165 /** 166 * 設置key的過期時間,它是距歷元(即格林威治標准時間 1970 年 1 月 1 日的 00:00:00,格里高利歷)的偏移量。 167 * 168 // * @param String 169 * key 170 // * @param 時間 171 * ,已秒為單位 172 * @return 影響的記錄數 173 * */ 174 public long expireAt(String key, long timestamp) { 175 Jedis jedis = getJedis(); 176 long count = jedis.expireAt(key, timestamp); 177 jedis.close(); 178 return count; 179 } 180 181 /** 182 * 查詢key的過期時間 183 * 184 // * @param String 185 * key 186 * @return 以秒為單位的時間表示 187 * */ 188 public long ttl(String key) { 189 // ShardedJedis sjedis = getShardedJedis(); 190 Jedis sjedis = getJedis(); 191 long len = sjedis.ttl(key); 192 sjedis.close(); 193 return len; 194 } 195 196 /** 197 * 取消對key過期時間的設置 198 * 199 * @param key 200 * @return 影響的記錄數 201 * */ 202 public long persist(String key) { 203 Jedis jedis = getJedis(); 204 long count = jedis.persist(key); 205 jedis.close(); 206 return count; 207 } 208 209 /** 210 * 刪除keys對應的記錄,可以是多個key 211 * 212 // * @param String 213 * ... keys 214 * @return 刪除的記錄數 215 * */ 216 public long del(String... keys) { 217 Jedis jedis = getJedis(); 218 long count = jedis.del(keys); 219 jedis.close(); 220 return count; 221 } 222 223 // String…是java5新加入的功能,表示的是一個可變長度的參數列表。 224 // 其語法就是類型后跟…,表示此處接受的參數為0到多個Object類型的對象,或者是一個Object[]。 225 // 例如我們有一個方法叫做test(String…strings),那么你還可以寫方法test(),但你不能寫test(String[] strings), 226 // 這樣會出編譯錯誤,系統提示出現重復的方法。 227 // 在使用的時候,對於test(String…strings),你可以直接用test()去調用,標示沒有參數,也可以用去test(“aaa”), 228 // 也可以用test(new String[]{“aaa”,”bbb”})。 229 // 另外如果既有test(String…strings)函數,又有test()函數,我們在調用test()時,會優先使用test()函數。 230 // 只有當沒有test()函數式,我們調用test(),程序才會走test(String…strings)。 231 232 233 /** 234 * 刪除keys對應的記錄,可以是多個key 235 * 236 // * @param String 237 * ... keys 238 * @return 刪除的記錄數 239 * */ 240 public long del(byte[]... keys) { 241 Jedis jedis = getJedis(); 242 long count = jedis.del(keys); 243 jedis.close(); 244 return count; 245 } 246 247 /** 248 * 判斷key是否存在 249 * 250 // * @param String 251 * key 252 * @return boolean 253 * */ 254 public boolean exists(String key) { 255 // ShardedJedis sjedis = getShardedJedis(); 256 Jedis sjedis = getJedis(); 257 boolean exis = sjedis.exists(key); 258 sjedis.close(); 259 return exis; 260 } 261 262 /** 263 * 對List,Set,SortSet進行排序,如果集合數據較大應避免使用這個方法 264 * 265 // * @param String 266 * key 267 * @return List<String> 集合的全部記錄 268 * **/ 269 public List<String> sort(String key) { 270 // ShardedJedis sjedis = getShardedJedis(); 271 Jedis sjedis = getJedis(); 272 List<String> list = sjedis.sort(key); 273 sjedis.close(); 274 return list; 275 } 276 277 /** 278 * 對List,Set,SortSet進行排序或limit 279 * 280 // * @param String 281 * key 282 // * @param SortingParams 283 * parame 定義排序類型或limit的起止位置. 284 * @return List<String> 全部或部分記錄 285 * **/ 286 public List<String> sort(String key, SortingParams parame) { 287 // ShardedJedis sjedis = getShardedJedis(); 288 Jedis sjedis = getJedis(); 289 List<String> list = sjedis.sort(key, parame); 290 sjedis.close(); 291 return list; 292 } 293 294 /** 295 * 返回指定key存儲的類型 296 * 297 // * @param String 298 * key 299 * @return String string|list|set|zset|hash 300 * **/ 301 public String type(String key) { 302 // ShardedJedis sjedis = getShardedJedis(); 303 Jedis sjedis = getJedis(); 304 String type = sjedis.type(key); 305 sjedis.close(); 306 return type; 307 } 308 309 /** 310 * 查找所有匹配給定的模式的鍵 311 * 312 // * @param String 313 * key的表達式,*表示多個,?表示一個 314 * */ 315 public Set<String> keys(String pattern) { 316 Jedis jedis = getJedis(); 317 Set<String> set = jedis.keys(pattern); 318 jedis.close(); 319 return set; 320 } 321 } 322 323 // *******************************************Sets*******************************************// 324 public class Sets { 325 326 327 /** 328 * 向Set添加一條記錄,如果member已存在返回0,否則返回1 329 * 330 // * @param String 331 * key 332 // * @param String 333 * member 334 * @return 操作碼,0或1 335 * */ 336 public long sadd(String key, String member) { 337 Jedis jedis = getJedis(); 338 long s = jedis.sadd(key, member); 339 jedis.close(); 340 return s; 341 } 342 343 public long sadd(byte[] key, byte[] member) { 344 Jedis jedis = getJedis(); 345 long s = jedis.sadd(key, member); 346 jedis.close(); 347 return s; 348 } 349 350 /** 351 * 獲取給定key中元素個數 352 * 353 // * @param String 354 * key 355 * @return 元素個數 356 * */ 357 public long scard(String key) { 358 // ShardedJedis sjedis = getShardedJedis(); 359 Jedis sjedis = getJedis(); 360 long len = sjedis.scard(key); 361 sjedis.close(); 362 return len; 363 } 364 365 /** 366 * 返回從第一組和所有的給定集合之間的差異的成員 367 * 368 // * @param String 369 * ... keys 370 * @return 差異的成員集合 371 * */ 372 public Set<String> sdiff(String... keys) { 373 Jedis jedis = getJedis(); 374 Set<String> set = jedis.sdiff(keys); 375 jedis.close(); 376 return set; 377 } 378 379 /** 380 * 這個命令等於sdiff,但返回的不是結果集,而是將結果集存儲在新的集合中,如果目標已存在,則覆蓋。 381 * 382 // * @param String 383 * newkey 新結果集的key 384 // * @param String 385 * ... keys 比較的集合 386 * @return 新集合中的記錄數 387 * **/ 388 public long sdiffstore(String newkey, String... keys) { 389 Jedis jedis = getJedis(); 390 long s = jedis.sdiffstore(newkey, keys); 391 jedis.close(); 392 return s; 393 } 394 395 /** 396 * 返回給定集合交集的成員,如果其中一個集合為不存在或為空,則返回空Set 397 * 398 // * @param String 399 * ... keys 400 * @return 交集成員的集合 401 * **/ 402 public Set<String> sinter(String... keys) { 403 Jedis jedis = getJedis(); 404 Set<String> set = jedis.sinter(keys); 405 jedis.close(); 406 return set; 407 } 408 409 /** 410 * 這個命令等於sinter,但返回的不是結果集,而是將結果集存儲在新的集合中,如果目標已存在,則覆蓋。 411 * 412 // * @param String 413 * newkey 新結果集的key 414 // * @param String 415 * ... keys 比較的集合 416 * @return 新集合中的記錄數 417 * **/ 418 public long sinterstore(String newkey, String... keys) { 419 Jedis jedis = getJedis(); 420 long s = jedis.sinterstore(newkey, keys); 421 jedis.close(); 422 return s; 423 } 424 425 /** 426 * 確定一個給定的值是否存在 427 * 428 // * @param String 429 * key 430 // * @param String 431 * member 要判斷的值 432 * @return 存在返回1,不存在返回0 433 * **/ 434 public boolean sismember(String key, String member) { 435 // ShardedJedis sjedis = getShardedJedis(); 436 Jedis sjedis = getJedis(); 437 boolean s = sjedis.sismember(key, member); 438 sjedis.close(); 439 return s; 440 } 441 442 /** 443 * 返回集合中的所有成員 444 * 445 // * @param String 446 * key 447 * @return 成員集合 448 * */ 449 public Set<String> smembers(String key) { 450 // ShardedJedis sjedis = getShardedJedis(); 451 Jedis sjedis = getJedis(); 452 Set<String> set = sjedis.smembers(key); 453 sjedis.close(); 454 return set; 455 } 456 457 public Set<byte[]> smembers(byte[] key) { 458 // ShardedJedis sjedis = getShardedJedis(); 459 Jedis sjedis = getJedis(); 460 Set<byte[]> set = sjedis.smembers(key); 461 sjedis.close(); 462 return set; 463 } 464 465 /** 466 * 將成員從源集合移出放入目標集合 <br/> 467 * 如果源集合不存在或不包哈指定成員,不進行任何操作,返回0<br/> 468 * 否則該成員從源集合上刪除,並添加到目標集合,如果目標集合中成員已存在,則只在源集合進行刪除 469 * 470 // * @param String 471 * srckey 源集合 472 // * @param String 473 * dstkey 目標集合 474 // * @param String 475 * member 源集合中的成員 476 * @return 狀態碼,1成功,0失敗 477 * */ 478 public long smove(String srckey, String dstkey, String member) { 479 Jedis jedis = getJedis(); 480 long s = jedis.smove(srckey, dstkey, member); 481 jedis.close(); 482 return s; 483 } 484 485 /** 486 * 從集合中刪除成員 487 * 488 // * @param String 489 * key 490 * @return 被刪除的成員 491 * */ 492 public String spop(String key) { 493 Jedis jedis = getJedis(); 494 String s = jedis.spop(key); 495 jedis.close(); 496 return s; 497 } 498 499 /** 500 * 從集合中刪除指定成員 501 * 502 // * @param String 503 * key 504 // * @param String 505 * member 要刪除的成員 506 * @return 狀態碼,成功返回1,成員不存在返回0 507 * */ 508 public long srem(String key, String member) { 509 Jedis jedis = getJedis(); 510 long s = jedis.srem(key, member); 511 jedis.close(); 512 return s; 513 } 514 515 /** 516 * 合並多個集合並返回合並后的結果,合並后的結果集合並不保存<br/> 517 * 518 // * @param String 519 * ... keys 520 * @return 合並后的結果集合 521 // * @see sunionstore 522 * */ 523 public Set<String> sunion(String... keys) { 524 Jedis jedis = getJedis(); 525 Set<String> set = jedis.sunion(keys); 526 jedis.close(); 527 return set; 528 } 529 530 /** 531 * 合並多個集合並將合並后的結果集保存在指定的新集合中,如果新集合已經存在則覆蓋 532 * 533 // * @param String 534 * newkey 新集合的key 535 // * @param String 536 * ... keys 要合並的集合 537 * **/ 538 public long sunionstore(String newkey, String... keys) { 539 Jedis jedis = getJedis(); 540 long s = jedis.sunionstore(newkey, keys); 541 jedis.close(); 542 return s; 543 } 544 } 545 546 // *******************************************Hash*******************************************// 547 public class Hash { 548 549 /** 550 * 從hash中刪除指定的存儲 551 * 552 // * @param String 553 * key 554 // * @param String 555 * fieid 存儲的名字 556 * @return 狀態碼,1成功,0失敗 557 * */ 558 public long hdel(String key, String fieid) { 559 Jedis jedis = getJedis(); 560 long s = jedis.hdel(key, fieid); 561 jedis.close(); 562 return s; 563 } 564 565 public long hdel(String key) { 566 Jedis jedis = getJedis(); 567 long s = jedis.del(key); 568 jedis.close(); 569 return s; 570 } 571 572 /** 573 * 測試hash中指定的存儲是否存在 574 * 575 // * @param String 576 * key 577 // * @param String 578 * fieid 存儲的名字 579 * @return 1存在,0不存在 580 * */ 581 public boolean hexists(String key, String fieid) { 582 // ShardedJedis sjedis = getShardedJedis(); 583 Jedis sjedis = getJedis(); 584 boolean s = sjedis.hexists(key, fieid); 585 sjedis.close(); 586 return s; 587 } 588 589 /** 590 * 返回hash中指定存儲位置的值 591 * 592 // * @param String 593 * key 594 // * @param String 595 * fieid 存儲的名字 596 * @return 存儲對應的值 597 * */ 598 public String hget(String key, String fieid) { 599 // ShardedJedis sjedis = getShardedJedis(); 600 Jedis sjedis = getJedis(); 601 String s = sjedis.hget(key, fieid); 602 sjedis.close(); 603 return s; 604 } 605 606 public byte[] hget(byte[] key, byte[] fieid) { 607 // ShardedJedis sjedis = getShardedJedis(); 608 Jedis sjedis = getJedis(); 609 byte[] s = sjedis.hget(key, fieid); 610 sjedis.close(); 611 return s; 612 } 613 614 /** 615 * 以Map的形式返回hash中的存儲和值 616 * 617 // * @param String 618 * key 619 * @return Map<Strinig,String> 620 * */ 621 public Map<String, String> hgetAll(String key) { 622 // ShardedJedis sjedis = getShardedJedis(); 623 Jedis sjedis = getJedis(); 624 Map<String, String> map = sjedis.hgetAll(key); 625 sjedis.close(); 626 return map; 627 } 628 629 /** 630 * 添加一個對應關系 631 * 632 // * @param String 633 * key 634 // * @param String 635 * fieid 636 // * @param String 637 * value 638 * @return 狀態碼 1成功,0失敗,fieid已存在將更新,也返回0 639 * **/ 640 public long hset(String key, String fieid, String value) { 641 Jedis jedis = getJedis(); 642 long s = jedis.hset(key, fieid, value); 643 jedis.close(); 644 return s; 645 } 646 647 public long hset(String key, String fieid, byte[] value) { 648 Jedis jedis = getJedis(); 649 long s = jedis.hset(key.getBytes(), fieid.getBytes(), value); 650 jedis.close(); 651 return s; 652 } 653 654 /** 655 * 添加對應關系,只有在fieid不存在時才執行 656 * 657 // * @param String 658 * key 659 // * @param String 660 * fieid 661 // * @param String 662 * value 663 * @return 狀態碼 1成功,0失敗fieid已存 664 * **/ 665 public long hsetnx(String key, String fieid, String value) { 666 Jedis jedis = getJedis(); 667 long s = jedis.hsetnx(key, fieid, value); 668 jedis.close(); 669 return s; 670 } 671 672 /** 673 * 獲取hash中value的集合 674 * 675 // * @param String 676 * key 677 * @return List<String> 678 * */ 679 public List<String> hvals(String key) { 680 // ShardedJedis sjedis = getShardedJedis(); 681 Jedis sjedis = getJedis(); 682 List<String> list = sjedis.hvals(key); 683 sjedis.close(); 684 return list; 685 } 686 687 /** 688 * 在指定的存儲位置加上指定的數字,存儲位置的值必須可轉為數字類型 689 * 690 // * @param String 691 * key 692 // * @param String 693 * fieid 存儲位置 694 // * @param String 695 * long value 要增加的值,可以是負數 696 * @return 增加指定數字后,存儲位置的值 697 * */ 698 public long hincrby(String key, String fieid, long value) { 699 Jedis jedis = getJedis(); 700 long s = jedis.hincrBy(key, fieid, value); 701 jedis.close(); 702 return s; 703 } 704 705 /** 706 * 返回指定hash中的所有存儲名字,類似Map中的keySet方法 707 * 708 // * @param String 709 * key 710 * @return Set<String> 存儲名稱的集合 711 * */ 712 public Set<String> hkeys(String key) { 713 // ShardedJedis sjedis = getShardedJedis(); 714 Jedis sjedis = getJedis(); 715 Set<String> set = sjedis.hkeys(key); 716 sjedis.close(); 717 return set; 718 } 719 720 /** 721 * 獲取hash中存儲的個數,類似Map中size方法 722 * 723 // * @param String 724 * key 725 * @return long 存儲的個數 726 * */ 727 public long hlen(String key) { 728 // ShardedJedis sjedis = getShardedJedis(); 729 Jedis sjedis = getJedis(); 730 long len = sjedis.hlen(key); 731 sjedis.close(); 732 return len; 733 } 734 735 /** 736 * 根據多個key,獲取對應的value,返回List,如果指定的key不存在,List對應位置為null 737 * 738 // * @param String 739 * key 740 // * @param String 741 * ... fieids 存儲位置 742 * @return List<String> 743 * */ 744 public List<String> hmget(String key, String... fieids) { 745 // ShardedJedis sjedis = getShardedJedis(); 746 Jedis sjedis = getJedis(); 747 List<String> list = sjedis.hmget(key, fieids); 748 sjedis.close(); 749 return list; 750 } 751 752 public List<byte[]> hmget(byte[] key, byte[]... fieids) { 753 // ShardedJedis sjedis = getShardedJedis(); 754 Jedis sjedis = getJedis(); 755 List<byte[]> list = sjedis.hmget(key, fieids); 756 sjedis.close(); 757 return list; 758 } 759 760 /** 761 * 添加對應關系,如果對應關系已存在,則覆蓋 762 * 763 // * @param Strin 764 * key 765 // * @param Map 766 * <String,String> 對應關系 767 * @return 狀態,成功返回OK 768 * */ 769 public String hmset(String key, Map<String, String> map) { 770 Jedis jedis = getJedis(); 771 String s = jedis.hmset(key, map); 772 jedis.close(); 773 return s; 774 } 775 776 /** 777 * 添加對應關系,如果對應關系已存在,則覆蓋 778 * 779 // * @param Strin 780 * key 781 // * @param Map 782 * <String,String> 對應關系 783 * @return 狀態,成功返回OK 784 * */ 785 public String hmset(byte[] key, Map<byte[], byte[]> map) { 786 Jedis jedis = getJedis(); 787 String s = jedis.hmset(key, map); 788 jedis.close(); 789 return s; 790 } 791 792 } 793 794 // *******************************************Strings*******************************************// 795 public class Strings { 796 797 798 799 /** 800 * 根據key獲取記錄 801 * 802 // * @param String 803 * key 804 * @return 值 805 * */ 806 public String get(String key) { 807 // ShardedJedis sjedis = getShardedJedis(); 808 Jedis sjedis = getJedis(); 809 String value = sjedis.get(key); 810 sjedis.close(); 811 return value; 812 } 813 814 /** 815 * 根據key獲取記錄 816 * 817 // * @param byte[] key 818 * @return 值 819 * */ 820 public byte[] get(byte[] key) { 821 // ShardedJedis sjedis = getShardedJedis(); 822 Jedis sjedis = getJedis(); 823 byte[] value = sjedis.get(key); 824 sjedis.close(); 825 return value; 826 } 827 828 /** 829 * 添加有過期時間的記錄 830 * 831 // * @param String 832 * key 833 // * @param int seconds 過期時間,以秒為單位 834 // * @param String 835 * value 836 * @return String 操作狀態 837 * */ 838 public String setEx(String key, int seconds, String value) { 839 Jedis jedis = getJedis(); 840 String str = jedis.setex(key, seconds, value); 841 jedis.close(); 842 return str; 843 } 844 845 /** 846 * 添加有過期時間的記錄 847 * 848 // * @param String 849 * key 850 // * @param int seconds 過期時間,以秒為單位 851 // * @param String 852 * value 853 * @return String 操作狀態 854 * */ 855 public String setEx(byte[] key, int seconds, byte[] value) { 856 Jedis jedis = getJedis(); 857 String str = jedis.setex(key, seconds, value); 858 jedis.close(); 859 return str; 860 } 861 862 /** 863 * 添加一條記錄,僅當給定的key不存在時才插入 864 * 865 // * @param String 866 * key 867 // * @param String 868 * value 869 * @return long 狀態碼,1插入成功且key不存在,0未插入,key存在 870 * */ 871 public long setnx(String key, String value) { 872 Jedis jedis = getJedis(); 873 long str = jedis.setnx(key, value); 874 jedis.close(); 875 return str; 876 } 877 878 /** 879 * 添加記錄,如果記錄已存在將覆蓋原有的value 880 * 881 // * @param String 882 * key 883 // * @param String 884 * value 885 * @return 狀態碼 886 * */ 887 public String set(String key, String value) { 888 return set(SafeEncoder.encode(key), SafeEncoder.encode(value)); 889 } 890 891 /** 892 * 添加記錄,如果記錄已存在將覆蓋原有的value 893 * 894 // * @param String 895 * key 896 // * @param String 897 * value 898 * @return 狀態碼 899 * */ 900 public String set(String key, byte[] value) { 901 return set(SafeEncoder.encode(key), value); 902 } 903 904 /** 905 * 添加記錄,如果記錄已存在將覆蓋原有的value 906 * 907 // * @param byte[] key 908 // * @param byte[] value 909 * @return 狀態碼 910 * */ 911 public String set(byte[] key, byte[] value) { 912 Jedis jedis = getJedis(); 913 String status = jedis.set(key, value); 914 jedis.close(); 915 return status; 916 } 917 918 /** 919 * 從指定位置開始插入數據,插入的數據會覆蓋指定位置以后的數據<br/> 920 * 例:String str1="123456789";<br/> 921 * 對str1操作后setRange(key,4,0000),str1="123400009"; 922 * 923 // * @param String 924 // * key 925 // * @param long offset 926 // * @param String 927 * value 928 * @return long value的長度 929 * */ 930 public long setRange(String key, long offset, String value) { 931 Jedis jedis = getJedis(); 932 long len = jedis.setrange(key, offset, value); 933 jedis.close(); 934 return len; 935 } 936 937 /** 938 * 在指定的key中追加value 939 * 940 // * @param String 941 // * key 942 // * @param String 943 * value 944 * @return long 追加后value的長度 945 * **/ 946 public long append(String key, String value) { 947 Jedis jedis = getJedis(); 948 long len = jedis.append(key, value); 949 jedis.close(); 950 return len; 951 } 952 953 /** 954 * 將key對應的value減去指定的值,只有value可以轉為數字時該方法才可用 955 * 956 // * @param String 957 // * key 958 // * @param long number 要減去的值 959 * @return long 減指定值后的值 960 * */ 961 public long decrBy(String key, long number) { 962 Jedis jedis = getJedis(); 963 long len = jedis.decrBy(key, number); 964 jedis.close(); 965 return len; 966 } 967 968 /** 969 * <b>可以作為獲取唯一id的方法</b><br/> 970 * 將key對應的value加上指定的值,只有value可以轉為數字時該方法才可用 971 * 972 // * @param String 973 // * key 974 // * @param long number 要減去的值 975 * @return long 相加后的值 976 * */ 977 public long incrBy(String key, long number) { 978 Jedis jedis = getJedis(); 979 long len = jedis.incrBy(key, number); 980 jedis.close(); 981 return len; 982 } 983 984 /** 985 * 對指定key對應的value進行截取 986 * 987 // * @param String 988 // * key 989 // * @param long startOffset 開始位置(包含) 990 // * @param long endOffset 結束位置(包含) 991 * @return String 截取的值 992 * */ 993 public String getrange(String key, long startOffset, long endOffset) { 994 // ShardedJedis sjedis = getShardedJedis(); 995 Jedis sjedis = getJedis(); 996 String value = sjedis.getrange(key, startOffset, endOffset); 997 sjedis.close(); 998 return value; 999 } 1000 1001 /** 1002 * 獲取並設置指定key對應的value<br/> 1003 * 如果key存在返回之前的value,否則返回null 1004 * 1005 // * @param String 1006 // * key 1007 // * @param String 1008 * value 1009 * @return String 原始value或null 1010 * */ 1011 public String getSet(String key, String value) { 1012 Jedis jedis = getJedis(); 1013 String str = jedis.getSet(key, value); 1014 jedis.close(); 1015 return str; 1016 } 1017 1018 /** 1019 * 批量獲取記錄,如果指定的key不存在返回List的對應位置將是null 1020 * 1021 // * @param String 1022 * keys 1023 * @return List<String> 值得集合 1024 * */ 1025 public List<String> mget(String... keys) { 1026 Jedis jedis = getJedis(); 1027 List<String> str = jedis.mget(keys); 1028 jedis.close(); 1029 return str; 1030 } 1031 1032 /** 1033 * 批量存儲記錄 1034 * 1035 // * @param String 1036 * keysvalues 例:keysvalues="key1","value1","key2","value2"; 1037 * @return String 狀態碼 1038 * */ 1039 public String mset(String... keysvalues) { 1040 Jedis jedis = getJedis(); 1041 String str = jedis.mset(keysvalues); 1042 jedis.close(); 1043 return str; 1044 } 1045 1046 /** 1047 * 獲取key對應的值的長度 1048 * 1049 // * @param String 1050 * key 1051 * @return value值得長度 1052 * */ 1053 public long strlen(String key) { 1054 Jedis jedis = getJedis(); 1055 long len = jedis.strlen(key); 1056 jedis.close(); 1057 return len; 1058 } 1059 } 1060 1061 // *******************************************Lists*******************************************// 1062 public class Lists { 1063 1064 1065 /** 1066 * List長度 1067 * 1068 // * @param String 1069 * key 1070 * @return 長度 1071 * */ 1072 public long llen(String key) { 1073 return llen(SafeEncoder.encode(key)); 1074 } 1075 1076 /** 1077 * List長度 1078 * 1079 // * @param byte[] key 1080 * @return 長度 1081 * */ 1082 public long llen(byte[] key) { 1083 // ShardedJedis sjedis = getShardedJedis(); 1084 Jedis sjedis = getJedis(); 1085 long count = sjedis.llen(key); 1086 sjedis.close(); 1087 return count; 1088 } 1089 1090 /** 1091 * 覆蓋操作,將覆蓋List中指定位置的值 1092 * 1093 // * @param byte[] key 1094 // * @param int index 位置 1095 // * @param byte[] value 值 1096 * @return 狀態碼 1097 * */ 1098 public String lset(byte[] key, int index, byte[] value) { 1099 Jedis jedis = getJedis(); 1100 String status = jedis.lset(key, index, value); 1101 jedis.close(); 1102 return status; 1103 } 1104 1105 /** 1106 * 覆蓋操作,將覆蓋List中指定位置的值 1107 * 1108 // * @param key 1109 // * @param int index 位置 1110 // * @param String 1111 * value 值 1112 * @return 狀態碼 1113 * */ 1114 public String lset(String key, int index, String value) { 1115 return lset(SafeEncoder.encode(key), index, 1116 SafeEncoder.encode(value)); 1117 } 1118 1119 /** 1120 * 在value的相對位置插入記錄 1121 * 1122 // * @param key 1123 // * @param LIST_POSITION 1124 // * 前面插入或后面插入 1125 // * @param String 1126 // * pivot 相對位置的內容 1127 // * @param String 1128 // * value 插入的內容 1129 * @return 記錄總數 1130 * */ 1131 public long linsert(String key, LIST_POSITION where, String pivot, 1132 String value) { 1133 return linsert(SafeEncoder.encode(key), where, 1134 SafeEncoder.encode(pivot), SafeEncoder.encode(value)); 1135 } 1136 1137 /** 1138 * 在指定位置插入記錄 1139 * 1140 // * @param String 1141 // * key 1142 // * @param LIST_POSITION 1143 // * 前面插入或后面插入 1144 // * @param byte[] pivot 相對位置的內容 1145 // * @param byte[] value 插入的內容 1146 * @return 記錄總數 1147 * */ 1148 public long linsert(byte[] key, LIST_POSITION where, byte[] pivot, 1149 byte[] value) { 1150 Jedis jedis = getJedis(); 1151 long count = jedis.linsert(key, where, pivot, value); 1152 jedis.close(); 1153 return count; 1154 } 1155 1156 /** 1157 * 獲取List中指定位置的值 1158 * 1159 // * @param String 1160 // * key 1161 // * @param int index 位置 1162 * @return 值 1163 * **/ 1164 public String lindex(String key, int index) { 1165 return SafeEncoder.encode(lindex(SafeEncoder.encode(key), index)); 1166 } 1167 1168 /** 1169 * 獲取List中指定位置的值 1170 * 1171 // * @param byte[] key 1172 // * @param int index 位置 1173 // * @return 值 1174 * **/ 1175 public byte[] lindex(byte[] key, int index) { 1176 // ShardedJedis sjedis = getShardedJedis(); 1177 Jedis sjedis = getJedis(); 1178 byte[] value = sjedis.lindex(key, index); 1179 sjedis.close(); 1180 return value; 1181 } 1182 1183 /** 1184 * 將List中的第一條記錄移出List 1185 * 1186 // * @param String 1187 * key 1188 * @return 移出的記錄 1189 * */ 1190 public String lpop(String key) { 1191 return SafeEncoder.encode(lpop(SafeEncoder.encode(key))); 1192 } 1193 1194 /** 1195 * 將List中的第一條記錄移出List 1196 * 1197 // * @param byte[] key 1198 * @return 移出的記錄 1199 * */ 1200 public byte[] lpop(byte[] key) { 1201 Jedis jedis = getJedis(); 1202 byte[] value = jedis.lpop(key); 1203 jedis.close(); 1204 return value; 1205 } 1206 1207 /** 1208 * 將List中最后第一條記錄移出List 1209 * 1210 // * @param byte[] key 1211 * @return 移出的記錄 1212 * */ 1213 public String rpop(String key) { 1214 Jedis jedis = getJedis(); 1215 String value = jedis.rpop(key); 1216 jedis.close(); 1217 return value; 1218 } 1219 1220 /** 1221 * 向List尾部追加記錄 1222 * 1223 // * @param String 1224 // * key 1225 // * @param String 1226 * value 1227 * @return 記錄總數 1228 * */ 1229 public long lpush(String key, String value) { 1230 return lpush(SafeEncoder.encode(key), SafeEncoder.encode(value)); 1231 } 1232 1233 /** 1234 * 向List頭部追加記錄 1235 * 1236 // * @param String 1237 // * key 1238 // * @param String 1239 * value 1240 * @return 記錄總數 1241 * */ 1242 public long rpush(String key, String value) { 1243 Jedis jedis = getJedis(); 1244 long count = jedis.rpush(key, value); 1245 jedis.close(); 1246 return count; 1247 } 1248 1249 /** 1250 * 向List頭部追加記錄 1251 * 1252 // * @param String 1253 // * key 1254 // * @param String 1255 * value 1256 * @return 記錄總數 1257 * */ 1258 public long rpush(byte[] key, byte[] value) { 1259 Jedis jedis = getJedis(); 1260 long count = jedis.rpush(key, value); 1261 jedis.close(); 1262 return count; 1263 } 1264 1265 /** 1266 * 向List中追加記錄 1267 * 1268 // * @param byte[] key 1269 // * @param byte[] value 1270 * @return 記錄總數 1271 * */ 1272 public long lpush(byte[] key, byte[] value) { 1273 Jedis jedis = getJedis(); 1274 long count = jedis.lpush(key, value); 1275 jedis.close(); 1276 return count; 1277 } 1278 1279 /** 1280 * 獲取指定范圍的記錄,可以做為分頁使用 1281 * 1282 // * @param String 1283 // * key 1284 // * @param long start 1285 // * @param long end 1286 * @return List 1287 * */ 1288 public List<String> lrange(String key, long start, long end) { 1289 // ShardedJedis sjedis = getShardedJedis(); 1290 Jedis sjedis = getJedis(); 1291 List<String> list = sjedis.lrange(key, start, end); 1292 sjedis.close(); 1293 return list; 1294 } 1295 1296 /** 1297 * 獲取指定范圍的記錄,可以做為分頁使用 1298 * 1299 // * @param byte[] key 1300 // * @param int start 1301 // * @param int end 如果為負數,則尾部開始計算 1302 * @return List 1303 * */ 1304 public List<byte[]> lrange(byte[] key, int start, int end) { 1305 // ShardedJedis sjedis = getShardedJedis(); 1306 Jedis sjedis = getJedis(); 1307 List<byte[]> list = sjedis.lrange(key, start, end); 1308 sjedis.close(); 1309 return list; 1310 } 1311 1312 /** 1313 * 刪除List中c條記錄,被刪除的記錄值為value 1314 * 1315 // * @param byte[] key 1316 // * @param int c 要刪除的數量,如果為負數則從List的尾部檢查並刪除符合的記錄 1317 // * @param byte[] value 要匹配的值 1318 * @return 刪除后的List中的記錄數 1319 * */ 1320 public long lrem(byte[] key, int c, byte[] value) { 1321 Jedis jedis = getJedis(); 1322 long count = jedis.lrem(key, c, value); 1323 jedis.close(); 1324 return count; 1325 } 1326 1327 /** 1328 * 刪除List中c條記錄,被刪除的記錄值為value 1329 * 1330 // * @param String 1331 // * key 1332 // * @param int c 要刪除的數量,如果為負數則從List的尾部檢查並刪除符合的記錄 1333 // * @param String 1334 * value 要匹配的值 1335 * @return 刪除后的List中的記錄數 1336 * */ 1337 public long lrem(String key, int c, String value) { 1338 return lrem(SafeEncoder.encode(key), c, SafeEncoder.encode(value)); 1339 } 1340 1341 /** 1342 * 算是刪除吧,只保留start與end之間的記錄 1343 * 1344 // * @param byte[] key 1345 // * @param int start 記錄的開始位置(0表示第一條記錄) 1346 // * @param int end 記錄的結束位置(如果為-1則表示最后一個,-2,-3以此類推) 1347 * @return 執行狀態碼 1348 * */ 1349 public String ltrim(byte[] key, int start, int end) { 1350 Jedis jedis = getJedis(); 1351 String str = jedis.ltrim(key, start, end); 1352 jedis.close(); 1353 return str; 1354 } 1355 1356 /** 1357 * 算是刪除吧,只保留start與end之間的記錄 1358 * 1359 // * @param String 1360 // * key 1361 // * @param int start 記錄的開始位置(0表示第一條記錄) 1362 // * @param int end 記錄的結束位置(如果為-1則表示最后一個,-2,-3以此類推) 1363 * @return 執行狀態碼 1364 * */ 1365 public String ltrim(String key, int start, int end) { 1366 return ltrim(SafeEncoder.encode(key), start, end); 1367 } 1368 } 1369 1370 }
5.
spring 的 controller層,可以通過@Autowired注入 后直接調用方法,
但是有缺陷,
如果redisSpringContext.xml導入dispatcher-servlet.xml中,會導致
// @Autowired
// private JedisUtil.Strings jedisString;
只能在controller層注入,不可以在service層注入,否則會報錯,無法編譯,具體原因不知,猜測是因為我把servlet層和service層的配置文件分開設置了,想要
在service層注入使用,只需要把redisSpringContext.xml導入springcontext-service.xml文件即可,當然,redisSpringContext.xml文件寫法有部分改動
在我的另一篇博客有記載:點擊訪問
1 package controller; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Controller; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.ResponseBody; 7 import redis.JedisUtil; 8 9 10 @Controller 11 public class RedisController { 12 13 14 @RequestMapping("/toRedis") 15 public String toRedis() { 16 return "redis"; 17 } 18 19 20 21 22 // /** 操作Key的方法 */ 23 // public Keys KEYS; 24 // /** 對存儲結構為String類型的操作 */ 25 // public Strings STRINGS; 26 // /** 對存儲結構為List類型的操作 */ 27 // public Lists LISTS; 28 // /** 對存儲結構為Set類型的操作 */ 29 // public Sets SETS; 30 // /** 對存儲結構為HashMap類型的操作 */ 31 // public Hash HASH; 32 @Autowired 33 private JedisUtil.Keys jedisKeys; 34 35 @Autowired 36 private JedisUtil.Strings jedisString; 37 38 @RequestMapping("getRedis1") 39 @ResponseBody 40 public String getRedis1() { 41 String str = ""; 42 try{ 43 // jedisString.set("name","loveyou999"+System.currentTimeMillis()); 44 // str = jedisString.get("name"); 45 // System.out.println(str); 46 long start = System.currentTimeMillis(); 47 for (int i = 0; i < 100000; i++) { 48 //返回的是個字符串 49 String res = jedisString.set("n" + i, "n" + i); 50 System.out.println("返回的結果:" + res); 51 //返回的結果:OK 52 } 53 long end = System.currentTimeMillis(); 54 System.out.println("普通同步寫入:" + ((end - start) / 1000.0) + "秒"); 55 }catch (Exception e){ 56 e.printStackTrace(); 57 } 58 // (int)(Math.random() * (end-start+1) + start) 59 int num = (int)(Math.random() * (99999) + 1); 60 System.out.println(" num="+num); 61 //獲取字符型鍵值對 62 str = jedisString.get("n"+num ); 63 System.out.println(str); 64 return str; 65 } 66 67 68 }
參考博客原址:https://www.cnblogs.com/lyq-biu/p/10987812.html
