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.rhkb.cn/news/359355.html

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

相关文章

Javascript中的this关键字指向

this关键字介绍 不同情况下的this 1.对象调用方法中的this 2.在全局使用this(单独使用) 3.函数中的this 4.函数严格模式下 5.事件中的this 6.构造函数中的this 7.箭头函数没有this call()、apply()、bind() 的用法 this关键字介绍 面向对象语言中 this 表示当前对象…

Java项目:基于SSM框架实现的电子竞技管理平台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的电子竞技管理平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

【C++庖丁解牛】函数栈帧的创建与销毁

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. 寄存器2. ebp和esp是如…

记一次服务器崩溃事件

今天在安装Jenkins的时候&#xff0c;进行到插件安装这一步&#xff0c;本来一切顺利&#xff0c;结果最后安装完成之后一直进不去网页&#xff0c;显示连接超时&#xff0c;网上搜索了一圈也没发现什么相似的情况&#xff0c;当我疑惑的时候回到Linux控制台&#xff0c;发现命…

天气冷电脑不能启动找不到硬盘

https://diy.zol.com.cn/2004/0611/101994.shtml

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

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

计算机网络 —— 应用层(电子邮件)

计算机网络 —— 应用层&#xff08;电子邮件&#xff09; 电子邮件发送电子邮件的过程SMTP特性工作流程 电子邮件格式MIME关键组件工作方式 POP/IMAPPOP&#xff08;邮局协议&#xff09;IMAP&#xff08;因特网邮件访问协议&#xff09; 基于万维网的电子邮箱特点优势常见的基…

Kafka精要

Apach Kafka 是一款分布式流处理框架&#xff0c;用于实时构建流处理应用。它有一个核心 的功能广为人知&#xff0c;即 作为企业级的消息引擎被广泛使用 kafka设计 Kafka 将消息以 topic 为单位进行归纳 将向 Kafka topic 发布消息的程序成为 producers. 将预订 topics 并消…

RK3568平台(音频篇)音频ALSA框架

一.ALSA框架简介 ALSA表示先进linux声音架构&#xff08;Advanced Linux Sound Archiecture&#xff09;&#xff0c;它由一系列的内核驱动、应用程序编程接口&#xff08;API&#xff09;以及支持linux下声音的应用程序组成、 ALSA项目发起的原有是linux下的声卡驱动&#x…

神经网络 #数据挖掘 #Python

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

C语言入门课程学习笔记10:结构体联合体位域

C语言入门课程学习笔记10 第48课 - 自定义数据类型&#xff08;上&#xff09;实验-typedef实验小结 第49课 - 自定义数据类型&#xff08;中&#xff09;实验实验小结 第50课 - 自定义数据类型&#xff08;下&#xff09;实验实验小结 第51课 - 多文件程序设计实验实验实验小结…

XSS跨站攻击漏洞

XSS跨站攻击漏洞 一 概述 1 XSS概述 xss全称为&#xff1a;Cross Site Scripting&#xff0c;指跨站攻击脚本&#xff0c;XSS漏洞发生在前端&#xff0c;攻击的是浏览器的解析引擎&#xff0c;XSS就是让攻击者的JavaScript代码在受害者的浏览器上执行。 XSS攻击者的目的就是…

【云手机】数据安全如何保障?

安全办公&#xff0c;信息安全&#xff0c;这是企业使用云手机的初衷和目的&#xff0c;云手机在数据保密&#xff0c;远程办公等功能上有巨大的优势&#xff0c;也为企业提供了支持 首先就是云手机能够实现数据的集中管理和加密存储。所有办公相关的数据都存储在云端的安全服务…

SX1308 是一款超小封装高效率、直流升压稳压电路。兼容SDB628

一般说明 SX1308是一款恒频6针SOT23电流模式升压变换器&#xff0c;适用于小型、低功耗应用。SX1308开关的频率为1.2MHz&#xff0c;允许使用尺寸小、成本低的电容和2毫米或更小的电感。内部软启动可减少突发电流并延长电池寿命。 该SX1308功能自动切换到轻载脉冲…

HTTP/3 协议学习

前一篇&#xff1a; HTTP/2 协议学习-CSDN博客 HTTP/3 协议介绍 HTTP/3 是互联网上用于传输超文本的协议 HTTP 的第三个主要版本。它是 HTTP/2 的后继者&#xff0c;旨在进一步提高网络性能和安全性。HTTP/3 与前两个版本的主要区别在于它使用了一个完全不同的底层传输协议—…

全行业通用商城小程序源码

一站式购物新体验 一、引言&#xff1a;开启数字化购物新时代 在数字化快速发展的今天&#xff0c;小程序成为了商家们连接消费者的重要桥梁。特别是“全行业通用商城小程序”&#xff0c;以其便捷的购物体验和多样化的功能&#xff0c;成为了越来越多商家和消费者的首选。本…

斯坦福大学 AI 研究部门推出的“7 周人工智能学习计划”

①AI Python 基础&#xff0c;包括计算机原理、语法、判断语句等&#xff1b; ②AI Python 进阶&#xff0c;涉及 Linux 命令、多任务编程等&#xff1b; ③机器学习&#xff0c;涵盖算法、数据结构等&#xff1b; ④计算机视觉与图像处理&#xff0c;包含图像分类、目标检测…

华为海思CPU解读

安全可靠CPU测评结果&#xff08;华为海思篇&#xff09; 中国信息安全测评中心于2024年5月20日发布安全可靠测评结果公告&#xff08;2024年第1号&#xff09;&#xff0c;公布依据《安全可靠测评工作指南&#xff08;试行&#xff09;》的测评结果&#xff0c;自发布起有效期…

js实现拖拽排序

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>拖拽排序</title><style>* {margin: 0;p…

秋招突击——6/17——复习{整理昨天的面试资料}——新作{删除链表倒数第n个节点}

文章目录 引言复习新作删除链表倒数第N个节点题目描述个人实现参考实现 总结 引言 主管面&#xff0c;面的很凄惨&#xff0c;不过无所谓了&#xff0c;我已经尽力了。上午都在整理的面经&#xff0c;没有复习算法&#xff0c;而且这两天要弄一下论文&#xff0c;二十号就要提…