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,一经查实,立即删除!

相关文章

产品经理基础入门

一、产品基础&#xff08;需求收集、需求管理、需求分析、结构图、流程图、原型、PRD文档、用户画像、后台的角色管理&#xff09; 产品经理定义&#xff1a; 1.市场分析&#xff1a;找准市场方向&#xff0c;确定哪个市场是值得进入的。 2.用户分析&#xff1a;针对目标市场…

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# 添加加密模块所在的路…

爬虫笔记16——异步爬取二手汽车数据去重存入MySQL

需要用到的库 #异步数据库 pip install aiomysql #reids数据库进行去重 pip install redis #用hashlib进行md5加密 pip install hashlib #基于异步IO的网络请求库 pip install aiohttp #xpath获取静态页面数据 pip install lxml目标网站 目标网站&#xff1a;https://www.che…

高考专业组 07组 08组 武汉大学

武汉大学的招生都什么废物点心&#xff0c;搜个专业组都没官方解释&#xff01; 07组&#xff1a;理学&#xff0c;详见下表专业代码07xxxx&#xff0c;例如数学、物理、化学 08组&#xff1a;工学&#xff0c;详见下表专业代码08xxxx&#xff0c;例如机械、电子信息、自动化、…

每天一个数据分析题(三百七十八)- 系统聚类

在系统聚类方法中&#xff0c;哪种系统聚类是直接利用了组内的离差平方和&#xff1f; A. 最长距离法 B. 重心法 C. Ward法 D. 类平均法 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Python&#…

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 的核心功能包括多…

Spcok测试代码抛异常场景

测试代码抛异常场景 ‍ class ExceptionSpec extends Specification {def validateService new ValidateService()Unrolldef "验证UserInfo"() {when: "调用校验方法"validateService.validateUser(user)then: "捕获异常并设置需要验证的异常值&qu…

注意力机制的原理

注意力机制的原理 注意力机制是深度学习中的一种关键组件&#xff0c;尤其是在处理序列数据&#xff0c;如自然语言处理任务时&#xff0c;它允许模型关注输入序列的不同部分&#xff0c;而不是对所有元素赋予相同的权重。其基本思想是为每个输入位置赋予一个权重&#xff0c;…

分类预测 | 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;这样就…

Vue3 + TS 防抖动

目录 一、防抖动 1、概念 2、原理 3、应用场景 1、概念 通过将多次连续触发的函数调用合并成一次来减少函数的执行次数。防抖的核心思想是在某个时间段内&#xff0c;只执行一次函数&#xff0c;而忽略在此时间段内的其他触发。 2、原理 (1)、定时器&#xff1b; (2)、重…

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

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

把STL容器放入共享内存,重用STL allocator,传入模板参数Allocator,可以实现

问题 Q: 如何用共享内存来存放C STL中中的容器&#xff1f; A: 传入自定义的申请共享内存上空间的allocator&#xff0c;见模板参数Allocator 参考 https://www.zhihu.com/question/319108981/answer/649050789 https://en.cppreference.com/w/cpp/container/vector http://…

自定义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…

QtSingleApplication

​​​​​​/qtsingleapplication/ qtSingleApplication使用总结-CSDN博客 示例&#xff1a; #include "mainwindow.h" #include <QApplication> #include <QMessageBox> #include "qtsingleapplication/qtsingleapplication.h" int main(…

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

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

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

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