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>    
spring-redis.xml
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
redis.properties

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 }
JedisPoolWriper

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          * @return1155          **/
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          * @return1168          **/
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 }
JedisUtil

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 }
AreaServiceImpl

 

posted @ 2019-11-27 21:32  honghj  阅读(560)  评论(1编辑  收藏  举报