百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Docker秒建Redis集群连SpringBoot也整上了

mhr18 2024-11-12 11:17 19 浏览 0 评论


为了提高Redis的存储容量和响应速度,有时候我们需要搭建Redis集群。本文主要讲述Redis集群环境的搭建步骤以及如何在SpringBoot中整合使用Redis集群。

Redis集群搭建

这里我们使用最方便的搭建方式,使用Docker Compose来搭建,对Docker Compose不了解的朋友可以参考下《使用Docker Compose部署SpringBoot应用》。我们将搭建一个6节点的Redis集群,包括3个主节点和3个从节点。

  • 在搭建Redis集群之前,我们需要修改下Redis的配置文件redis.conf,该文件的下载地址:https://github.com/antirez/redis/blob/5.0/redis.conf
  • 需要修改的属性如下,主要是修改了一些集群配置和运行端口,端口号需要按需修改为6391~6396:
  • # 开启集群功能
    cluster-enabled yes
    # 设置运行端口
    port 6391
    # 设置节点超时时间,单位毫秒
    cluster-node-timeout 15000
    # 集群内部配置文件
    cluster-config-file "nodes-6391.conf"
  • 然后我们需要编写docker-compose.yml文件用于编排6个Redis容器,具体属性的作用可以参考下面的注释;
  • version: "3"
    services:
      redis-master1:
        image: redis:5.0 # 基础镜像
        container_name: redis-master1 # 容器名称
        working_dir: /config # 切换工作目录
        environment: # 环境变量
          - PORT=6391 # 会使用config/nodes-${PORT}.conf这个配置文件
        ports: # 映射端口,对外提供服务
          - 6391:6391 # redis的服务端口
          - 16391:16391 # redis集群监控端口
        stdin_open: true # 标准输入打开
        tty: true # 后台运行不退出
        network_mode: host # 使用host模式
        privileged: true # 拥有容器内命令执行的权限
        volumes:
          - /mydata/redis-cluster/config:/config #配置文件目录映射到宿主机
        entrypoint: # 设置服务默认的启动程序
          - /bin/bash
          - redis.sh
      redis-master2:
        image: redis:5.0
        working_dir: /config
        container_name: redis-master2
        environment:
          - PORT=6392
        ports:
          - 6392:6392
          - 16392:16392
        stdin_open: true
        network_mode: host
        tty: true
        privileged: true
        volumes:
          - /mydata/redis-cluster/config:/config
        entrypoint:
          - /bin/bash
          - redis.sh
      redis-master3:
        image: redis:5.0
        container_name: redis-master3
        working_dir: /config
        environment:
          - PORT=6393
        ports:
          - 6393:6393
          - 16393:16393
        stdin_open: true
        network_mode: host
        tty: true
        privileged: true
        volumes:
          - /mydata/redis-cluster/config:/config
        entrypoint:
          - /bin/bash
          - redis.sh
      redis-slave1:
        image: redis:5.0
        container_name: redis-slave1
        working_dir: /config
        environment:
          - PORT=6394
        ports:
          - 6394:6394
          - 16394:16394
        stdin_open: true
        network_mode: host
        tty: true
        privileged: true
        volumes:
          - /mydata/redis-cluster/config:/config
        entrypoint:
          - /bin/bash
          - redis.sh
      redis-slave2:
        image: redis:5.0
        working_dir: /config
        container_name: redis-slave2
        environment:
          - PORT=6395
        ports:
          - 6395:6395
          - 16395:16395
        stdin_open: true
        network_mode: host
        tty: true
        privileged: true
        volumes:
          - /mydata/redis-cluster/config:/config
        entrypoint:
          - /bin/bash
          - redis.sh
      redis-slave3:
        image: redis:5.0
        container_name: redis-slave3
        working_dir: /config
        environment:
          - PORT=6396
        ports:
          - 6396:6396
          - 16396:16396
        stdin_open: true
        network_mode: host
        tty: true
        privileged: true
        volumes:
          - /mydata/redis-cluster/config:/config
        entrypoint:
          - /bin/bash
          - redis.sh
  • 从docker-compose.yml文件中我们可以看到,我们的Redis容器分别运行在6391~6396这6个端口之上, 将容器中的/config配置目录映射到了宿主机的/mydata/redis-cluster/config目录,同时还以redis.sh脚本作为该容器的启动脚本;
  • redis.sh脚本的作用是根据environment环境变量中的PORT属性,以指定配置文件来启动Redis容器;
  • redis-server  /config/nodes-${PORT}.conf
  • 接下来我们需要把Redis的配置文件和redis.sh上传到Linux服务器的/mydata/redis-cluster/config目录下;

  • 接下来上传我们的docker-compose.yml文件到Linux服务器,并使用docker-compose命令来启动所有容器;
  • docker-compose up -d
  • 启动过程中会输出如下信息;

  • 此时进入其中一个Redis容器之中,初始化Redis集群;
  • # 进入Redis容器
    docker exec -it redis-master1 /bin/bash
    # 初始化Redis集群命令
    redis-cli --cluster create \
    192.168.6.139:6391 192.168.6.139:6392 192.168.6.139:6393 \
    192.168.6.139:6394 192.168.6.139:6395 192.168.6.139:6396 \
    --cluster-replicas 1
  • 集群创建过程中会让你确认配置,输入yes确认即可;


  • Redis集群创建成功后会输出如下信息;

  • 创建成功后我们可以使用redis-cli命令连接到其中一个Redis服务;
  • # 单机模式启动
    redis-cli -h 127.0.0.1 -p 6391
    # 集群模式启动
    redis-cli -c -h 127.0.0.1 -p 6391
  • 之后通过cluster nodes命令可以查看节点信息,发现符合原来3主3从的预期。

  • SpringBoot中使用Redis集群

    我们在《Spring Data Redis 最佳实践!》中讲到了在SpringBoot中如何使用Redis,用的是单节点的Redis服务,这次我们讲下如何使用Redis集群服务。

  • 我们在原来代码的基础上进行改造,修改application.yml配置文件,添加Redis集群配置;
  • spring:
      redis:
    #    host: 192.168.6.139 # Redis服务器地址
    #    database: 0 # Redis数据库索引(默认为0)
    #    port: 6379 # Redis服务器连接端口
        password: # Redis服务器连接密码(默认为空)
        timeout: 3000ms # 连接超时时间
        lettuce:
          pool:
            max-active: 8 # 连接池最大连接数
            max-idle: 8 # 连接池最大空闲连接数
            min-idle: 0 # 连接池最小空闲连接数
            max-wait: -1ms # 连接池最大阻塞等待时间,负值表示没有限制
        cluster:
          nodes:
            - 192.168.6.139:6391
            - 192.168.6.139:6392
            - 192.168.6.139:6393
            - 192.168.6.139:6394
            - 192.168.6.139:6395
            - 192.168.6.139:6396
  • 此时我们再次调用获取品牌详情的接口,就会把品牌信息缓存到Redis集群中去了;
  • 由于Redis容器redis-master1redis-slave2互为主从,所以里面都缓存了相同的品牌详情信息。
  • 相关推荐

    Spring Boot 分布式事务实现简单得超乎想象

    环境:SpringBoot2.7.18+Atomikos4.x+MySQL5.71.简介关于什么是分布式事务,本文不做介绍。有需要了解的自行查找相关的资料。本篇文章将基于SpringBoot...

    Qt编写可视化大屏电子看板系统15-曲线面积图

    ##一、前言曲线面积图其实就是在曲线图上增加了颜色填充,单纯的曲线可能就只有线条以及数据点,面积图则需要从坐标轴的左下角和右下角联合曲线形成完整的封闭区域路径,然后对这个路径进行颜色填充,为了更美观...

    Doris大数据AI可视化管理工具SelectDB Studio重磅发布!

    一、初识SelectDBStudioSelectDBStudio是专为ApacheDoris湖仓一体典型场景实战及其兼容数据库量身打造的GUI工具,简化数据开发与管理。二、Select...

    RAD Studio 、Delphi或C++Builder设计代码编译上线缩短开发时间

    #春日生活打卡季#本月,Embarcadero宣布RADStudio12.3Athens以及Delphi12.3和C++Builder12.3,提供下载。RADStudio12.3A...

    Mybatis Plus框架学习指南-第三节内容

    自动填充字段基本概念MyBatis-Plus提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。原理自动填充功能通过实现com.baomidou.myba...

    「数据库」Sysbench 数据库压力测试工具

    sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以...

    如何选择适合公司的ERP(选erp系统的经验之谈)

    很多中小公司想搞ERP,但不得要领。上ERP的目的都是歪的,如提高效率,减少人员,堵住财务漏洞等等。真正用ERP的目的是借机提升企业管理能力,找出管理上的问题并解决,使企业管理更规范以及标准化。上ER...

    Manus放开注册,但Flowith才是Agent领域真正的yyds

    大家好,我是运营黑客。前天,AIAgent领域的当红炸子鸡—Manus宣布全面放开注册,终于,不需要邀请码就能体验了。于是,赶紧找了个小号去确认一下。然后,额……就被墙在了外面。官方解释:中文版...

    歌浓酒庄总酿酒师:我们有最好的葡萄园和最棒的酿酒师

    中新网1月23日电1月18日,张裕董事长周洪江及总经理孙健一行在澳大利亚阿德莱德,完成了歌浓酒庄股权交割签约仪式,这也意味着张裕全球布局基本成型。歌浓:澳大利亚年度最佳酒庄据悉,此次张裕收购的...

    软件测试进阶之自动化测试——python+appium实例

    扼要:1、了解python+appium进行APP的自动化测试实例;2、能根据实例进行实训操作;本课程主要讲述用python+appium对APP进行UI自动化测试的例子。appium支持Androi...

    为什么说Python是最伟大的语言?看图就知道了

    来源:麦叔编程作者:麦叔测试一下你的分析能力,直接上图,自己判断一下为什么Python是最好的语言?1.有图有真相Java之父-JamesGoshlingC++之父-BjarneStrou...

    如何在Eclipse中配置Python开发环境?

    Eclipse是著名的跨平台集成开发环境(IDE),最初主要用来Java语言开发。但是我们通过安装不同的插件Eclipse可以支持不同的计算机语言。比如说,我们可以通过安装PyDev插件,使Eclip...

    联合国岗位上新啦(联合国的岗位)

    联合国人权事务高级专员办事处PostingTitleIntern-HumanRightsDutyStationBANGKOKDeadlineOct7,2025CategoryandL...

    一周安全漫谈丨工信部:拟定超1亿条一般数据泄露属后果严重情节

    工信部:拟定超1亿条一般数据泄露属后果严重情节11月23日,工信部官网公布《工业和信息化领域数据安全行政处罚裁量指引(试行)(征求意见稿)》。《裁量指引》征求意见稿明确了行政处罚由违法行为发生地管辖、...

    oracle列转行以及C#执行语句时报错问题

    oracle列转行的关键字:UNPIVOT,经常查到的怎么样转一列,多列怎么转呢,直接上代码(sshwomeyourcode):SELECTsee_no,diag_no,diag_code,...

    取消回复欢迎 发表评论: