dockercompose部署redis哨兵模式并集成springboot

第一步 编写compose文件

docker-compose.yml

version: '3.8'networks:redis-network:driver: bridgeservices:redis-master:image: redis:7.2.4container_name: redis-mastercommand: ["sh", "-c", "redis-server --protected-mode no --slave-announce-ip 192.168.0.5 --slave-announce-port 6379 --requirepass 123456"]ports:- "6379:6379"networks:- redis-networkredis-slave1:image: redis:7.2.4container_name: redis-slave1ports:- "6380:6379"depends_on:- redis-mastercommand: ["sh", "-c", "redis-server --slaveof redis-master 6379 --masterauth 123456 --requirepass 123456 --protected-mode no --slave-announce-ip 192.168.0.5 --slave-announce-port 6380"]networks:- redis-networkredis-slave2:image: redis:7.2.4container_name: redis-slave2ports:- "6381:6379"depends_on:- redis-mastercommand: ["sh", "-c", "redis-server --slaveof redis-master 6379 --masterauth 123456 --requirepass 123456 --protected-mode no --slave-announce-ip 192.168.0.5 --slave-announce-port 6381"]networks:- redis-networkredis-sentinel1:image: redis:7.2.4container_name: redis-sentinel1depends_on:- redis-master- redis-slave1- redis-slave2command: >sh -c "mkdir -p /usr/local/etc/redis &&echo 'port 26379' > /usr/local/etc/redis/sentinel.conf &&echo 'protected-mode no' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel auth-pass mymaster 123456' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel announce-ip 192.168.0.5' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel announce-port 26379' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel monitor mymaster 192.168.0.5 6379 2' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel down-after-milliseconds mymaster 5000' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel failover-timeout mymaster 10000' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel parallel-syncs mymaster 1' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel resolve-hostnames yes' >> /usr/local/etc/redis/sentinel.conf &&redis-sentinel /usr/local/etc/redis/sentinel.conf"ports:- "26379:26379"networks:- redis-networkredis-sentinel2:image: redis:7.2.4container_name: redis-sentinel2depends_on:- redis-master- redis-slave1- redis-slave2command: >sh -c "mkdir -p /usr/local/etc/redis &&echo 'port 26379' > /usr/local/etc/redis/sentinel.conf &&echo 'protected-mode no' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel auth-pass mymaster 123456' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel announce-ip 192.168.0.5' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel announce-port 26380' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel monitor mymaster 192.168.0.5 6379 2' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel down-after-milliseconds mymaster 5000' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel failover-timeout mymaster 10000' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel parallel-syncs mymaster 1' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel resolve-hostnames yes' >> /usr/local/etc/redis/sentinel.conf &&redis-sentinel /usr/local/etc/redis/sentinel.conf"ports:- "26380:26379"networks:- redis-networkredis-sentinel3:image: redis:7.2.4container_name: redis-sentinel3depends_on:- redis-master- redis-slave1- redis-slave2command: >sh -c "mkdir -p /usr/local/etc/redis &&echo 'port 26379' > /usr/local/etc/redis/sentinel.conf &&echo 'protected-mode no' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel auth-pass mymaster 123456' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel announce-ip 192.168.0.5' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel announce-port 26381' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel monitor mymaster 192.168.0.5 6379 2' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel down-after-milliseconds mymaster 5000' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel failover-timeout mymaster 10000' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel parallel-syncs mymaster 1' >> /usr/local/etc/redis/sentinel.conf &&echo 'sentinel resolve-hostnames yes' >> /usr/local/etc/redis/sentinel.conf &&redis-sentinel /usr/local/etc/redis/sentinel.conf"ports:- "26381:26379"networks:- redis-network

到对应目录下面执行 docker-compose up -d命令

注意事项:

1、--slave-announce-ip 设置的是主机的IP,一定要设置,不然springboot无法访问到redis服务(主从都要设置)

2、--slave-announce-port 设置的是映射到主机的端口,也需要设置(主从都要设置)

3、--requirepass  redis的密码,也需要设置,不然springboot会报错redis不安全(主从都要设置)

