zoukankan      html  css  js  c++  java
  • Redis集群——SpringBoot连接Redis集群(带密码)

    第一步,新建项目maven项目,添加依赖

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

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    (2)加入Redis相关依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>

    第二步,application.yml加入redis相关配置

    spring:
      application:
        name: redis-cluster
      redis:
        cluster:
          nodes: 192.168.0.102:6379,192.168.0.103:6379,192.168.0.105:6379
          max-redirects: 6
    redis:
      timeout: 10000 #客户端超时时间单位是毫秒 默认是2000
      maxIdle: 300 #最大空闲数
      maxTotal: 1000 #控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
      maxWaitMillis: 1000 #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
      minEvictableIdleTimeMillis: 300000 #连接的最小空闲时间 默认1800000毫秒(30分钟)
      numTestsPerEvictionRun: 1024 #每次释放连接的最大数目,默认3
      timeBetweenEvictionRunsMillis: 30000 #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
      testOnBorrow: true #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
      testWhileIdle: true #在空闲时检查有效性, 默认false
      password: 123456 #密码
    server:
      port: 8080

    第三步,编写配置类

    package com.qxj.redis;
    
    import java.util.HashSet;
    import java.util.Set;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.RedisClusterConfiguration;
    import org.springframework.data.redis.connection.RedisNode;
    import org.springframework.data.redis.connection.RedisPassword;
    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 com.fasterxml.jackson.annotation.JsonAutoDetect;
    import com.fasterxml.jackson.annotation.PropertyAccessor;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import redis.clients.jedis.JedisPoolConfig;
    
    @Configuration
    public class RedisClusterConfig {
    
        @Value("${spring.redis.cluster.nodes}")
        private String clusterNodes;
        @Value("${spring.redis.cluster.max-redirects}")
        private int maxRedirects;
        @Value("${redis.password}")
        private String password;
        @Value("${redis.timeout}")
        private int timeout;
        @Value("${redis.maxIdle}")
        private int maxIdle;
        @Value("${redis.maxTotal}")
        private int maxTotal;
        @Value("${redis.maxWaitMillis}")
        private int maxWaitMillis;
        @Value("${redis.minEvictableIdleTimeMillis}")
        private int minEvictableIdleTimeMillis;
        @Value("${redis.numTestsPerEvictionRun}")
        private int numTestsPerEvictionRun;
        @Value("${redis.timeBetweenEvictionRunsMillis}")
        private int timeBetweenEvictionRunsMillis;
        @Value("${redis.testOnBorrow}")
        private boolean testOnBorrow;
        @Value("${redis.testWhileIdle}")
        private boolean testWhileIdle;
    
        /**
         * Redis连接池的配置
         * 
         * @return JedisPoolConfig
         */
        @Bean
        public JedisPoolConfig getJedisPoolConfig() {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            // 最大空闲数
            jedisPoolConfig.setMaxIdle(maxIdle);
            // 连接池的最大数据库连接数
            jedisPoolConfig.setMaxTotal(maxTotal);
            // 最大建立连接等待时间
            jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
            // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
            jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
            // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
            jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
            // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
            jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
            // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
            jedisPoolConfig.setTestOnBorrow(testOnBorrow);
            // 在空闲时检查有效性, 默认false
            jedisPoolConfig.setTestWhileIdle(testWhileIdle);
            return jedisPoolConfig;
        }
    
        /**
         * Redis集群的配置
         * 
         * @return RedisClusterConfiguration
         */
        @Bean
        public RedisClusterConfiguration redisClusterConfiguration() {
            RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
            // Set<RedisNode> clusterNodes
            String[] serverArray = clusterNodes.split(",");
            Set<RedisNode> nodes = new HashSet<RedisNode>();
            for (String ipPort : serverArray) {
                String[] ipAndPort = ipPort.split(":");
                nodes.add(new RedisNode(ipAndPort[0].trim(), Integer.valueOf(ipAndPort[1])));
            }
            redisClusterConfiguration.setClusterNodes(nodes);
            redisClusterConfiguration.setMaxRedirects(maxRedirects);
            redisClusterConfiguration.setPassword(RedisPassword.of(password));
            return redisClusterConfiguration;
        }
    
        /**
         * redis连接工厂类
         * 
         * @return JedisConnectionFactory
         */
        @Bean
        public JedisConnectionFactory jedisConnectionFactory() {
            // 集群模式
            JedisConnectionFactory factory = new JedisConnectionFactory(redisClusterConfiguration(), getJedisPoolConfig());
            return factory;
        }
    
        /**
         * 实例化 RedisTemplate 对象
         * 
         * @return RedisTemplate<String, Object>
         */
        @Bean
        public RedisTemplate<String, Object> redisTemplate() {
            RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
            // Template初始化
            initDomainRedisTemplate(redisTemplate);
            return redisTemplate;
        }
    
        /**
         * 设置数据存入 redis 的序列化方式 使用默认的序列化会导致key乱码
         */
        private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
            // 开启redis数据库事务的支持
            redisTemplate.setEnableTransactionSupport(true);
            redisTemplate.setConnectionFactory(jedisConnectionFactory());
    
            // 如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to
            // String!
            StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
            redisTemplate.setKeySerializer(stringRedisSerializer);
            // hash的key也采用String的序列化方式
            redisTemplate.setHashKeySerializer(stringRedisSerializer);
    
            // jackson序列化对象设置
            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);
    
            // value序列化方式采用jackson
            redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
            // hash的value序列化方式采用jackson
            redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
    
            redisTemplate.afterPropertiesSet();
        }
    }
    第四步,编写Controller测试类
    package com.qxj.application;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class TestController {
    
        @Autowired
        private RedisTemplate<String, Object> template;
    
        @RequestMapping("/test")
        public String test() {
            template.opsForValue().set("demo", "hello world! 你好,世界");
            String str = (String) template.opsForValue().get("demo");
            return str;
        }
    
    }

    参考文献:https://blog.csdn.net/WYA1993/article/details/88046628

  • 相关阅读:
    Spring.profile配合Jenkins发布War包,实现开发、测试和生产环境的按需切换
    Ubuntu 配置 Tomcat
    Proper usage of Java -D command-line parameters
    Linux下设置MySql自动启动
    cent6.x配置主机名及静态网络
    vmware can not be closed virtual machine is busy
    VMware虚拟机下扩容磁盘(centos7)
    Spring、MyBatis、Shiro、Quartz、Activiti框架
    Jenkins ChangeLog
    JEECG DataGridColumn dictionary使用问题
  • 原文地址:https://www.cnblogs.com/wps54213/p/12608777.html
Copyright © 2011-2022 走看看