千家信息网

SpringBoot整合Redis及Redis工具类的实例分析

发表于:2024-09-26 作者:千家信息网编辑
千家信息网最后更新 2024年09月26日,SpringBoot整合Redis及Redis工具类的实例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SpringBoot整合
千家信息网最后更新 2024年09月26日SpringBoot整合Redis及Redis工具类的实例分析

SpringBoot整合Redis及Redis工具类的实例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。


SpringBoot整合Redis的博客很多,但是很多都不是我想要的结果。因为我只需要整合完成后,可以操作Redis就可以了,并不需要配合缓存相关的注解使用(如@Cacheable)。看了很多博客后,我成功的整合了,并写了个Redis操作工具类。特意在此记录一下,方便后续查阅。

一、Maven依赖

(1)本文所采用的SpringBoot的版本如下

           org.springframework.boot        spring-boot-starter-parent        2.0.2.RELEASE             

(2)加入Redis相关依赖

                    org.springframework.boot            spring-boot-starter-data-redis        

二、application.properties中加入redis相关配置

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

三、写一个redis配置类

(1)聊聊RedisTemplate的自动配置

其实现在就可以在代码中注入RedisTemplate,为啥可以直接注入呢?先看下源码吧。下图为 RedisAutoConfiguration类中的截图,为了防止图片失效,代码也贴上 。

代码:

@Configuration@ConditionalOnClass(RedisOperations.class)@EnableConfigurationProperties(RedisProperties.class)@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })public class RedisAutoConfiguration {    @Bean    @ConditionalOnMissingBean(name = "redisTemplate")    public RedisTemplate redisTemplate(            RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {        RedisTemplate template = new RedisTemplate<>();        template.setConnectionFactory(redisConnectionFactory);        return template;    }    @Bean    @ConditionalOnMissingBean    public StringRedisTemplate stringRedisTemplate(            RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {        StringRedisTemplate template = new StringRedisTemplate();        template.setConnectionFactory(redisConnectionFactory);        return template;    }}

通过源码可以看出,SpringBoot自动帮我们在容器中生成了一个RedisTemplate和一个StringRedisTemplate。但是,这个RedisTemplate的泛型是,写代码不方便,需要写好多类型转换的代码;我们需要一个泛型为形式的RedisTemplate。并且,这个RedisTemplate没有设置数据存在Redis时,key及value的序列化方式。

看到这个@ConditionalOnMissingBean注解后,就知道如果Spring容器中有了RedisTemplate对象了,这个自动配置的RedisTemplate不会实例化。因此我们可以直接自己写个配置类,配置RedisTemplate。

(2)既然自动配置不好用,就重新配置一个RedisTemplate

代码如下:

package com.zxy.demo.redis;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;/** * redis配置类 * @author ZENG.XIAO.YAN * @date   2018年6月6日 *  */@Configurationpublic class RedisConfig {            @Bean        @SuppressWarnings("all")    public RedisTemplate redisTemplate(RedisConnectionFactory factory) {            RedisTemplate template = new RedisTemplate();            template.setConnectionFactory(factory);                Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(om);        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        // key采用String的序列化方式        template.setKeySerializer(stringRedisSerializer);        // hash的key也采用String的序列化方式        template.setHashKeySerializer(stringRedisSerializer);        // value序列化方式采用jackson        template.setValueSerializer(jackson2JsonRedisSerializer);        // hash的value序列化方式采用jackson        template.setHashValueSerializer(jackson2JsonRedisSerializer);        template.afterPropertiesSet();        return template;    }}

四、写一个Redis工具类

直接用RedisTemplate操作Redis,需要很多行代码,因此直接封装好一个RedisUtils,这样写代码更方便点。这个RedisUtils交给Spring容器实例化,使用时直接注解注入。

工具类代码如下:

package com.zxy.demo.redis;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;/** * Redis工具类 * @author ZENG.XIAO.YAN * @date   2018年6月7日 */@Componentpublic final class RedisUtil {                @Autowired        private 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 delta 要增加几(大于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 delta 要减少几(小于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 hmget(String key) {                return redisTemplate.opsForHash().entries(key);        }        /**         * HashSet         * @param key 键         * @param map 对应多个键值         * @return true 成功 false 失败         */        public boolean hmset(String key, Map 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 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 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 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 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 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;                }        }}

五、小结

整合其实不麻烦,网上好多博文都有。注意设置下key和value的序列化方式,不然存到Redis的中数据看起来像乱码一下。

关于SpringBoot整合Redis及Redis工具类的实例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

0