zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    mysql同步故障解决
    linux环境变量
    shell脚本中的交互式输入自动化
    ERROR oslo_service.service PlacementNotConfigured 解决办法
    openstack源
    rabbitmq——用户管理
    linux lvm扩容
    UWB DWM1000 开源项目框架 之 信号强度指示RSSI
    UWB DWM1000 开源项目框架 之 温度采集
    UWB DWM1000 开源项目框架
  • 原文地址:https://www.cnblogs.com/hoje/p/11945641.html
Copyright © 2011-2022 走看看