4、--masterauth 从redis连接主redis的密码认证,必不可少(从redis都要设置)

5、sentinel announce-ip和sentinel announce-port 设置的是哨兵暴露出去的IP和端口(所有哨兵都要设置)

6、sentinel monitor mymaster 192.168.0.5 6379 2  这里得填主redis的外部ip,也就是主redis设置的slave-announce-ip参数

7、如果遇到sentinel.conf权限不够的需要设置权限 chmod 777  sentinel.conf(之前用其他方式的时候遇到过)

8、如果需要挂载文件的,需要自己根据这个yml做适当调整

第二步 验证

去主redis命令行执行

redis-cli -a 123456 info

查看从redis是否都已连接上

查看sentinel哨兵是否正常:

执行 redis-cli -p 26379

info sentinel

一切正常!(再不正常我就该疯了......踩了无数坑)

第三步 springboot集成

1、添加依赖

        <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.25.2</version></dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency>

2、yml配置文件

server:port: 8084
spring:redisson:#  单机模式host: 192.168.0.5port: 6379# 哨兵模式sentinel:master: mymasternodes: 192.168.0.5:26379,192.168.0.5:26380,192.168.0.5:26381# 集群模式cluster: 192.168.0.5:6379,192.168.0.5:6380,192.168.0.5:6381# 密码password: 123456

ip地址请换成自己的主机ip

3、config配置

