文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot项目如何接入Redis集群

2023-06-27 10:09

关注

今天小编给大家分享一下SpringBoot项目如何接入Redis集群的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

配置参数

因为这篇文章不介绍 Redis 集群的搭建,这里我们假设已经有了一个 Redis 的集群环境,我们项目中需要调整以下几个部分

  1. 修改配置参数,集群的节点和密码配置;

  2. 确保引入的 Jedis 版本支持设置密码,spring-data-redis 1.8 以上,SpringBoot 1.5 以上才支持设置密码;

  3. 注入 RedisTemplate

  4. 编写工具类;

修改配置参数

############### Redis 集群配置 #########################spring.custome.redis.cluster.nodes=172.20.0.1:7001,172.20.0.2:7002,172.20.0.3:7003spring.custome.redis.cluster.max-redirects=3spring.custome.redis.cluster.max-active=500spring.custome.redis.cluster.max-wait=-1spring.custome.redis.cluster.max-idle=500spring.custome.redis.cluster.min-idle=20spring.custome.redis.cluster.timeout=3000spring.custome.redis.cluster.password=redis.cluster.password

引入依赖(如果需要)

确保  SpringBoot 的版本大于 1.4.x 如果不是的话,采用如下配置,先排除 SpringBoot 中旧版本 Jedisspring-data-redis,再依赖高版本的 Jedisspring-data-redis

               org.springframework.boot            spring-boot-starter-data-redis                                                            redis.clients                    jedis                                                    org.springframework.data                    spring-data-redis                                                                redis.clients            jedis            2.9.0                            org.springframework.data            spring-data-redis            1.8.0.RELEASE

注入 RedisTemplate

注入 RedisTemplate 我们需要三个组件,分别是JedisConnectionFactoryRedisClusterConfigurationJedisPoolConfig,下面是注入RedisTempalte 的代码。先根据配置创建 JedisConnectFactory 同时需要配置 RedisClusterConfigurationJedisPoolConfig,最后将JedisConnectionFactory 返回用于创建RedisTemplate

import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import org.apache.commons.pool2.impl.GenericObjectPoolConfig;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Primary;import org.springframework.data.redis.connection.RedisClusterConfiguration;import org.springframework.data.redis.connection.RedisNode;import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;import java.util.ArrayList;import java.util.List;public class RedisClusterConfig {    @Bean(name = "redisTemplate")    @Primary    public RedisTemplate redisClusterTemplate(@Value("${spring.custome.redis.cluster.nodes}") String host,                                     @Value("${spring.custome.redis.cluster.password}") String password,                                     @Value("${spring.custome.redis.cluster.timeout}") long timeout,                                     @Value("${spring.custome.redis.cluster.max-redirects}") int maxRedirect,                                     @Value("${spring.custome.redis.cluster.max-active}") int maxActive,                                     @Value("${spring.custome.redis.cluster.max-wait}") int maxWait,                                     @Value("${spring.custome.redis.cluster.max-idle}") int maxIdle,                                     @Value("${spring.custome.redis.cluster.min-idle}") int minIdle) {        JedisConnectionFactory connectionFactory =  jedisClusterConnectionFactory(host, password,                timeout, maxRedirect, maxActive, maxWait, maxIdle, minIdle);        return createRedisClusterTemplate(connectionFactory);    }    private JedisConnectionFactory jedisClusterConnectionFactory(String host, String password,                                                                   long timeout, int maxRedirect, int maxActive, int maxWait, int maxIdle, int minIdle) {        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();        List nodeList = new ArrayList();        String[] cNodes = host.split(",");        //分割出集群节点        for (String node : cNodes) {            String[] hp = node.split(":");            nodeList.add(new RedisNode(hp[0], Integer.parseInt(hp[1])));        }        redisClusterConfiguration.setClusterNodes(nodeList);        redisClusterConfiguration.setPassword(password);        redisClusterConfiguration.setMaxRedirects(maxRedirect);        // 连接池通用配置        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();        genericObjectPoolConfig.setMaxIdle(maxIdle);        genericObjectPoolConfig.setMaxTotal(maxActive);        genericObjectPoolConfig.setMinIdle(minIdle);        genericObjectPoolConfig.setMaxWaitMillis(maxWait);        genericObjectPoolConfig.setTestWhileIdle(true);        genericObjectPoolConfig.setTimeBetweenEvictionRunsMillis(300000);        JedisClientConfiguration.DefaultJedisClientConfigurationBuilder builder = (JedisClientConfiguration.DefaultJedisClientConfigurationBuilder) JedisClientConfiguration                .builder();        builder.connectTimeout(Duration.ofSeconds(timeout));        builder.usePooling();        builder.poolConfig(genericObjectPoolConfig);        JedisConnectionFactory connectionFactory = new JedisConnectionFactory(redisClusterConfiguration, builder.build());        // 连接池初始化        connectionFactory.afterPropertiesSet();        return connectionFactory;    }    private RedisTemplate createRedisClusterTemplate(JedisConnectionFactory redisConnectionFactory) {        RedisTemplate redisTemplate = new RedisTemplate();        redisTemplate.setConnectionFactory(redisConnectionFactory);        Jackson2JsonRedisSerializer<Object> 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的序列化方式        redisTemplate.setKeySerializer(stringRedisSerializer);        // hash的key也采用String的序列化方式        redisTemplate.setHashKeySerializer(stringRedisSerializer);        // value序列化方式采用jackson        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);        // hash的value序列化方式采用jackson        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);        redisTemplate.afterPropertiesSet();        return redisTemplate;    }}

编写工具类

其实到这里基本上已经完成了,我们可以看到 SpringBoot 项目接入 Redis 集群还是比较简单的,而且如果之前单机环境就是采用RedisTemplate 的话,现在也就不需要编写工具类,之前的操作依旧有效。

    public boolean delete(String key) {        try {            return getTemplate().delete(key);        } catch (Exception e) {            log.error("redis hasKey() is error");            return false;        }    }        public Object get(String key) {        return key == null ? null : getTemplate().opsForValue().get(key);    }        public boolean set(String key, Object value) {        try {            getTemplate().opsForValue().set(key, value);            return true;        } catch (Exception e) {            log.error("redis set() is error");            return false;        }    }        public boolean set(String key, Object value, long time) {        try {            if (time > 0) {                getTemplate().opsForValue().set(key, value, time, TimeUnit.SECONDS);            } else {                set(key, value);            }            return true;        } catch (Exception e) {            log.error("redis set() is error");            return false;        }    }        public Long incr(String key) {        return getTemplate().opsForValue().increment(key);    }    public Long incrBy(String key, long step) {        return getTemplate().opsForValue().increment(key, step);    }        public Object hget(String key, String item) {        return getTemplate().opsForHash().get(key, item);    }        public Map hmget(String key) {        return getTemplate().opsForHash().entries(key);    }        public List<Object> hmget(String key, List values) {        return getTemplate().opsForHash().multiGet(key, values);    }

以上就是“SpringBoot项目如何接入Redis集群”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