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

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

mhr18 2024-11-12 11:17 11 浏览 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互为主从,所以里面都缓存了相同的品牌详情信息。
  • 相关推荐

    几种 TCP 连接中出现 RST 的情况

    现在是一个网络时代了。应该不少程序员在编程中需要考虑多机、局域网、广域网的各种问题。所以网络知识也是避免不了学习的。而且笔者一直觉得TCP/IP网络知识在一个程序员知识体系中必需占有一席之地的。在...

    Redis连接使用报RDB error错误

    该错误信息:Errorinexecution;nestedexceptionisio.lettuce.core.RedisCommandExecutionException:MISC...

    lua 语法介绍与 NGINX lua 高级用法实战操作

    一、概述lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。官网:https://www.lua.org/二、l...

    Python教程——20.协程 - 2

    异步编程asyncio.Future对象Task继承Future,Task对象内部中的await结果的处理基于Future对象来的在Future对象中会保存当前执行的这个协程任务的状态,如果当...

    “我的足迹”、“浏览历史”,Redis如何快速记录与展示?

    咱们在网上“买买买”、“逛逛逛”的时候,总会留下各种各样的“足迹”。无论是电商APP里你最近浏览过的商品,视频网站上你刚刚看过的剧集,还是新闻客户端里你点开过的文章……这些“历史记录”,有时候还真挺有...

    你手机上的“消息推送”,Redis可能参与其中

    手机上那些时不时就“叮咚”一下的消息推送,确实是咱们数字生活里不可或缺的一部分。这篇咱们就来聊聊,Redis这位“消息灵通人士”,是如何在这场“信息接力赛”中大显身手,确保那些重要的、有趣的通知,能够...

    短视频APP的“附近的人”,Redis如何快速匹配?

    刷短视频,除了看各种搞笑段子、才艺展示,有时候是不是也想看看“同城”或者“附近”的人都在发些啥有意思的内容?或者,平台也会时不时地给你推荐一些“附近正在直播”的主播,让你感觉一下子拉近了和这个虚拟世界...

    微信朋友圈的点赞、评论,Redis在背后默默付出

    微信朋友圈,这片小小的“自留地”,承载了我们多少喜怒哀乐、生活点滴啊!一张精心修饰的照片,一段随感而发的文字,发出去之后,最期待的是什么?那必须是屏幕下方不断冒出来的小红心和一条条真诚(或者商业互吹)...

    网站登录老是掉线?Redis帮你记住你是谁!

    有没有过这样的糟心体验?你好不容易登录了一个网站,刚看了两篇帖子,或者购物车里刚加了几件宝贝,结果一刷新页面,或者稍微离开了一会儿,回来就发现——“哎?我怎么又退出了?!”又得重新输入用户名、密码、...

    你常用的APP,哪些地方可能用到了Redis?(猜想与分析)

    咱们现在的生活,简直是离不开各种各样的手机APP了!从早上睁眼刷新闻,到中午点外卖,再到晚上刷短视频、玩游戏,一天到头,指尖在屏幕上就没停过。这些APP为了让我们用得爽、用得顺心,背后可是使出了浑身解...

    Redis是啥?为啥程序员天天挂嘴边?小白也能看懂!

    这Redis到底是何方神圣?为啥那些天天在电脑前敲代码的程序员小哥哥小姐姐们,老是把它挂在嘴边,好像离了它地球都不转了似的?别担心,咱们今天不说那些听了就头大的代码和术语,就用大白话,保证你听完一拍大...

    面试官:请你说说Redis为什么这么快?

    1)Redis是基于内存的存储数据库,绝大部分的命令处理只是纯粹的内存操作,内存的读写速度非常快。2)Redis是单进程线程的服务(实际上一个正在运行的RedisServer肯定不止一个线程,但只有...

    有了强大的关系型数据库,为什么还需要Redis?

    在数字世界的浩瀚海洋中,关系型数据库,例如我们熟知的MySQL、PostgreSQL或Oracle,无疑是那些承载着核心业务数据、坚如磐石的“国家图书馆”或“银行金库”。它们以严谨的结构、强大的事务处...

    Java 中间件数据可靠性串讲:从 MQ 、MySQL、Redis 不丢失的保障之道

    引言在现代分布式系统中,中间件扮演着至关重要的角色,它们是构建高可用、高性能、高可扩展应用架构的基石。消息队列(MQ)、数据库(如MySQL)、缓存(如Redis)等是其中最具代表性的组件。然而,...

    运维部署方式之——虚机部署

    标准化使用作業系统:LinuxCentOS7自动化方式通过Ansible系统初始化playbook来管理。目的系统初始化工作是一个简单、繁复的工作,从云网得到的虚拟主机只是一个基础的系统环境,...

    取消回复欢迎 发表评论: