为了提高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互为主从,所以里面都缓存了相同的品牌详情信息。

图片

配置文件地址

https://github.com/macrozheng/mall-learning/tree/master/document/redis-cluster

项目源码地址

https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-redis


更多相关文章

  1. 在Docker容器中部署整套基于Spring Cloud的微服务架构,看这篇就对
  2. 1.docker介绍安装,镜像管理,通过容器、模板创建镜像
  3. 2.docker容器管理、仓库管理、数据管理、数据卷备份恢复
  4. mall在Linux环境下的部署(基于Docker容器)
  5. 手动部署ceph octopus集群
  6. 一文读懂 SuperEdge 边缘容器架构与原理
  7. Nacos集群模式部署
  8. JDK 中有哪些同步容器?并发容器?
  9. CopyOnWriteArrayList,一个面试中经常问到的冷门容器

随机推荐

  1. 如何使用jQuery的叠加对话框作为反馈表单
  2. 带有括号的某些字符串导致Ajax POST操作
  3. inarray(),如何正确使用它?
  4. 3.29 学前端 jquery之操作元素之属性操作
  5. iPad上的jQuery点击事件无法正常工作
  6. 如何使用jQuery UI Datepicker作为Django
  7. 如何使用带有“IF”条件的按钮改变DIV的
  8. jQuery返回一个没有逗号的字符串的前5个
  9. 超好用的一个JQUERY分页器
  10. Jssor滑块不适用于AngularJS