• SpringBoot整合Redis


    ======================手动整合=====================

    1.手动整合,也就是工具类自己添加缓存

      手动整合只需要三步骤:pom.xml引入依赖、配置redis相关设置、 引入redis工具类:

    (1)只需要引入下面这个工具类,会自动引入相关依赖的jar包:

            <!-- 引入 redis 依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>

    (2)applications.properties添加如下配置

      如果查看默认值我们可以去查看自动配置的类:RedisAutoConfiguration.class。里面的RedisProperties是相关的默认配置以及生效的配置。

    ############################################################
    #
    # REDIS 配置
    #
    ############################################################
    # Redis数据库索引(默认为0)
    spring.redis.database=1
    # Redis服务器地址
    spring.redis.host=localhost
    # Redis服务器连接端口
    spring.redis.port=6379
    # Redis服务器连接密码(默认为空)
    spring.redis.password=
    # 连接池最大连接数(使用负值表示没有限制)
    spring.redis.pool.max-active=1000
    # 连接池最大阻塞等待时间(使用负值表示没有限制)
    spring.redis.pool.max-wait=-1
    # 连接池中的最大空闲连接
    spring.redis.pool.max-idle=10
    # 连接池中的最小空闲连接
    spring.redis.pool.min-idle=2
    # 连接超时时间(毫秒)
    spring.redis.timeout=0

    (3)引入redis工具类==这里使用spring-redis-data自带的StringRedisTemplate

    package cn.qlq.controller;
    
    import java.util.Date;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.alibaba.fastjson.JSONObject;
    
    import cn.qlq.bean.user.User;
    import cn.qlq.utils.JSONResultUtil;
    
    @RestController
    @RequestMapping("redis")
    public class RedisController {
        @Autowired
        private StringRedisTemplate strRedis;
    
        @RequestMapping("/set")
        public JSONResultUtil test() {
            strRedis.opsForValue().set("mycache", "我存入的第一个cache");
            return JSONResultUtil.ok();
        }
    
        @RequestMapping("/setUser")
        public JSONResultUtil setUser() {
            User user = new User();
            user.setAddress("地址");
            user.setCreatetime(new Date());
            strRedis.opsForValue().set("user", JSONObject.toJSONString(user));
            return JSONResultUtil.ok();
        }
    
        @RequestMapping("/getUser")
        public JSONResultUtil getUser() {
            String string = strRedis.opsForValue().get("user");
            User user = JSONObject.parseObject(string, User.class);
            System.out.println(user);
            return JSONResultUtil.ok();
        }
    }

      这里使用StringRedisTemplate类,该类位于spring-data-redis-xxx.jar中,其有五种操作方式:

    redisTemplate.opsForValue();//操作字符串
    redisTemplate.opsForHash();//操作hash
    redisTemplate.opsForList();//操作list
    redisTemplate.opsForSet();//操作set
    redisTemplate.opsForZSet();//操作有序set

      该类在操作的时候也可以指定key的失效时间,如下:

    strRedis.opsForValue().set("mycache", "我存入的第一个cache", 660,TimeUnit.SECONDS);

      关于该类的详细使用参考:https://www.jianshu.com/p/7bf5dc61ca06

    (4)访问后通过redis客户端查看内容

     补充:编写一个简单的工具类对上面的操作进行封装:

    package cn.qlq.utils;
    
    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.StringRedisTemplate;
    import org.springframework.stereotype.Component;
    
    @Component
    public class RedisUtils {
    
        @Autowired
        private StringRedisTemplate redisTemplate;
    
        // Key(键),简单的key-value操作
    
        /**
         * 实现命令:TTL key,以秒为单位,返回给定 key的剩余生存时间(TTL, time to live)。
         * 
         * @param key
         * @return
         */
        public long ttl(String key) {
            return redisTemplate.getExpire(key);
        }
    
        /**
         * 实现命令:expire 设置过期时间,单位秒
         * 
         * @param key
         * @return
         */
        public void expire(String key, long timeout) {
            redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
        }
    
        /**
         * 实现命令:INCR key,增加key一次
         * 
         * @param key
         * @return
         */
        public long incr(String key, long delta) {
            return redisTemplate.opsForValue().increment(key, delta);
        }
    
        /**
         * 实现命令:KEYS pattern,查找所有符合给定模式 pattern的 key
         */
        public Set<String> keys(String pattern) {
            return redisTemplate.keys(pattern);
        }
    
        /**
         * 实现命令:DEL key,删除一个key
         * 
         * @param key
         */
        public void del(String key) {
            redisTemplate.delete(key);
        }
    
        // String(字符串)
    
        /**
         * 实现命令:SET key value,设置一个key-value(将字符串值 value关联到 key)
         * 
         * @param key
         * @param value
         */
        public void set(String key, String value) {
            redisTemplate.opsForValue().set(key, value);
        }
    
        /**
         * 实现命令:SET key value EX seconds,设置key-value和超时时间(秒)
         * 
         * @param key
         * @param value
         * @param timeout
         *            (以秒为单位)
         */
        public void set(String key, String value, long timeout) {
            redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
        }
    
        /**
         * 实现命令:GET key,返回 key所关联的字符串值。
         * 
         * @param key
         * @return value
         */
        public String get(String key) {
            return (String) redisTemplate.opsForValue().get(key);
        }
    
        // Hash(哈希表)
    
        /**
         * 实现命令:HSET key field value,将哈希表 key中的域 field的值设为 value
         * 
         * @param key
         * @param field
         * @param value
         */
        public void hset(String key, String field, Object value) {
            redisTemplate.opsForHash().put(key, field, value);
        }
    
        /**
         * 实现命令:HGET key field,返回哈希表 key中给定域 field的值
         * 
         * @param key
         * @param field
         * @return
         */
        public String hget(String key, String field) {
            return (String) redisTemplate.opsForHash().get(key, field);
        }
    
        /**
         * 实现命令:HDEL key field [field ...],删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
         * 
         * @param key
         * @param fields
         */
        public void hdel(String key, Object... fields) {
            redisTemplate.opsForHash().delete(key, fields);
        }
    
        /**
         * 实现命令:HGETALL key,返回哈希表 key中,所有的域和值。
         * 
         * @param key
         * @return
         */
        public Map<Object, Object> hgetall(String key) {
            return redisTemplate.opsForHash().entries(key);
        }
    
        // List(列表)
    
        /**
         * 实现命令:LPUSH key value,将一个值 value插入到列表 key的表头
         * 
         * @param key
         * @param value
         * @return 执行 LPUSH命令后,列表的长度。
         */
        public long lpush(String key, String value) {
            return redisTemplate.opsForList().leftPush(key, value);
        }
    
        /**
         * 实现命令:LPOP key,移除并返回列表 key的头元素。
         * 
         * @param key
         * @return 列表key的头元素。
         */
        public String lpop(String key) {
            return (String) redisTemplate.opsForList().leftPop(key);
        }
    
        /**
         * 实现命令:RPUSH key value,将一个值 value插入到列表 key的表尾(最右边)。
         * 
         * @param key
         * @param value
         * @return 执行 LPUSH命令后,列表的长度。
         */
        public long rpush(String key, String value) {
            return redisTemplate.opsForList().rightPush(key, value);
        }
    
    }

    使用方法如下: 注入到需要的缓存对象中

    package cn.qlq.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.alibaba.fastjson.JSONObject;
    
    import cn.qlq.bean.user.User;
    import cn.qlq.utils.JSONResultUtil;
    import cn.qlq.utils.RedisUtils;
    
    @RestController
    @RequestMapping("redis")
    public class RedisController {
    
        @Autowired
        private RedisUtils redisUtils;
    
        @RequestMapping("/getUserByUtils")
        public JSONResultUtil getUserByUtils() {
            String string = (String) redisUtils.get("user");
            User user = JSONObject.parseObject(string, User.class);
            System.out.println(user);
            return JSONResultUtil.ok();
        }
    }

    2.整合注解redis缓存

      这个整合只不过是将xml配置的方式改为基于java配置的方式进行,之前的xml整合过程已经写的非常详细,参考:https://www.cnblogs.com/qlqwjy/p/8574121.html

    定义cacheManager、redisTemplate、keyGenerator,并用注解声明开启缓存。

    package cn.qlq.config;
    
    import java.lang.reflect.Method;
    import java.util.Arrays;
    
    import org.springframework.cache.CacheManager;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.cache.interceptor.KeyGenerator;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.cache.RedisCacheManager;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    @Configuration
    // 声明开启缓存
    @EnableCaching
    public class RedisCacheConfig {
        @Bean
        public CacheManager cacheManager(RedisTemplate redisTemplate) {
            RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
            // 多个缓存的名称,目前只定义了一个(如果这里指定了缓存,后面的@Cacheable的value必须是这里的值)
            rcm.setCacheNames(Arrays.asList("usersCache", "logsCache"));
            // 设置缓存过期时间(秒)
            rcm.setDefaultExpiration(600);
            return rcm;
        }
    
        @Bean
        public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
            RedisTemplate template = new RedisTemplate();
            template.setConnectionFactory(factory);
    
            StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
            GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
            template.setKeySerializer(stringRedisSerializer);
            template.setValueSerializer(genericJackson2JsonRedisSerializer);
            template.setHashKeySerializer(stringRedisSerializer);
            template.setHashValueSerializer(genericJackson2JsonRedisSerializer);
            template.setEnableTransactionSupport(true);
    
            return template;
        }
    
        @Bean
        public KeyGenerator keyGenerator() {
            return new KeyGenerator() {
                @Override
                public Object generate(Object o, Method method, Object... params) {
                    // 规定 本类名+方法名+参数名 为key
                    StringBuilder sb = new StringBuilder();
                    sb.append(o.getClass().getName());
                    sb.append("-");
                    sb.append(method.getName());
                    sb.append("-");
                    for (Object param : params) {
                        sb.append(param.toString());
                    }
                    return sb.toString();
                }
            };
        }
    }

    使用方法如下:在使用的地方注解加缓存即可,注意使用更换后的keyGenerator

        /**
         * 分页查询user
         * 
         * @param condition
         * @return
         */
        @RequestMapping("getUsers")
        @Cacheable(value = "usersCache", keyGenerator = "keyGenerator") // 在redis中开启key为findAllUser开头的存储空间
        @MyLogAnnotation(operateDescription = "分页查询用户")
        @ResponseBody
        public PageInfo<User> getUsers(@RequestParam Map condition) {
            int pageNum = 1;
            if (ValidateCheck.isNotNull(MapUtils.getString(condition, "pageNum"))) { // 如果不为空的话改变当前页号
                pageNum = Integer.parseInt(MapUtils.getString(condition, "pageNum"));
            }
            int pageSize = DefaultValue.PAGE_SIZE;
            if (ValidateCheck.isNotNull(MapUtils.getString(condition, "pageSize"))) { // 如果不为空的话改变当前页大小
                pageSize = Integer.parseInt(MapUtils.getString(condition, "pageSize"));
            }
            // 开始分页
            PageHelper.startPage(pageNum, pageSize);
            List<User> users = new ArrayList<User>();
            try {
                users = userService.getUsers(condition);
            } catch (Exception e) {
                logger.error("getUsers error!", e);
            }
            PageInfo<User> pageInfo = new PageInfo<User>(users);
            return pageInfo;
        }

      注意@Cacheable的key和keyGenerator是互斥的,两个只能使用一个,查看@Cacheable的源码也可以知道

    结果:

    补充:在定义了template之后整合了一个更强大的redis工具类

     在RedisCacheConfig中声明bean:

        @Bean
        public RedisTemplateUtils redisTemplateUtils(RedisTemplate redisTemplate) {
            RedisTemplateUtils redisTemplateUtils = new RedisTemplateUtils();
            redisTemplateUtils.setRedisTemplate(redisTemplate);
            return redisTemplateUtils;
        }

    工具类如下:

    package cn.qlq.utils;
    
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.util.CollectionUtils;
    
    /**
     * 
     * @author QLQ 基于spring和redis的redisTemplate工具类 针对所有的hash 都是以h开头的方法 针对所有的Set
     *         都是以s开头的方法 不含通用方法 针对所有的List 都是以l开头的方法
     */
    public class RedisTemplateUtils {
    
        private RedisTemplate<String, Object> redisTemplate;
    
        public RedisTemplate<String, Object> getRedisTemplate() {
            return 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;
            }
        }
    
    }

    使用方法:

        @Autowired
        private RedisTemplateUtils redisTemplateUtils;
    
        @RequestMapping("/setUserByUtils2")
        public JSONResultUtil setUserByUtils2() {
            redisTemplateUtils.set("mm", "mm");
            return JSONResultUtil.ok();
        }
    
        @RequestMapping("/getUserByUtils2")
        public JSONResultUtil getUserByUtils2() {
            String string = (String) redisTemplateUtils.get("mm");
            System.out.println(string);
            return JSONResultUtil.ok();
        }

    ===============使用springboot的自动整合(不推荐)===============

     1.Redis单机版:

    (1)第一种:springBootStrap自动配置:

    • 目录结构

    • 引入spring-boot-starter-redis.jar
            <!-- 自动配置Redis -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-redis</artifactId>
                <version>1.4.4.RELEASE</version>
            </dependency>
    • SpringBoot运行类打注解开启redis缓存
    package cn.qlq;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cache.annotation.EnableCaching;
    @SpringBootApplication
    @EnableCaching//开启redis缓存
    public class MySpringBootApplication {
        
        public static void main(String[] args) {        
            //入口运行类
            SpringApplication.run(MySpringBootApplication.class, args);
        }
    
    }
    • application.properties添加redis配置
    server.port=80
    
    logging.level.org.springframework=DEBUG
    #springboot   mybatis
    #jiazai mybatis peizhiwenjian
    #mybatis.mapper-locations = classpath:mapper/*Mapper.xml
    #mybatis.config-location = classpath:mapper/config/sqlMapConfig.xml
    #mybatis.type-aliases-package = cn.qlq.bean
    
    #shujuyuan
    spring.datasource.driver-class-name= com.mysql.jdbc.Driver
    spring.datasource.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
    spring.datasource.username = root
    spring.datasource.password = 123456
    
    
    #redis
    spring.redis.host=localhost
    spring.redis.port=6379
    • Service中打缓存注解:
    package cn.qlq.service.impl;
    
    
    import java.sql.SQLException;
    import java.util.List;
    import java.util.Map;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.stereotype.Service;
    
    import cn.qlq.bean.User;
    import cn.qlq.mapper.UserMapper;
    import cn.qlq.service.UserService;
    
    @Service
    public class UserServiceImpl implements UserService {
        
        @Autowired
        private UserMapper userMapper;
        
        @Cacheable(value="findAllUser",key="1")//在redis中开启key为findAllUser开头的存储空间
        public List<User> findAllUser(Map condition) {
            System.out.println("打印语句则没有走缓存");
            List<User> list = userMapper.findAll();
            return list;
        }
    
        @Override
        @CacheEvict(value="findAllUser",allEntries=true)//执行此方法的时候删除上面的缓存(以findAllUser为名称的)
        public int addUser() throws SQLException {
            // TODO Auto-generated method stub
            return userMapper.addUser();
        }
    
    }
    •  测试:

    (1)访问:http://localhost/list?name=1(第一次不走缓存)

    再次访问:

      没有打印语句,也就是没有走方法。

    (2)http://localhost/list?name=2(第一次不走缓存)

    再次访问:

      没有打印语句,也就是没有走方法。

    (3)访问:http://localhost/list?name=1

      没有打印语句,也就是没有走方法。还是走的缓存。

    查看Redis缓存的key:

     

    RedisDesktopManager查看:

    • 测试清除缓存:

    查看Redis缓存的key发现为空:

     

      总结:

        注解上的findAllUser是key的前缀,相当于findAllUser:xxxx,后面的是spring自动根据函数的参数生成,如果redis存在则不走方法,直接取出缓存,如果是参数不同,则走方法且加入缓存。

          清除缓存的时候只会清除缓存key前缀是findAllUser开头的,如果是自己手动添加的以findAllUser:开头的也会被清除。如下面的在执行add方法的时候也会被清除:

    127.0.0.1:6379> set findAllUser:mykey test
    OK
  • 相关阅读:
    usaco-ariprog1-pass
    usaco-crypt1-pass
    usaco-barn-repair-pass-KISS
    usaco-mixing milk-pass
    面试HR
    LCS求最长公共子序列(DP)
    毕业随想(转载)
    0-1背包问题(DP)
    排序算法
    二叉搜索树的实现 java
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/8560052.html
Copyright © 2020-2023  润新知