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