• spring+redis的集成,redis做缓存


    1.前言

           Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。我们都知道,在日常的应用中,数据库瓶颈是最容易出现的。数据量太大和频繁的查询,由于磁盘IO性能的局限性,导致项目的性能越来越低。这时候,基于内存的缓存框架,就能解决我们很多问题。例如Memcache,Redis等。将一些频繁使用的数据放入缓存读取,大大降低了数据库的负担。提升了系统的性能。

          有于Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET等。因此现在Redis用的越来越多。

    2.引入依赖

            <!-- jedis依赖 -->
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.7.1</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
                <version>1.6.2.RELEASE</version>
            </dependency>

    注意应该导入下面包

      如果存储的是Map<String,Object>需要导入jackson相关的包,存储的时候使用json序列化器存储。如果不导入jackson的包会报错。

            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.1.0</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.1.0</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.1.0</version>
            </dependency>

     

    3.配置文件

    3.1 redis.properties

    #访问地址  
    redis.host=127.0.0.1  
    #访问端口  
    redis.port=6379  
    #注意,如果没有password,此处不设置值,但这一项要保留  
    redis.password=  
      
    #最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。  
    redis.maxIdle=300  
    #连接池的最大数据库连接数。设为0表示无限制  
    redis.maxActive=600  
    #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。  
    redis.maxWait=1000  
    #在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;  
    redis.testOnBorrow=true 

    3.2applicationContext-redis.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        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 ">
    
        <!-- 连接池基本参数配置,类似数据库连接池 -->
        <context:property-placeholder location="classpath:redis.properties"
            ignore-unresolvable="true" />
        
        <!-- redis连接池 -->  
        <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
            <property name="maxTotal" value="${redis.maxActive}" />
            <property name="maxIdle" value="${redis.maxIdle}" />
            <property name="testOnBorrow" value="${redis.testOnBorrow}" />
        </bean>
    
        <!-- 连接池配置,类似数据库连接池 -->
        <bean id="jedisConnectionFactory"
            class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
            <property name="hostName" value="${redis.host}"></property>
            <property name="port" value="${redis.port}"></property>
            <!-- <property name="password" value="${redis.pass}"></property> -->
            <property name="poolConfig" ref="poolConfig"></property>
        </bean>
    
        <!--redis操作模版,使用该对象可以操作redis  -->  
        <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >    
            <property name="connectionFactory" ref="jedisConnectionFactory" />    
            <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!!  -->    
            <property name="keySerializer" >    
                <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />    
            </property>    
            <property name="valueSerializer" >    
                <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />    
            </property>    
            <property name="hashKeySerializer">    
                <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>    
            </property>    
            <property name="hashValueSerializer">    
                <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>    
            </property>    
            <!--开启事务  -->  
            <property name="enableTransactionSupport" value="true"></property>  
        </bean >   
    
    
        <!-- 下面这个是整合Mybatis的二级缓存使用的 -->
        <bean id="redisCacheTransfer" class="cn.qlq.jedis.RedisCacheTransfer">
            <property name="jedisConnectionFactory" ref="jedisConnectionFactory" />
        </bean>
    
    </beans>

    注意事项:

      如果在多个spring配置文件中引入<context:property-placeholder .../>标签,最后需要加上ignore-unresolvable="true",否则会报错。

      JSON存储的数据可以看懂,如果是其他序列化器序列化的看不懂。。。。。。

    4.测试

    package cn.qlq.Test;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import javax.annotation.Resource;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import cn.qlq.util.RedisUtil;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext-*.xml")
    @SuppressWarnings("all")
    public class RedisTest {
        @Autowired
        private RedisUtil redisUtil;
        @Resource(name="redisTemplate")
        private RedisTemplate redisTemplate;
    
        @Test
        public void testSpringRedis() {
            // stringRedisTemplate的操作
            // String读写
            redisTemplate.delete("myStr");
            redisTemplate.opsForValue().set("myStr", "skyLine");
            System.out.println(redisTemplate.opsForValue().get("myStr"));
            System.out.println("---------------");
    
            // List读写
            redisTemplate.delete("myList");
            redisTemplate.opsForList().rightPush("myList", "T");
            redisTemplate.opsForList().rightPush("myList", "L");
            redisTemplate.opsForList().leftPush("myList", "A");
            List<String> listCache = redisTemplate.opsForList().range("myList", 0, -1);
            for (String s : listCache) {
                System.out.println(s);
            }
            System.out.println("---------------");
    
            // Set读写
            redisTemplate.delete("mySet");
            redisTemplate.opsForSet().add("mySet", "A");
            redisTemplate.opsForSet().add("mySet", "B");
            redisTemplate.opsForSet().add("mySet", "C");
            Set<String> setCache = redisTemplate.opsForSet().members("mySet");
            for (String s : setCache) {
                System.out.println(s);
            }
            System.out.println("---------------");
    
            // Hash读写
            redisTemplate.delete("myHash");
            redisTemplate.opsForHash().put("myHash", "BJ", "北京");
            redisTemplate.opsForHash().put("myHash", "SH", "上海");
            redisTemplate.opsForHash().put("myHash", "HN", "河南");
            Map<String, String> hashCache = redisTemplate.opsForHash().entries("myHash");
            for (Map.Entry entry : hashCache.entrySet()) {
                System.out.println(entry.getKey() + " - " + entry.getValue());
            }
            System.out.println("---------------");
        }
        
    }

    结果:

    skyLine  
    ---------------  
    A  
    T  
    L  
    ---------------  
    C  
    B  
    A  
    ---------------  
    HN - 河南  
    BJ - 北京  
    SH - 上海  
    --------------- 

    最后附加一个工具类:

    RedisUtil.java(交给spring管理后在需要缓存的地方自动注入即可)

    package cn.qlq.util;
    
    import java.util.List;  
    import java.util.Map;  
    import java.util.Set;  
    import java.util.concurrent.TimeUnit;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Component;
    import org.springframework.util.CollectionUtils;  
      
      
    /** 
     *  
     * @author QLQ
     * 基于spring和redis的redisTemplate工具类 
     * 针对所有的hash 都是以h开头的方法 
     * 针对所有的Set 都是以s开头的方法                    不含通用方法 
     * 针对所有的List 都是以l开头的方法 
     */  
    @Component//交给Spring管理(在需要缓存的地方自动注入即可使用)
    public class RedisUtil {  
      
        @Autowired//(自动注入redisTemplet)
        private RedisTemplate<String, Object> redisTemplate;  
          
        public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {  
            this.redisTemplate = redisTemplate;  
        }  
        //=============================common============================  
        /** 
         * 指定缓存失效时间 
         * @param key 键 
         * @param time 时间(秒) 
         * @return 
         */  
        public boolean expire(String key,long time){  
            try {  
                if(time>0){  
                    redisTemplate.expire(key, time, TimeUnit.SECONDS);  
                }  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
          
        /** 
         * 根据key 获取过期时间 
         * @param key 键 不能为null 
         * @return 时间(秒) 返回0代表为永久有效 
         */  
        public long getExpire(String key){  
            return redisTemplate.getExpire(key,TimeUnit.SECONDS);  
        }  
          
        /** 
         * 判断key是否存在 
         * @param key 键 
         * @return true 存在 false不存在 
         */  
        public boolean hasKey(String key){  
            try {  
                return redisTemplate.hasKey(key);  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
          
        /** 
         * 删除缓存 
         * @param key 可以传一个值 或多个 
         */  
        @SuppressWarnings("unchecked")  
        public void del(String ... key){  
            if(key!=null&&key.length>0){  
                if(key.length==1){  
                    redisTemplate.delete(key[0]);  
                }else{  
                    redisTemplate.delete(CollectionUtils.arrayToList(key));  
                }  
            }  
        }  
          
        //============================String=============================  
        /** 
         * 普通缓存获取 
         * @param key 键 
         * @return*/  
        public Object get(String key){  
            return key==null?null:redisTemplate.opsForValue().get(key);  
        }  
          
        /** 
         * 普通缓存放入 
         * @param key 键 
         * @param value 值 
         * @return true成功 false失败 
         */  
        public boolean set(String key,Object value) {  
             try {  
                redisTemplate.opsForValue().set(key, value);  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
              
        }  
          
        /** 
         * 普通缓存放入并设置时间 
         * @param key 键 
         * @param value 值 
         * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 
         * @return true成功 false 失败 
         */  
        public boolean set(String key,Object value,long time){  
            try {  
                if(time>0){  
                    redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);  
                }else{  
                    set(key, value);  
                }  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
          
        /** 
         * 递增 
         * @param key 键 
         * @param by 要增加几(大于0) 
         * @return 
         */  
        public long incr(String key, long delta){    
            if(delta<0){  
                throw new RuntimeException("递增因子必须大于0");  
            }  
            return redisTemplate.opsForValue().increment(key, delta);  
        }  
          
        /** 
         * 递减 
         * @param key 键 
         * @param by 要减少几(小于0) 
         * @return 
         */  
        public long decr(String key, long delta){    
            if(delta<0){  
                throw new RuntimeException("递减因子必须大于0");  
            }  
            return redisTemplate.opsForValue().increment(key, -delta);    
        }    
          
        //================================Map=================================  
        /** 
         * HashGet 
         * @param key 键 不能为null 
         * @param item 项 不能为null 
         * @return*/  
        public Object hget(String key,String item){  
            return redisTemplate.opsForHash().get(key, item);  
        }  
          
        /** 
         * 获取hashKey对应的所有键值 
         * @param key 键 
         * @return 对应的多个键值 
         */  
        public Map<Object,Object> hmget(String key){  
            return redisTemplate.opsForHash().entries(key);  
        }  
          
        /** 
         * HashSet 
         * @param key 键 
         * @param map 对应多个键值 
         * @return true 成功 false 失败 
         */  
        public boolean hmset(String key, Map<String,Object> map){    
            try {  
                redisTemplate.opsForHash().putAll(key, map);  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
          
        /** 
         * HashSet 并设置时间 
         * @param key 键 
         * @param map 对应多个键值 
         * @param time 时间(秒) 
         * @return true成功 false失败 
         */  
        public boolean hmset(String key, Map<String,Object> map, long time){    
            try {  
                redisTemplate.opsForHash().putAll(key, map);  
                if(time>0){  
                    expire(key, time);  
                }  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
          
        /** 
         * 向一张hash表中放入数据,如果不存在将创建 
         * @param key 键 
         * @param item 项 
         * @param value 值 
         * @return true 成功 false失败 
         */  
        public boolean hset(String key,String item,Object value) {  
             try {  
                redisTemplate.opsForHash().put(key, item, value);  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
          
        /** 
         * 向一张hash表中放入数据,如果不存在将创建 
         * @param key 键 
         * @param item 项 
         * @param value 值 
         * @param time 时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间 
         * @return true 成功 false失败 
         */  
        public boolean hset(String key,String item,Object value,long time) {  
             try {  
                redisTemplate.opsForHash().put(key, item, value);  
                if(time>0){  
                    expire(key, time);  
                }  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
          
        /** 
         * 删除hash表中的值 
         * @param key 键 不能为null 
         * @param item 项 可以使多个 不能为null 
         */  
        public void hdel(String key, Object... item){    
            redisTemplate.opsForHash().delete(key,item);  
        }   
          
        /** 
         * 判断hash表中是否有该项的值 
         * @param key 键 不能为null 
         * @param item 项 不能为null 
         * @return true 存在 false不存在 
         */  
        public boolean hHasKey(String key, String item){  
            return redisTemplate.opsForHash().hasKey(key, item);  
        }   
          
        /** 
         * hash递增 如果不存在,就会创建一个 并把新增后的值返回 
         * @param key 键 
         * @param item 项 
         * @param by 要增加几(大于0) 
         * @return 
         */  
        public double hincr(String key, String item,double by){    
            return redisTemplate.opsForHash().increment(key, item, by);  
        }  
          
        /** 
         * hash递减 
         * @param key 键 
         * @param item 项 
         * @param by 要减少记(小于0) 
         * @return 
         */  
        public double hdecr(String key, String item,double by){    
            return redisTemplate.opsForHash().increment(key, item,-by);    
        }    
          
        //============================set=============================  
        /** 
         * 根据key获取Set中的所有值 
         * @param key 键 
         * @return 
         */  
        public Set<Object> sGet(String key){  
            try {  
                return redisTemplate.opsForSet().members(key);  
            } catch (Exception e) {  
                e.printStackTrace();  
                return null;  
            }  
        }  
          
        /** 
         * 根据value从一个set中查询,是否存在 
         * @param key 键 
         * @param value 值 
         * @return true 存在 false不存在 
         */  
        public boolean sHasKey(String key,Object value){  
            try {  
                return redisTemplate.opsForSet().isMember(key, value);  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
          
        /** 
         * 将数据放入set缓存 
         * @param key 键 
         * @param values 值 可以是多个 
         * @return 成功个数 
         */  
        public long sSet(String key, Object...values) {  
            try {  
                return redisTemplate.opsForSet().add(key, values);  
            } catch (Exception e) {  
                e.printStackTrace();  
                return 0;  
            }  
        }  
          
        /** 
         * 将set数据放入缓存 
         * @param key 键 
         * @param time 时间(秒) 
         * @param values 值 可以是多个 
         * @return 成功个数 
         */  
        public long sSetAndTime(String key,long time,Object...values) {  
            try {  
                Long count = redisTemplate.opsForSet().add(key, values);  
                if(time>0) expire(key, time);  
                return count;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return 0;  
            }  
        }  
          
        /** 
         * 获取set缓存的长度 
         * @param key 键 
         * @return 
         */  
        public long sGetSetSize(String key){  
            try {  
                return redisTemplate.opsForSet().size(key);  
            } catch (Exception e) {  
                e.printStackTrace();  
                return 0;  
            }  
        }  
          
        /** 
         * 移除值为value的 
         * @param key 键 
         * @param values 值 可以是多个 
         * @return 移除的个数 
         */  
        public long setRemove(String key, Object ...values) {  
            try {  
                Long count = redisTemplate.opsForSet().remove(key, values);  
                return count;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return 0;  
            }  
        }  
        //===============================list=================================  
          
        /** 
         * 获取list缓存的内容 
         * @param key 键 
         * @param start 开始 
         * @param end 结束  0 到 -1代表所有值 
         * @return 
         */  
        public List<Object> lGet(String key,long start, long end){  
            try {  
                return redisTemplate.opsForList().range(key, start, end);  
            } catch (Exception e) {  
                e.printStackTrace();  
                return null;  
            }  
        }  
          
        /** 
         * 获取list缓存的长度 
         * @param key 键 
         * @return 
         */  
        public long lGetListSize(String key){  
            try {  
                return redisTemplate.opsForList().size(key);  
            } catch (Exception e) {  
                e.printStackTrace();  
                return 0;  
            }  
        }  
          
        /** 
         * 通过索引 获取list中的值 
         * @param key 键 
         * @param index 索引  index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 
         * @return 
         */  
        public Object lGetIndex(String key,long index){  
            try {  
                return redisTemplate.opsForList().index(key, index);  
            } catch (Exception e) {  
                e.printStackTrace();  
                return null;  
            }  
        }  
          
        /** 
         * 将list放入缓存 
         * @param key 键 
         * @param value 值 
         * @param time 时间(秒) 
         * @return 
         */  
        public boolean lSet(String key, Object value) {  
            try {  
                redisTemplate.opsForList().rightPush(key, value);  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
          
        /** 
         * 将list放入缓存 
         * @param key 键 
         * @param value 值 
         * @param time 时间(秒) 
         * @return 
         */  
        public boolean lSet(String key, Object value, long time) {  
            try {  
                redisTemplate.opsForList().rightPush(key, value);  
                if (time > 0) expire(key, time);  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
          
        /** 
         * 将list放入缓存 
         * @param key 键 
         * @param value 值 
         * @param time 时间(秒) 
         * @return 
         */  
        public boolean lSet(String key, List<Object> value) {  
            try {  
                redisTemplate.opsForList().rightPushAll(key, value);  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
          
        /** 
         * 将list放入缓存 
         * @param key 键 
         * @param value 值 
         * @param time 时间(秒) 
         * @return 
         */  
        public boolean lSet(String key, List<Object> value, long time) {  
            try {  
                redisTemplate.opsForList().rightPushAll(key, value);  
                if (time > 0) expire(key, time);  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
          
        /** 
         * 根据索引修改list中的某条数据 
         * @param key 键 
         * @param index 索引 
         * @param value 值 
         * @return 
         */  
        public boolean lUpdateIndex(String key, long index,Object value) {  
            try {  
                redisTemplate.opsForList().set(key, index, value);  
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }   
          
        /** 
         * 移除N个值为value  
         * @param key 键 
         * @param count 移除多少个 
         * @param value 值 
         * @return 移除的个数 
         */  
        public long lRemove(String key,long count,Object value) {  
            try {  
                Long remove = redisTemplate.opsForList().remove(key, count, value);  
                return remove;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return 0;  
            }  
        }  
          
    }

    如果不加注解,使用xml交给spring可以用下面方式:

        <!--自定义redis工具类,在需要缓存的地方注入此类  -->  
        <bean id="redisUtil" class="cn.qlq.util.RedisUtil">  
            <property name="redisTemplate" ref="redisTemplate" />  
        </bean>  
    • 测试工具类:
    package cn.qlq.Test;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import javax.annotation.Resource;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import cn.qlq.util.RedisUtil;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext-*.xml")
    @SuppressWarnings("all")
    public class RedisTest {
        @Autowired
        private RedisUtil redisUtil;
        
        @Test
        public void testSpringRedis2(){
            String  str = "string";//1.字符串
            List<String> list = new ArrayList<String>();//list
            list.add("0");
            list.add("中国");
            list.add("2");
            Set<String> set = new HashSet<String>();//set
            set.add("0");
            set.add("中国");
            set.add("2");
            Map<String, Object> map = new HashMap();//map
            map.put("key1", "str1");
            map.put("key2", "中国");
            map.put("key3", "str3");
            
            
            
            redisUtil.del("myStr","str");//删除数据
            
            
            //1.字符串操作
            redisUtil.set("str", str);
            redisUtil.expire("str", 120);//指定失效时间为2分钟
            String str1 = (String) redisUtil.get("str");
            System.out.println(str1);
            
            //2.list操作
            redisUtil.lSet("list", list);
            redisUtil.expire("list", 120);//指定失效时间为2分钟
            List<Object> list1 = redisUtil.lGet("list", 0, -1);
            System.out.println(list1);
                
            //3.set操作
            redisUtil.sSet("set", set);
            redisUtil.expire("set", 120);//指定失效时间为2分钟
            Set<Object> set1 = redisUtil.sGet("set");
            System.out.println(set1);
            
            
            //3.map操作
            redisUtil.hmset("map", map);
            redisUtil.expire("map", 120);//指定失效时间为2分钟
             Map<Object, Object> map1 = redisUtil.hmget("map");
            System.out.println(map1);
            
            
        }
    }

    结果:

    通过redis客户端查询:

      如果有需求设置缓存存活的时间可以在每个的set方法里面调用一下设置存活时间的方法,或者直接将存活时间参数传下去,可以将存活时间的默认值放到配置文件或者常量类中。灵活的设置缓存时间。

    •  测试工具类缓存JavaBean

    1.被缓存的类需要实现序列化接口 Serializable

     2.测试:

        @Test
        public void testSpringRedis3(){
            List<User> list = new ArrayList<User>();//list
            list.add(new User(1,"QLQ1"));
            list.add(new User(2,"QLQ2"));
            list.add(new User(3,"QLQ3"));
            
            
            Set<User> set = new HashSet<User>();//set
            set.add(new User(1,"QLQ1"));
            set.add(new User(2,"QLQ2"));
            set.add(new User(3,"QLQ3"));
            
            Map<String, Object> map = new HashMap();//map
            map.put("key1", new User(1,"QLQ1"));
            map.put("key2", new User(1,"QLQ2"));
            map.put("key3", new User(1,"QLQ3"));
            
            
            //2.list操作
            redisUtil.lSet("list", list,1200);
            List<Object> list1 = redisUtil.lGet("list", 0, -1);
            System.out.println(list1);
            
            //3.set操作
            redisUtil.sSet("set", set);
            redisUtil.expire("set", 1200);//指定失效时间为2分钟
            Set<Object> set1 = redisUtil.sGet("set");
            System.out.println(set1);
            
            
            //3.map操作
            redisUtil.hmset("map", map);
            redisUtil.expire("map", 120);//指定失效时间为2分钟
            Map<Object, Object> map1 = redisUtil.hmget("map");
            System.out.println(map1);
            
            
        }

     结果:

    redis客户端查看缓存数据:

    总结:

      在redis做缓存的时候最好是每个缓存的生命周期不固定,也就是分散的使缓存失效。可以设置有效期为3-9小时。具体的做法就是在Java中产生一个3-9小时的随机数。

     参考;

                                  http://blog.csdn.net/tomcat_2014/article/details/55260306

    有redis集群的配置:    http://blog.csdn.net/qq_34021712/article/details/75949706

    spring注解缓存集成redis配置: http://www.cnblogs.com/qlqwjy/p/8574121.html

  • 相关阅读:
    推送消息为什么使用RocketMQ,而不使用Kafka?
    com.google.common.collect.Lists.addAll()空指针原因分析
    AQS原理
    ReentrantLock-加锁
    ReentrantLock-自旋
    Reentrantlock-的核心内容
    java中,BigDecimal的add方法避坑指南
    Reentrantlock-实现原理
    Reentrantlock-适用场景
    JAVA foreach和普通for循环是否需要判断为null
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/8562703.html
Copyright © 2020-2023  润新知