package com.example.demo.config;import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.StringCodec;
import org.redisson.config.Config;
import org.redisson.config.ReadMode;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Slf4j
@Configuration
public class RedissonConfig {@Value("${spring.redisson.sentinel.nodes}")private  String sentinel;@Value("${spring.redisson.sentinel.master}")private String masterName;@Value("${spring.redisson.cluster}")private  String cluster;@Value("${spring.redisson.host}")private String host;@Value("${spring.redisson.port}")private  String port;@Value("${spring.redisson.password}")private String password;private int timeout = 2000;private int scanInterval = 60000;private static String ADDRESS_PREFIX = "redis://";/*** 单机模式*/@Beanpublic RedissonClient initBean() {// 哨兵模式if (StringUtils.isNotBlank(sentinel)) {log.info("redis is sentinel mode");return redissonSentinel();}// 集群模式if (StringUtils.isNotBlank(cluster)) {log.info("redis is cluster mode");return redissonCluster();}// 单机模式if (StringUtils.isNotBlank(host)) {log.info("redis is single mode");return redissonSingle();}log.error("redisson config can not support this redis mode");return null;}/*** 单机模式*/private RedissonClient redissonSingle() {Config config = new Config();String address = ADDRESS_PREFIX+host+":"+port;//设置config.setCodec(new StringCodec())//这是用的集群server.useSingleServer().setAddress(address).setTimeout(timeout).setPassword(password);return Redisson.create(config);}/*** 哨兵模式*/private RedissonClient redissonSentinel() {String[] nodes = sentinel.split(",");//redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加for(int i=0;i<nodes.length;i++){nodes[i] = ADDRESS_PREFIX+nodes[i];}Config config = new Config();//设置config.setCodec(new StringCodec()).useSentinelServers().setMasterName(masterName).setPassword(password).setTimeout(timeout).addSentinelAddress(nodes)// 在Redisson启动期间启用sentinels列表检查,默认为true,这里我们设置为false,不检查.setCheckSentinelsList(false);return Redisson.create(config);}/*** 集群模式*/private RedissonClient redissonCluster() {String[] nodes = cluster.split(",");//redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加for(int i=0;i<nodes.length;i++){nodes[i] = ADDRESS_PREFIX+nodes[i];}Config config = new Config();//设置config.setCodec(new StringCodec())//这是用的集群server.useClusterServers()//设置集群状态扫描时间.setScanInterval(scanInterval).addNodeAddress(nodes).setPassword(password).setReadMode(ReadMode.MASTER);;return Redisson.create(config);}}

4、测试

package com.example.demo.service;import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;@Service
@Slf4j
public class RedissonTestService {@Resourceprivate RedissonClient redissonClient;//锁过期时间private static final Long LOCK_KEY_TIME = 120L;public void doTest() {//定时任务执行周期较短,为防止数据重复修改,加入锁RLock lock = redissonClient.getLock("test");// 尝试获取锁并设定锁的过期时间boolean acquired = false;try {//获取锁acquired = lock.tryLock(0, LOCK_KEY_TIME, TimeUnit.SECONDS);} catch (InterruptedException e) {log.error("取锁失败");}if (acquired) {try {// 执行业务逻辑Thread.sleep(10000);}catch (Exception e) {log.error("处理失败");//业务异常处理逻辑}finally {// 释放锁lock.unlock();}} else {// 获取锁失败,说明有其他线程或进程正在处理数据// 可以进行重试或触发告警机制}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/34279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python项目加密和增加时间许可证

1.bat&#xff0c;执行如下的命令&#xff0c;第一句是更新或增加许可证 第二句是加密draw_face.py python offer.py pyarmor obfuscate -O dist draw_face.py绘制自制人脸.py&#xff0c;调用加密的代码draw_face代码 import sys import os import cv2# 添加加密模块所在的路…

R语言做图

目录 1. 图形参数 2. 低级图形 3. 部分高级图形 参考 1. 图形参数 图形参数用于设置图形中各种属性。 有些参数直接用在绘图函数内&#xff0c;如plot函数可以用 pch&#xff08;点样式&#xff09;、col&#xff08;颜色&#xff09;、cex&#xff08;文字符号大小倍数&…

ONLYOFFICE 桌面编辑器 8.1

ONLYOFFICE 简介 ONLYOFFICE 是一个开源的办公套件&#xff0c;它提供了在线文档编辑器、表格编辑器和演示文稿编辑器&#xff0c;这些编辑器能够兼容 Microsoft Office 格式&#xff08;.docx, .xlsx, .pptx&#xff09;以及其他流行的标准格式。ONLYOFFICE 的核心功能包括多…

分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别

分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别 目录 分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融…

《2024天猫618大促-首波男装销售报告》

这份报告主要分析了2024年天猫618大促期间的首波男装销售情况,从多个维度进行了深入的复盘和分析。报告中不仅包含了销售数据的统计分析,还对消费者行为、品牌表现、产品趋势等方面进行了详细的解读。通过对这些数据和信息的深入挖掘,报告揭示了当前男装市场的一些重要趋势和特…

qt经典界面框架

目的 其实就是一个简单的界面显示&#xff0c;是很常用的形式。 说起来简单也是简单&#xff0c;但当初&#xff0c;刚开始做时&#xff0c;感觉非常的复杂&#xff0c;不知如何下手。 现在感觉简单多了。 这个框架利用了QT的现成的MainWindow与QDockWidget&#xff0c;这样就…

java基于ssm+jsp 人才公寓管理系统

1管理员功能模块 管理员登录&#xff0c;通过填写用户名、密码进行登录&#xff0c;如图1所示。 图1管理员登录界面图 管理员登录进入人才公寓管理系统可以查看个人中心、住户管理、小区公告管理、停车位管理、安保人员管理、安保值班管理、房屋信息管理、外来登记管理、物品…

自定义User-Agent:使用Python Requests进行网络请求

在网络编程和数据采集领域&#xff0c;HTTP请求是与服务器交互的基本方式。User-Agent&#xff08;用户代理&#xff09;是HTTP请求中的一个重要字段&#xff0c;它告诉服务器发起请求的客户端类型和版本信息。在某些情况下&#xff0c;自定义User-Agent可以帮助我们模拟不同的…

CodeIgniter学习笔记 Item6--CI中的常规主题_ci中parent __construct();

$route[default\_controller] welcome; $route[404\_override] ;更重要的功能是&#xff0c;如果我们要实现通过/index.php/news/4.html访问/index.php/article/show/1这样一个需求&#xff0c;可以在routes.php定义路由关系&#xff0c;将原始的URL转换成需要样式 $route[n…

正向代理与反向代理:深入解析与实例讲解

代理服务器是一种网络实体&#xff0c;它充当客户端与服务器之间的中介&#xff0c;负责转发请求和响应。代理服务器可以根据其使用方式和功能的不同&#xff0c;分为正向代理和反向代理。 转转的面试中问到了正向代理和反向代理。所以本篇文章将详细解析这两种代理方式&#…

产品干货 | 如何通过Power Platform快速创建自定义连接器,让开发集成更简单

引言 Introduction&#xff1a; 最近&#xff0c;微软推出了许多新产品功能。迅易科技作为微软13年来紧密的生态合作伙伴&#xff0c;为300行业头部客户实施1000项目。为此&#xff0c;我们总结了多年的项目经验且产品学习心得&#xff0c;邀请了迅易技术专家为大家持续分享微软…

如何自己录制教学视频?零基础也能上手

随着在线教育的蓬勃发展&#xff0c;录制教学视频成为了教师和教育工作者们不可或缺的一项技能。无论是为了远程教学、课程分享还是知识普及&#xff0c;教学视频的录制都变得愈发重要。可是如何自己录制教学视频呢&#xff1f;本文将介绍两种录制教学视频的方法&#xff0c;这…

linux绝对路径与相对路径区别简述

绝对路径与相对路径定义 绝对路径&#xff1a;相对于根路径&#xff0c;只要文件不移动位置&#xff0c;那么它的绝对路径是永恒不变的 相对路径&#xff1a;相对于当前所在目录而言&#xff0c;当前所在的目录可能会改变&#xff0c;所以相对路径不是固定的 路径&#xff…

Availability

译文&#xff1a; #ifndef __AVAILABILITY__ #define __AVAILABILITY__ /* 这些宏都是用在头文件种。它们是作用于和系统版本有关的函数声明或者函数&#xff0c;如果它们是可用的就标示它们首次有效的方法&#xff1b;或者被抛弃的函数。 MAC OS 和_IOS_ 有不同的版本号&…

uniapp小程序button按钮去掉黑色线条

文章目录 导文去除方法 导文 在uniapp的button按钮中有一个莫名其妙的黑色线条 去除方法 button::after{border: none; }该问题并不是所有的手机机型都有&#xff0c;最好添加一下&#xff0c;以防用户手机端样式有问题。 您好&#xff0c;我是肥晨。 欢迎关注我获取前端学习…

Google浏览器快捷方式固定到任务栏启动被其他网页劫持

场景复现 1、Google浏览器设置启动时继续浏览上次打开的网页 2、先浏览CSDN网站&#xff0c;然后关闭Google浏览器 3、再次打开Google浏览器时&#xff0c;除了显示我们上次浏览的CSDN网页外&#xff0c;还默认打开了百度网页 解决办法 1、在Google浏览器中新建标签页&am…

hexo 实战:(三)独立博客运营总结

前言 通过前面两个步骤&#xff0c;完成了静态博客从搭建到基本功能添加和界面优化。那么&#xff0c;这次就要介绍一下搭在 GitHub 上的静态博客如何运营推广。也就是如何让网站被各大搜索引擎收录&#xff1f;如何提高网站权重&#xff0c;提高收录量&#xff1f; 网站收录 …

神经网络 #数据挖掘 #Python

神经网络是一种受生物神经元系统启发的人工计算模型&#xff0c;用于模仿人脑的学习和决策过程。它由大量互相连接的节点&#xff08;称为神经元&#xff09;组成&#xff0c;这些节点处理和传递信息。神经网络通常包含输入层、隐藏层&#xff08;可有多个&#xff09;和输出层…

2024版 空间杜宾模型和检验代码+结果解释

空间误差、空间滞后、空间杜宾模型&#xff0c;筛选过程 莫兰指数&#xff0c;LM检验&#xff0c;LR检验&#xff0c;WALD检验&#xff0c;代码&#xff0c;及解释用法 空间溢出直接效应间接效应等等空间计量全过程。 原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4…

旋转机械振动信号特征提取(Python)

前缀 &#xff1a;将一维机械振动信号构造为训练集和测试集&#xff08;Python&#xff09; https://mp.weixin.qq.com/s/DTKjBo6_WAQ7bUPZEdB1TA import pandas as pd import numpy as np import scipy.io as sio import statistics_hamming from statistics_hamming import…