美文网首页老男孩的成长之路互联网科技Java 杂谈
SpringBoot2.X整合Redis(单机+集群+多数据源)

SpringBoot2.X整合Redis(单机+集群+多数据源)

作者: java欧阳丰 | 来源:发表于2019-08-29 14:24 被阅读0次

    Redis 三大客户端

    简介

    Jedis:是Redis 老牌的Java实现客户端,提供了比较全面的Redis命令的支持,

    Redisson:实现了分布式和可扩展的Java数据结构。

    Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。

    优点:

    Jedis:比较全面的提供了Redis的操作特性

    Redisson:促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如分布式锁,分布式集合,可通过Redis支持延迟队列

    Lettuce:主要在一些分布式缓存框架上使用比较多

    可伸缩:

    Jedis:使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis

    Redisson:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作

    Lettuce:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作

    pipeline 的支持

    jedis 通过一定的改造后可以支持pipeline, 具体可以看 Redis 批量操作之 pipeline
    但是 Lettuce 的pipeline行为很奇怪. 在 Spring RedisTemplate 中的 executePipelined 方法中的情况:

    有时完全是一条一条命令地发送

    有时全合并几条命令发送

    但跟完全 pipeline 的方式不同, 测试多次, 但没发现有一次是完整 pipeline 的

    所以如果需要使用pipeline的话, 建议还是使用Jedis

    Lettuce 接入

    单机版

    配置文件

        host: 192.168.131.118
        port: 4884
        password: dsgs548
        database: 0
        # lettuce简单配置
        lettuce:
          pool:
            # 最大活跃链接数 默认8
            max-active: 5
            # 最大空闲连接数 默认8
            max-idle: 10
            # 最小空闲连接数 默认0
            min-idle: 0
    

    redis配置类

    @Configuration
    public class RedisConfig {
        @Bean
        public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
            RedisTemplate<String, Object> 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;
        }
    }
    

    直接引入RedisTemplate 即可, 单机版比较简单

    集群版+多数据源

    配置文件

    spring:
      redis:
        cluster:
          nodes: 192.168.131.118:4883,192.168.131.118:4884,192.168.131.118:4885
    #      nodes:
    #        - 192.168.131.118:4883
    #        - 1192.168.131.118:4884
    #        - 192.168.131.118:4885
        password: adfafsas
        lettuce:
          pool:
            # 最大活跃链接数 默认8
            max-active: 5
            # 最大空闲连接数 默认8
            max-idle: 10
            # 最小空闲连接数 默认0
            min-idle: 0
      secondaryRedis:
        cluster:
          nodes: 192.168.131.118:4883,192.168.131.118:4884,192.168.131.118:4885
    #      nodes:
    #        - 192.168.131.118:4883
    #        - 192.168.131.118:4884
    #        - 192.168.131.118:4885
        password: advfafasfsa
    

    redis配置类

    @Configuration
    public class RedisConfig {
    
        @Autowired
        private Environment environment;
        /**
         * 配置lettuce连接池
         *
         * @return
         */
        @Bean
        @Primary
        @ConfigurationProperties(prefix = "spring.redis.cluster.lettuce.pool")
        public GenericObjectPoolConfig redisPool() {
            return new GenericObjectPoolConfig();
        }
    
        /**
         * 配置第一个数据源的
         *
         * @return
         */
        @Bean("redisClusterConfig")
        @Primary
        public RedisClusterConfiguration redisClusterConfig() {
    
            Map<String, Object> source = new HashMap<>(8);
            source.put("spring.redis.cluster.nodes", environment.getProperty("spring.redis.cluster.nodes"));
            RedisClusterConfiguration redisClusterConfiguration;
            redisClusterConfiguration = new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration", source));
            redisClusterConfiguration.setPassword(environment.getProperty("spring.redis.password"));
            return redisClusterConfiguration;
    
        }
    
        /**
         * 配置第一个数据源的连接工厂
         * 这里注意:需要添加@Primary 指定bean的名称,目的是为了创建两个不同名称的LettuceConnectionFactory
         *
         * @param redisPool
         * @param redisClusterConfig
         * @return
         */
        @Bean("lettuceConnectionFactory")
        @Primary
        public LettuceConnectionFactory lettuceConnectionFactory(GenericObjectPoolConfig redisPool, @Qualifier("redisClusterConfig") RedisClusterConfiguration redisClusterConfig) {
            LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(redisPool).build();
            return new LettuceConnectionFactory(redisClusterConfig, clientConfiguration);
        }
    
        /**
         * 配置第一个数据源的RedisTemplate
         * 注意:这里指定使用名称=factory 的 RedisConnectionFactory
         * 并且标识第一个数据源是默认数据源 @Primary
         *
         * @param redisConnectionFactory
         * @return
         */
        @Bean("redisTemplate")
        @Primary
        public RedisTemplate redisTemplate(@Qualifier("lettuceConnectionFactory") RedisConnectionFactory redisConnectionFactory) {
            return getRedisTemplate(redisConnectionFactory);
    
        }
    
        /**
         * 配置第二个数据源
         *
         * @return
         */
        @Bean("secondaryRedisClusterConfig")
        public RedisClusterConfiguration secondaryRedisConfig() {
    
            Map<String, Object> source = new HashMap<>(8);
            source.put("spring.redis.cluster.nodes", environment.getProperty("spring.secondaryRedis.cluster.nodes"));
            RedisClusterConfiguration redisClusterConfiguration;
            redisClusterConfiguration = new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration", source));
            redisClusterConfiguration.setPassword(environment.getProperty("spring.redis.password"));
    
            return redisClusterConfiguration;
        }
    
        @Bean("secondaryLettuceConnectionFactory")
        public LettuceConnectionFactory secondaryLettuceConnectionFactory(GenericObjectPoolConfig redisPool, @Qualifier("secondaryRedisClusterConfig")RedisClusterConfiguration secondaryRedisClusterConfig) {
            LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(redisPool).build();
            return new LettuceConnectionFactory(secondaryRedisClusterConfig, clientConfiguration);
        }
    
        /**
         * 配置第一个数据源的RedisTemplate
         * 注意:这里指定使用名称=factory2 的 RedisConnectionFactory
         *
         * @param redisConnectionFactory
         * @return
         */
        @Bean("secondaryRedisTemplate")
        public RedisTemplate secondaryRedisTemplate(@Qualifier("secondaryLettuceConnectionFactory") RedisConnectionFactory redisConnectionFactory) {
            return getRedisTemplate(redisConnectionFactory);
        }
    
        private RedisTemplate getRedisTemplate(RedisConnectionFactory factory) {
            RedisTemplate<String, Object> 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;
        }
    
    }
    

    相关文章

      网友评论

        本文标题:SpringBoot2.X整合Redis(单机+集群+多数据源)

        本文链接:https://www.haomeiwen.com/subject/isjiectx.html