千家信息网

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

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,SpringBoot整合Redis及Redis工具类的实例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SpringBoot整合
千家信息网最后更新 2025年01月20日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工具类的实例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

时间 缓存 成功 代码 配置 多个 数据 工具 整合 序列 方式 索引 实例 个数 分析 普通 最大 容器 服务器 注解 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 宜宾软件开发哪家不错 网络技术在社会工作应用 科技带动互联网理财的发展 国际网络安全形势 java服务器设置管理员 无法登陆darksouls2服务器 图片资源服务器搭建 我的世界网易服务器手机版推荐 泰拉瑞亚服务器ID大全 杭州一狐网络技术有限公司外包 青岛做软件开发的公司 自建游戏服务器 饭店就餐管理系统数据库 一个服务器两个网卡怎么用 歪fai是不是就是服务器 浪潮服务器默认管理口 岑溪爱伊生互联网科技有限公司 服务器 硬盘灯 黄色 学生网络安全知识作文 国家网络安全小报 没有牢固树立网络安全责任意识 学生投票系统数据库 网络安全关系你我感想200字 郑州网络技术有限公司 计算机软件开发知识体系 我与网络安全的微视频二年级 网络技术服务的新三板公司 服务器异常无法保障计算机安全 软件开发 se是什么意思 网络安全手势语音
0