• spring+redis的集成,使用spring-data-redis来集成


    1、参考:https://www.cnblogs.com/qlqwjy/p/8562703.html 

    2、首先创建一个maven项目。然后加入依赖的jar包就行了。我加入的jar包很多,反正加入了也没啥坏的影响。

      1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      3   <modelVersion>4.0.0</modelVersion>
      4   <groupId>com.charts</groupId>
      5   <artifactId>com.fline.aic.charts</artifactId>
      6   <packaging>war</packaging>
      7   <version>0.0.1-SNAPSHOT</version>
      8   <name>com.fline.aic.charts Maven Webapp</name>
      9   <url>http://maven.apache.org</url>
     10   
     11   <dependencies>
     12     <dependency>
     13       <groupId>junit</groupId>
     14       <artifactId>junit</artifactId>
     15       <version>3.8.1</version>
     16       <scope>test</scope>
     17     </dependency>
     18     <!-- https://mvnrepository.com/artifact/log4j/log4j -->
     19     <dependency>
     20         <groupId>log4j</groupId>
     21         <artifactId>log4j</artifactId>
     22         <version>1.2.17</version>
     23     </dependency>
     24     <!-- https://mvnrepository.com/artifact/com.github.kstyrc/embedded-redis -->
     25     <dependency>
     26         <groupId>com.github.kstyrc</groupId>
     27         <artifactId>embedded-redis</artifactId>
     28         <version>0.6</version>
     29         <scope>test</scope>
     30     </dependency>
     31     <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
     32     <dependency>
     33         <groupId>redis.clients</groupId>
     34         <artifactId>jedis</artifactId>
     35         <version>2.9.0</version>
     36     </dependency>
     37     <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
     38     <dependency>
     39         <groupId>org.springframework.data</groupId>
     40         <artifactId>spring-data-redis</artifactId>
     41         <version>1.7.2.RELEASE</version>
     42     </dependency>
     43     <!-- https://mvnrepository.com/artifact/commons-pool/commons-pool -->
     44     <dependency>
     45         <groupId>commons-pool</groupId>
     46         <artifactId>commons-pool</artifactId>
     47         <version>1.5.4</version>
     48     </dependency>
     49     <dependency>
     50            <groupId>com.fasterxml.jackson.core</groupId>
     51            <artifactId>jackson-core</artifactId>
     52           <version>2.1.0</version>
     53    </dependency>
     54    <dependency>
     55            <groupId>com.fasterxml.jackson.core</groupId>
     56            <artifactId>jackson-databind</artifactId>
     57            <version>2.1.0</version>
     58    </dependency>
     59    <dependency>
     60            <groupId>com.fasterxml.jackson.core</groupId>
     61            <artifactId>jackson-annotations</artifactId>
     62            <version>2.1.0</version>
     63    </dependency>
     64     
     65     <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
     66     <dependency>
     67         <groupId>org.springframework</groupId>
     68         <artifactId>spring-core</artifactId>
     69         <version>4.3.18.RELEASE</version>
     70     </dependency>
     71     <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
     72     <dependency>
     73         <groupId>org.springframework</groupId>
     74         <artifactId>spring-context</artifactId>
     75         <version>4.3.18.RELEASE</version>
     76     </dependency>
     77     <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
     78     <dependency>
     79         <groupId>org.springframework</groupId>
     80         <artifactId>spring-web</artifactId>
     81         <version>4.3.18.RELEASE</version>
     82     </dependency>
     83     <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
     84     <dependency>
     85         <groupId>org.springframework</groupId>
     86         <artifactId>spring-aop</artifactId>
     87         <version>4.3.18.RELEASE</version>
     88     </dependency>
     89     <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
     90     <dependency>
     91         <groupId>org.springframework</groupId>
     92         <artifactId>spring-webmvc</artifactId>
     93         <version>4.3.18.RELEASE</version>
     94     </dependency>
     95     <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
     96     <dependency>
     97         <groupId>org.springframework</groupId>
     98         <artifactId>spring-beans</artifactId>
     99         <version>4.3.18.RELEASE</version>
    100     </dependency>
    101     <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    102     <dependency>
    103         <groupId>org.springframework</groupId>
    104         <artifactId>spring-jdbc</artifactId>
    105         <version>4.3.18.RELEASE</version>
    106     </dependency>
    107     <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    108     <dependency>
    109         <groupId>org.springframework</groupId>
    110         <artifactId>spring-webmvc</artifactId>
    111         <version>4.3.18.RELEASE</version>
    112     </dependency>
    113     <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
    114     <dependency>
    115         <groupId>org.springframework</groupId>
    116         <artifactId>spring-test</artifactId>
    117         <version>4.3.18.RELEASE</version>
    118         <scope>test</scope>
    119     </dependency>
    120     <dependency>
    121         <groupId>org.aspectj</groupId>
    122         <artifactId>aspectjweaver</artifactId>
    123         <version>1.8.13</version>
    124     </dependency>
    125     
    126   </dependencies>
    127   <build>
    128     <finalName>com.fline.aic.charts</finalName>
    129   </build>
    130   
    131   
    132   
    133 </project>

     3、然后在web.xml里面配置一下Spring框架listener配置。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
     3   <display-name>Spring_Struts2_20170313</display-name>
     4   <welcome-file-list>
     5     <welcome-file>index.html</welcome-file>
     6     <welcome-file>index.htm</welcome-file>
     7     <welcome-file>index.jsp</welcome-file>
     8     <welcome-file>default.html</welcome-file>
     9     <welcome-file>default.htm</welcome-file>
    10     <welcome-file>default.jsp</welcome-file>
    11   </welcome-file-list>
    12 
    13   
    14   <!-- 1:spring配置 ,在spring-framework-3.2.5.RELEASEdocsspring-framework-referencehtmlsingle
    15                              搜索context-param找到下面这段话即可。记得就该param-value的值,如下所示;
    16          2:param-value的值最好使用bean,这样方便引用如/WEB-INF/classes/bean-*.xml   
    17   -->
    18   <context-param>
    19     <param-name>contextConfigLocation</param-name>
    20     <!-- <param-value>classpath:applicationContext.xml</param-value> -->
    21     <param-value>/WEB-INF/applicationContext.xml</param-value>
    22   </context-param>
    23   <listener>
    24     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    25   </listener>
    26   
    27   
    28 </web-app>

    4、然后配置一下Spring的配置文件。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:p="http://www.springframework.org/schema/p"
     5     xmlns:context="http://www.springframework.org/schema/context"
     6     xsi:schemaLocation="
     7         http://www.springframework.org/schema/beans
     8         http://www.springframework.org/schema/beans/spring-beans.xsd
     9         http://www.springframework.org/schema/context
    10         http://www.springframework.org/schema/context/spring-context.xsd">
    11      
    12     <!-- 开启注解扫描 -->
    13     <context:annotation-config/>   
    14     <context:component-scan base-package="com.fline.*"></context:component-scan> 
    15     
    16     <!-- <import resource="classpath:applicationContext-redis.xml" />  -->
    17     
    18 </beans>

    5、然后配置一下Redis的配置文件redis.properties和applicationContext-redis.xml。

    1 redis.host=127.0.0.1 
    2 redis.port=6379
    3 redis.password=123456
    4 
    5 redis.maxIdle=300
    6 redis.maxActive=600
    7 redis.maxWait=1000
    8 redis.testOnBorrow=true
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
     4     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
     5     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">
     6 
     7     <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" >    
     8         <!--最大空闲数-->    
     9         <property name="maxIdle" value="10" />    
    10         <!--连接池的最大数据库连接数  -->  
    11         <property name="maxTotal" value="50" />  
    12         <!--最大建立连接等待时间-->    
    13         <property name="maxWaitMillis" value="1500" />    
    14         <!--逐出连接的最小空闲时间 默认1800000毫秒(30分钟)-->  
    15         <property name="minEvictableIdleTimeMillis" value="1800000" />   
    16         <!--每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3-->  
    17         <property name="numTestsPerEvictionRun" value="1024" />   
    18         <!--逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1-->  
    19         <property name="timeBetweenEvictionRunsMillis" value="30000" />   
    20         <!--是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个-->    
    21         <property name="testOnBorrow" value="true" />    
    22         <!--在空闲时检查有效性, 默认false  -->  
    23         <property name="testWhileIdle" value="true" />    
    24     </bean >    
    25       
    26     <!--redis连接工厂 -->  
    27     <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">   
    28         <property name="poolConfig" ref="jedisPoolConfig"></property>   
    29         <!--IP地址 -->  
    30         <property name="hostName" value="127.0.0.1"></property>   
    31         <!--端口号  -->  
    32         <property name="port" value="6379"></property>   
    33         <!--如果Redis设置有密码  -->  
    34         <property name="password" value="123456" />  
    35         <!--客户端超时时间单位是毫秒  -->  
    36         <property name="timeout" value="1000"></property>   
    37     </bean>    
    38       
    39     <!--redis操作模版,使用该对象可以操作redis  -->  
    40     <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >    
    41         <property name="connectionFactory" ref="jedisConnectionFactory" />    
    42         <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!!  -->    
    43         <property name="keySerializer" >    
    44             <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />    
    45         </property>    
    46         <property name="valueSerializer" >    
    47             <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />    
    48         </property>    
    49         <property name="hashKeySerializer">    
    50             <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>    
    51         </property>    
    52         <property name="hashValueSerializer">    
    53             <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>    
    54         </property>    
    55         <!--开启事务  -->  
    56         <property name="enableTransactionSupport" value="true"></property>  
    57     </bean > 
    58 
    59     <bean id="redisUtil" class="com.fline.aic.utils.RedisUtil">
    60         <property name="redisTemplate" ref="redisTemplate" />
    61     </bean>
    62 
    63 </beans>

    6、redis的工具类,可以直接拿到项目中使用的。

      1 package com.fline.aic.utils;
      2 
      3 import java.util.List;
      4 import java.util.Map;
      5 import java.util.Set;
      6 import java.util.concurrent.TimeUnit;
      7 
      8 import org.springframework.beans.factory.annotation.Autowired;
      9 import org.springframework.data.redis.core.RedisTemplate;
     10 import org.springframework.stereotype.Component;
     11 import org.springframework.util.CollectionUtils;
     12 
     13 /**
     14  * 
     15  * @author QLQ 基于spring和redis的redisTemplate工具类 针对所有的hash 都是以h开头的方法 针对所有的Set
     16  *         都是以s开头的方法 不含通用方法 针对所有的List 都是以l开头的方法
     17  */
     18 @Component // 交给Spring管理(在需要缓存的地方自动注入即可使用)
     19 public class RedisUtil {
     20 
     21     @Autowired // (自动注入redisTemplet)
     22     private RedisTemplate<String, Object> redisTemplate;
     23 
     24     public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
     25         this.redisTemplate = redisTemplate;
     26     }
     27     // =============================common============================
     28 
     29     /**
     30      * 指定缓存失效时间
     31      * 
     32      * @param key
     33      *            键
     34      * @param time
     35      *            时间(秒)
     36      * @return
     37      */
     38     public boolean expire(String key, long time) {
     39         try {
     40             if (time > 0) {
     41                 redisTemplate.expire(key, time, TimeUnit.SECONDS);
     42             }
     43             return true;
     44         } catch (Exception e) {
     45             e.printStackTrace();
     46             return false;
     47         }
     48     }
     49 
     50     /**
     51      * 根据key 获取过期时间
     52      * 
     53      * @param key
     54      *            键 不能为null
     55      * @return 时间(秒) 返回0代表为永久有效
     56      */
     57     public long getExpire(String key) {
     58         return redisTemplate.getExpire(key, TimeUnit.SECONDS);
     59     }
     60 
     61     /**
     62      * 判断key是否存在
     63      * 
     64      * @param key
     65      *            键
     66      * @return true 存在 false不存在
     67      */
     68     public boolean hasKey(String key) {
     69         try {
     70             return redisTemplate.hasKey(key);
     71         } catch (Exception e) {
     72             e.printStackTrace();
     73             return false;
     74         }
     75     }
     76 
     77     /**
     78      * 删除缓存
     79      * 
     80      * @param key
     81      *            可以传一个值 或多个
     82      */
     83     @SuppressWarnings("unchecked")
     84     public void del(String... key) {
     85         if (key != null && key.length > 0) {
     86             if (key.length == 1) {
     87                 redisTemplate.delete(key[0]);
     88             } else {
     89                 redisTemplate.delete(CollectionUtils.arrayToList(key));
     90             }
     91         }
     92     }
     93 
     94     // ============================String=============================
     95     /**
     96      * 普通缓存获取
     97      * 
     98      * @param key
     99      *            键
    100      * @return 值
    101      */
    102     public Object get(String key) {
    103         return key == null ? null : redisTemplate.opsForValue().get(key);
    104     }
    105 
    106     /**
    107      * 普通缓存放入
    108      * 
    109      * @param key
    110      *            键
    111      * @param value
    112      *            值
    113      * @return true成功 false失败
    114      */
    115     public boolean set(String key, Object value) {
    116         try {
    117             redisTemplate.opsForValue().set(key, value);
    118             return true;
    119         } catch (Exception e) {
    120             e.printStackTrace();
    121             return false;
    122         }
    123 
    124     }
    125 
    126     /**
    127      * 普通缓存放入并设置时间
    128      * 
    129      * @param key
    130      *            键
    131      * @param value
    132      *            值
    133      * @param time
    134      *            时间(秒) time要大于0 如果time小于等于0 将设置无限期
    135      * @return true成功 false 失败
    136      */
    137     public boolean set(String key, Object value, long time) {
    138         try {
    139             if (time > 0) {
    140                 redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
    141             } else {
    142                 set(key, value);
    143             }
    144             return true;
    145         } catch (Exception e) {
    146             e.printStackTrace();
    147             return false;
    148         }
    149     }
    150 
    151     /**
    152      * 递增
    153      * 
    154      * @param key
    155      *            键
    156      * @param by
    157      *            要增加几(大于0)
    158      * @return
    159      */
    160     public long incr(String key, long delta) {
    161         if (delta < 0) {
    162             throw new RuntimeException("递增因子必须大于0");
    163         }
    164         return redisTemplate.opsForValue().increment(key, delta);
    165     }
    166 
    167     /**
    168      * 递减
    169      * 
    170      * @param key
    171      *            键
    172      * @param by
    173      *            要减少几(小于0)
    174      * @return
    175      */
    176     public long decr(String key, long delta) {
    177         if (delta < 0) {
    178             throw new RuntimeException("递减因子必须大于0");
    179         }
    180         return redisTemplate.opsForValue().increment(key, -delta);
    181     }
    182 
    183     // ================================Map=================================
    184     /**
    185      * HashGet
    186      * 
    187      * @param key
    188      *            键 不能为null
    189      * @param item
    190      *            项 不能为null
    191      * @return 值
    192      */
    193     public Object hget(String key, String item) {
    194         return redisTemplate.opsForHash().get(key, item);
    195     }
    196 
    197     /**
    198      * 获取hashKey对应的所有键值
    199      * 
    200      * @param key
    201      *            键
    202      * @return 对应的多个键值
    203      */
    204     public Map<Object, Object> hmget(String key) {
    205         return redisTemplate.opsForHash().entries(key);
    206     }
    207 
    208     /**
    209      * HashSet
    210      * 
    211      * @param key
    212      *            键
    213      * @param map
    214      *            对应多个键值
    215      * @return true 成功 false 失败
    216      */
    217     public boolean hmset(String key, Map<String, Object> map) {
    218         try {
    219             redisTemplate.opsForHash().putAll(key, map);
    220             return true;
    221         } catch (Exception e) {
    222             e.printStackTrace();
    223             return false;
    224         }
    225     }
    226 
    227     /**
    228      * HashSet 并设置时间
    229      * 
    230      * @param key
    231      *            键
    232      * @param map
    233      *            对应多个键值
    234      * @param time
    235      *            时间(秒)
    236      * @return true成功 false失败
    237      */
    238     public boolean hmset(String key, Map<String, Object> map, long time) {
    239         try {
    240             redisTemplate.opsForHash().putAll(key, map);
    241             if (time > 0) {
    242                 expire(key, time);
    243             }
    244             return true;
    245         } catch (Exception e) {
    246             e.printStackTrace();
    247             return false;
    248         }
    249     }
    250 
    251     /**
    252      * 向一张hash表中放入数据,如果不存在将创建
    253      * 
    254      * @param key
    255      *            键
    256      * @param item
    257      *            项
    258      * @param value
    259      *            值
    260      * @return true 成功 false失败
    261      */
    262     public boolean hset(String key, String item, Object value) {
    263         try {
    264             redisTemplate.opsForHash().put(key, item, value);
    265             return true;
    266         } catch (Exception e) {
    267             e.printStackTrace();
    268             return false;
    269         }
    270     }
    271 
    272     /**
    273      * 向一张hash表中放入数据,如果不存在将创建
    274      * 
    275      * @param key
    276      *            键
    277      * @param item
    278      *            项
    279      * @param value
    280      *            值
    281      * @param time
    282      *            时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
    283      * @return true 成功 false失败
    284      */
    285     public boolean hset(String key, String item, Object value, long time) {
    286         try {
    287             redisTemplate.opsForHash().put(key, item, value);
    288             if (time > 0) {
    289                 expire(key, time);
    290             }
    291             return true;
    292         } catch (Exception e) {
    293             e.printStackTrace();
    294             return false;
    295         }
    296     }
    297 
    298     /**
    299      * 删除hash表中的值
    300      * 
    301      * @param key
    302      *            键 不能为null
    303      * @param item
    304      *            项 可以使多个 不能为null
    305      */
    306     public void hdel(String key, Object... item) {
    307         redisTemplate.opsForHash().delete(key, item);
    308     }
    309 
    310     /**
    311      * 判断hash表中是否有该项的值
    312      * 
    313      * @param key
    314      *            键 不能为null
    315      * @param item
    316      *            项 不能为null
    317      * @return true 存在 false不存在
    318      */
    319     public boolean hHasKey(String key, String item) {
    320         return redisTemplate.opsForHash().hasKey(key, item);
    321     }
    322 
    323     /**
    324      * hash递增 如果不存在,就会创建一个 并把新增后的值返回
    325      * 
    326      * @param key
    327      *            键
    328      * @param item
    329      *            项
    330      * @param by
    331      *            要增加几(大于0)
    332      * @return
    333      */
    334     public double hincr(String key, String item, double by) {
    335         return redisTemplate.opsForHash().increment(key, item, by);
    336     }
    337 
    338     /**
    339      * hash递减
    340      * 
    341      * @param key
    342      *            键
    343      * @param item
    344      *            项
    345      * @param by
    346      *            要减少记(小于0)
    347      * @return
    348      */
    349     public double hdecr(String key, String item, double by) {
    350         return redisTemplate.opsForHash().increment(key, item, -by);
    351     }
    352 
    353     // ============================set=============================
    354     /**
    355      * 根据key获取Set中的所有值
    356      * 
    357      * @param key
    358      *            键
    359      * @return
    360      */
    361     public Set<Object> sGet(String key) {
    362         try {
    363             return redisTemplate.opsForSet().members(key);
    364         } catch (Exception e) {
    365             e.printStackTrace();
    366             return null;
    367         }
    368     }
    369 
    370     /**
    371      * 根据value从一个set中查询,是否存在
    372      * 
    373      * @param key
    374      *            键
    375      * @param value
    376      *            值
    377      * @return true 存在 false不存在
    378      */
    379     public boolean sHasKey(String key, Object value) {
    380         try {
    381             return redisTemplate.opsForSet().isMember(key, value);
    382         } catch (Exception e) {
    383             e.printStackTrace();
    384             return false;
    385         }
    386     }
    387 
    388     /**
    389      * 将数据放入set缓存
    390      * 
    391      * @param key
    392      *            键
    393      * @param values
    394      *            值 可以是多个
    395      * @return 成功个数
    396      */
    397     public long sSet(String key, Object... values) {
    398         try {
    399             return redisTemplate.opsForSet().add(key, values);
    400         } catch (Exception e) {
    401             e.printStackTrace();
    402             return 0;
    403         }
    404     }
    405 
    406     /**
    407      * 将set数据放入缓存
    408      * 
    409      * @param key
    410      *            键
    411      * @param time
    412      *            时间(秒)
    413      * @param values
    414      *            值 可以是多个
    415      * @return 成功个数
    416      */
    417     public long sSetAndTime(String key, long time, Object... values) {
    418         try {
    419             Long count = redisTemplate.opsForSet().add(key, values);
    420             if (time > 0)
    421                 expire(key, time);
    422             return count;
    423         } catch (Exception e) {
    424             e.printStackTrace();
    425             return 0;
    426         }
    427     }
    428 
    429     /**
    430      * 获取set缓存的长度
    431      * 
    432      * @param key
    433      *            键
    434      * @return
    435      */
    436     public long sGetSetSize(String key) {
    437         try {
    438             return redisTemplate.opsForSet().size(key);
    439         } catch (Exception e) {
    440             e.printStackTrace();
    441             return 0;
    442         }
    443     }
    444 
    445     /**
    446      * 移除值为value的
    447      * 
    448      * @param key
    449      *            键
    450      * @param values
    451      *            值 可以是多个
    452      * @return 移除的个数
    453      */
    454     public long setRemove(String key, Object... values) {
    455         try {
    456             Long count = redisTemplate.opsForSet().remove(key, values);
    457             return count;
    458         } catch (Exception e) {
    459             e.printStackTrace();
    460             return 0;
    461         }
    462     }
    463     // ===============================list=================================
    464 
    465     /**
    466      * 获取list缓存的内容
    467      * 
    468      * @param key
    469      *            键
    470      * @param start
    471      *            开始
    472      * @param end
    473      *            结束 0 到 -1代表所有值
    474      * @return
    475      */
    476     public List<Object> lGet(String key, long start, long end) {
    477         try {
    478             return redisTemplate.opsForList().range(key, start, end);
    479         } catch (Exception e) {
    480             e.printStackTrace();
    481             return null;
    482         }
    483     }
    484 
    485     /**
    486      * 获取list缓存的长度
    487      * 
    488      * @param key
    489      *            键
    490      * @return
    491      */
    492     public long lGetListSize(String key) {
    493         try {
    494             return redisTemplate.opsForList().size(key);
    495         } catch (Exception e) {
    496             e.printStackTrace();
    497             return 0;
    498         }
    499     }
    500 
    501     /**
    502      * 通过索引 获取list中的值
    503      * 
    504      * @param key
    505      *            键
    506      * @param index
    507      *            索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
    508      * @return
    509      */
    510     public Object lGetIndex(String key, long index) {
    511         try {
    512             return redisTemplate.opsForList().index(key, index);
    513         } catch (Exception e) {
    514             e.printStackTrace();
    515             return null;
    516         }
    517     }
    518 
    519     /**
    520      * 将list放入缓存
    521      * 
    522      * @param key
    523      *            键
    524      * @param value
    525      *            值
    526      * @param time
    527      *            时间(秒)
    528      * @return
    529      */
    530     public boolean lSet(String key, Object value) {
    531         try {
    532             redisTemplate.opsForList().rightPush(key, value);
    533             return true;
    534         } catch (Exception e) {
    535             e.printStackTrace();
    536             return false;
    537         }
    538     }
    539 
    540     /**
    541      * 将list放入缓存
    542      * 
    543      * @param key
    544      *            键
    545      * @param value
    546      *            值
    547      * @param time
    548      *            时间(秒)
    549      * @return
    550      */
    551     public boolean rSet(String key, Object value) {
    552         try {
    553             redisTemplate.opsForList().rightPush(key, value);
    554             return true;
    555         } catch (Exception e) {
    556             e.printStackTrace();
    557             return false;
    558         }
    559     }
    560 
    561     /**
    562      * 将list放入缓存
    563      * 
    564      * @param key
    565      *            键
    566      * @param value
    567      *            值
    568      * @param time
    569      *            时间(秒)
    570      * @return
    571      */
    572     public boolean lSet(String key, Object value, long time) {
    573         try {
    574             redisTemplate.opsForList().rightPush(key, value);
    575             if (time > 0)
    576                 expire(key, time);
    577             return true;
    578         } catch (Exception e) {
    579             e.printStackTrace();
    580             return false;
    581         }
    582     }
    583 
    584     /**
    585      * 将list放入缓存
    586      * 
    587      * @param key
    588      *            键
    589      * @param value
    590      *            值
    591      * @param time
    592      *            时间(秒)
    593      * @return
    594      */
    595     public boolean lSet(String key, List<Object> value) {
    596         try {
    597             redisTemplate.opsForList().rightPushAll(key, value);
    598             return true;
    599         } catch (Exception e) {
    600             e.printStackTrace();
    601             return false;
    602         }
    603     }
    604 
    605     /**
    606      * 将list放入缓存
    607      * 
    608      * @param key
    609      *            键
    610      * @param value
    611      *            值
    612      * @param time
    613      *            时间(秒)
    614      * @return
    615      */
    616     public boolean lSet(String key, List<Object> value, long time) {
    617         try {
    618             redisTemplate.opsForList().rightPushAll(key, value);
    619             if (time > 0)
    620                 expire(key, time);
    621             return true;
    622         } catch (Exception e) {
    623             e.printStackTrace();
    624             return false;
    625         }
    626     }
    627 
    628     /**
    629      * 根据索引修改list中的某条数据
    630      * 
    631      * @param key
    632      *            键
    633      * @param index
    634      *            索引
    635      * @param value
    636      *            值
    637      * @return
    638      */
    639     public boolean lUpdateIndex(String key, long index, Object value) {
    640         try {
    641             redisTemplate.opsForList().set(key, index, value);
    642             return true;
    643         } catch (Exception e) {
    644             e.printStackTrace();
    645             return false;
    646         }
    647     }
    648 
    649     /**
    650      * 移除N个值为value
    651      * 
    652      * @param key
    653      *            键
    654      * @param count
    655      *            移除多少个
    656      * @param value
    657      *            值
    658      * @return 移除的个数
    659      */
    660     public long lRemove(String key, long count, Object value) {
    661         try {
    662             Long remove = redisTemplate.opsForList().remove(key, count, value);
    663             return remove;
    664         } catch (Exception e) {
    665             e.printStackTrace();
    666             return 0;
    667         }
    668     }
    669 
    670 }

    7、最后是Redis的测试类,方便自己进行测试使用。

     1 package com.fline.aic.utils;
     2 
     3 import java.util.List;
     4 import java.util.Map;
     5 import java.util.Map.Entry;
     6 import java.util.Set;
     7 
     8 import org.junit.Before;
     9 import org.junit.Test;
    10 import org.springframework.context.ApplicationContext;
    11 import org.springframework.context.support.ClassPathXmlApplicationContext;
    12 
    13 /**
    14  * 
    15  * @Description TODO
    16  * @author biehl
    17  * @Date 2018年12月7日 下午8:25:34
    18  *
    19  *       参考:https://www.cnblogs.com/qlqwjy/p/8562703.html
    20  */
    21 public class RedisTest {
    22 
    23     private RedisUtil redisUtils = null;
    24 
    25     @Before
    26     public void before() {
    27         ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext-redis.xml");
    28         redisUtils = (RedisUtil) context.getBean("redisUtil");
    29     }
    30 
    31     // redis存放String类型的
    32     @Test
    33     public void redisString() throws InterruptedException {
    34         // 从redis数据库中获取到dd的字符串
    35         String str = (String) redisUtils.get("dd");
    36         // 如果获取到的str字符串不为空
    37         if (str != null) {
    38             // 就删除这个str字符串
    39             redisUtils.del(str);
    40         }
    41         // 将key为dd和value为dd设置到redis里面
    42         redisUtils.set("dd", "dd");
    43         // 打印该key为dd的字符串
    44         System.out.println(redisUtils.get("dd"));
    45     }
    46 
    47     // redis存放List类型的
    48     @Test
    49     public void redisList() throws InterruptedException {
    50         // 删除key为list1
    51         redisUtils.del("list1");
    52         redisUtils.lSet("list1", "list1");
    53         redisUtils.lSet("list1", "list2");
    54         redisUtils.lSet("list1", "list3");
    55         redisUtils.rSet("list1", "list4");
    56         List<Object> lGet = redisUtils.lGet("list1", 0, -1);
    57         // redisTemplate.opsForList().range("myList", 0, -1);
    58         for (Object s : lGet) {
    59             System.out.println(s);
    60         }
    61     }
    62 
    63     // redis存放Set类型的
    64     @Test
    65     public void redisSet() throws InterruptedException {
    66         redisUtils.del("set1");
    67         redisUtils.sSet("set1", "set1");
    68         redisUtils.sSet("set1", "set2");
    69         redisUtils.sSet("set1", "set3");
    70         redisUtils.sSet("set1", "set4");
    71         Set<Object> sGet = redisUtils.sGet("set1");
    72         for (Object s : sGet) {
    73             System.out.println(s);
    74         }
    75     }
    76 
    77     // redis存放Hash类型的
    78     @Test
    79     public void redisHash() throws InterruptedException {
    80         redisUtils.del("hash1");
    81         redisUtils.hset("hash1", "beijing", "北京");
    82         redisUtils.hset("hash1", "shanghai", "上海");
    83         redisUtils.hset("hash1", "chenzhen", "深圳");
    84         redisUtils.hset("hash1", "xinxiang", "新乡");
    85         Map<Object, Object> hmget = redisUtils.hmget("hash1");
    86         Set<Entry<Object, Object>> entrySet = hmget.entrySet();
    87         for (Map.Entry<Object, Object> hash : entrySet) {
    88             System.out.println(hash.getKey() + " : " + hash.getValue());
    89         }
    90     }
    91 
    92 }

     效果如下所示:

  • 相关阅读:
    cf1058c 暴力
    cf1058b 点是否在一个矩形里
    cf1058E 思维 前缀处理 位运算
    Codeforces Round #622 (Div. 2)C(单调栈,DP)
    Codeforces Round #623 (Div. 1, based on VK Cup 2019-2020
    Atcoder Beginner Contest 156E(隔板法,组合数学)
    【PAT甲级】1117 Eddington Number (25分)
    【PAT甲级】1116 Come on! Let's C (20分)
    【PAT甲级】1115 Counting Nodes in a BST (30分)(二叉查找树)
    Codeforces Round #621 (Div. 1 + Div. 2)E(二分查找,枚举分界点,容斥原理)
  • 原文地址:https://www.cnblogs.com/biehongli/p/10096627.html
Copyright © 2020-2023  润新知