Spring boot 整合 Redisson

Stella981
• 阅读 937

1  概述

  Redisson实现了分布式和可扩展的Java数据结构,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

2     特点

  1. Redisson中的方法则是进行比较高的抽象,每个方法调用可能进行了一个或多个Redis方法调用。
  2. Redisson使用非阻塞的I/O和基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作。
  3. Redisson不仅提供了一系列的分布式Java常用对象,基本可以与Java的基本数据结构通用,还提供了许多分布式服务,其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish/Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service)。
    在分布式开发中,Redisson可提供更便捷的方法。

3  第三方框架整合

  1. Redisson提供了和Spring框架的各项特性类似的,以Spring XML的命名空间的方式配置RedissonClient实例和它所支持的所有对象和服务;
  2. Redisson完整的实现了Spring框架里的缓存机制;
  3. Redisson在Redis的基础上实现了Java缓存标准规范;
  4. Redisson为Apache Tomcat集群提供了基于Redis的非黏性会话管理功能。该功能支持Apache Tomcat的6、7和8版。
  5. Redisson还提供了Spring Session会话管理器的实现。

4  spring boot 整合 Redisson

  1. pom


    org.redisson redisson 3.10.6
  2. properties

    spring:      
      redisson:
        enabled: true
        cluster: false
        nodes: x.x.x.x:x
        password: xxxx
    
  3. redisson配置类RedissonConfig

    package com.yx.redis.redisson;
    
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang3.StringUtils;
    import org.redisson.Redisson;
    import org.redisson.api.RedissonClient;
    import org.redisson.config.ClusterServersConfig;
    import org.redisson.config.Config;
    import org.redisson.config.SingleServerConfig;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Conditional;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.util.ObjectUtils;
    
    /**
     * @Auther: yx
     * @Date: 2019-04-30 15:55
     * @Description: RedissonConfig
     */
    @Configuration
    @Conditional(RedissonCondition.class)
    @EnableConfigurationProperties({RedissonProperties.class})
    @Slf4j
    public class RedissonConfig {
    
        @Bean
        public RedissonProperties getRedissonProperties() {
            return new RedissonProperties();
        }
    
        /**
         * 单机模式自动装配
         * @return
         */
        @Bean
        @ConditionalOnProperty(name="spring.redisson.cluster", havingValue = "false")
        public RedissonClient getSingleRedisson() {
            Config config = new Config();
            RedissonProperties redissonProperties = getRedissonProperties();
    
            String nodes = redissonProperties.getNodes();
            if (StringUtils.isEmpty(nodes)) {
                throw new RuntimeException("nodes is not allow empty! please check your redis config");
            }
    
            SingleServerConfig serverConfig = config.useSingleServer()
                    .setAddress("redis://" + nodes)
                    .setTimeout(redissonProperties.getTimeout())
                    .setConnectionPoolSize(redissonProperties.getConnectionPoolSize())
                    .setConnectionMinimumIdleSize(redissonProperties.getConnectionMinimumIdleSize());
    
            if(StringUtils.isNotBlank(redissonProperties.getPassword())) {
                serverConfig.setPassword(redissonProperties.getPassword());
            }
    
            log.info("init redisson success .... ");
    
            return Redisson.create(config);
        }
    
    
        @Bean
        @ConditionalOnProperty(name="spring.redisson.cluster", havingValue = "true")
        public RedissonClient getClusterRedisson(){
            RedissonProperties redissonProperties = getRedissonProperties();
    
            String[] nodes = redissonProperties.getNodes().split(",");
            if (ObjectUtils.isEmpty(nodes)) {
                throw new RuntimeException("nodes is not allow empty! please check your redis config");
            }
    
            for(int i=0;i<nodes.length;i++){
                nodes[i] = "redis://"+nodes[i];
            }
    
            RedissonClient redisson = null;
            Config config = new Config();
            ClusterServersConfig clusterServersConfig = config.useClusterServers()
                    .setScanInterval(2000)
                    .setTimeout(redissonProperties.getTimeout())
                    .addNodeAddress(nodes);
    
            if(StringUtils.isNotBlank(redissonProperties.getPassword())) {
                clusterServersConfig.setPassword(redissonProperties.getPassword());
            }
    
            redisson = Redisson.create(config);
    
            log.info("init redisson cluster success .... ");
            return redisson;
        }
    
    }
    
  4. redisson配置类RedissonCondition

    package com.yx.redis.redisson;
    
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.context.annotation.Condition;
    import org.springframework.context.annotation.ConditionContext;
    import org.springframework.core.type.AnnotatedTypeMetadata;
    import org.springframework.util.ObjectUtils;
    
    /**
     * @Auther: yx
     * @Date: 2019-04-30 15:56
     * @Description: RedissionCondition
     */
    public class RedissonCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return propertyIsTrue(context, "spring.redisson.enabled");
        }
    
        private static boolean propertyIsTrue(ConditionContext context, String key) {
            return context.getEnvironment().getProperty(key, Boolean.TYPE, Boolean.FALSE);
        }
    }
    
  5. redisson配置类RedissonProperties

    package com.yx.redis.redisson;
    
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    /**
     * @Auther: yx
     * @Date: 2019-04-30 15:52
     * @Description: RedissonProperties
     */
    @Data
    @ConfigurationProperties(prefix = "spring.redisson")
    public class RedissonProperties {
        private int timeout = 3000;
    
        private Boolean cluster;
    
        private String nodes;
    
        private String password;
    
        private int database = 0;
    
        private int connectionPoolSize = 64;
    
        private int connectionMinimumIdleSize = 10;
    
        private int slaveConnectionPoolSize = 250;
    
        private int masterConnectionPoolSize = 250;
    
    }
    
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这