【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)

news2025/1/10 17:20:15

一、Redis 发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

发送者可以向多个订阅者发送消息,订阅者可以收到多个发送者送来的消息,也就是是说发送者和订阅者是多对多的关系


实例

以下实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为 redisChat:

订阅者订阅主题

发布者发布主题

现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。

"redisChat"为主题名,"Redis is a great caching technique"为收到的消息

 注意,如果发布中文的话,直接是看不到的

 想要正确显示中文,再连接redis客户端的时候使用--raw参数,就可以了

 接收多个频道

 发布者发给redisChat的消息

  发布者发给mytest的消息

 订阅者收到了多个发布者发布的消息


二、Redis 事务

Redis 事务命令

下表列出了 redis 事务的相关命令:


 Multi、Exec、discard

从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的 命令队列中的命令依次执行。


实例 

sadd 集合的数据类型

smembers 查看集合型数据

 

 get key  查看kv值

smembers key 查看集合的数据


事务的错误处理

组队中某个命令出现了报告错误,执行时整个的所有队列都会被取消。

 组队阶段报错,提交失败


 如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。

 

 Redis Incr 命令将key中储存的数字值增一。

如果key不存在,那么key的值会先被初始化为0 ,然后再执行INCR 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在64 位(bit)有符号数字表示之内。


为什么要做成事务

不同的对象同时对一个账户进行操作,到底以哪一个提交为准,就会造成redis的事务冲突。


怎么解决事务的冲突

1、悲观锁

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的 时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。

传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上 锁。


2、乐观锁

乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁, 但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的 应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。

原来有10000块,版本为1.0,消费8000之后,版本号变成了1.1,此时进行操作只能在1.1版本之后进行操作。而想消费5000,是在10000元的1.0版本上操作,但此时版本号已经变成了1.1,版本号不匹配,故不能操作。

乐观锁会匹配版本号,只要版本号一致才能进行操作。


Redis事务三特性

三、Redis主从复制

1、Redis主从复制原理

2、实战Redis主从复制

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主 服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机 制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的 可扩展性和数据冗余很有帮助。


搭建架构图


 准备三台服务器

192.168.198.142 为主服务器

192.168.198.150 为从服务器

192.168.198.151 为从服务器


准备工作略:注意防火墙 selinux iptables 时间同步等


搭建步骤

一、安装redis

首先给三台服务器分别安装redis。过程可参考前面章节


二、配置主服务器

1、进入主服务器,打开redis配置文件,修改protected yes为no,即关闭保护模式让其他主机也能连接

2、将bind 127.0.0.1这行注释或者指定ip。(本例是注释,即所有ip都能连接)

3、开启守护进程 daemonize yes

4、设置访问密码(由于redis性能非常高,撞库风险极大,建议线上把密码设置非常复杂,最好能在第2步中指定 ip)。

将appendonly yes 改为no,因为默认是rdb存储

至此主服务器配置完毕! 启动redis服务。


三、配置从服务器

1-4步与主服务器配置基本一致

5、配置所属主服务器ip和端口,声明它是142的从机

6、配置所属主服务器的密码

需要注意的是,从服务器通常是只读,所以要配置只读(默认是只读,不要更改即可) 配置完成, 启动服务

四、测试

使用redis客户端或者telnet都可以

本次使用redis客户端

1、进入主服务器(192.168.198.142) 进入redis客户端,由于设置了密码,所以需要鉴权

 设置一个值 

2、进入从服务器(192.168.198.150,192.168.198.151) 使用get命令获取name的值,可以看到

 如果从服务器可以查询到主服务器的数据代表配置成功  

如果在从服务器上写,则会报错,如下图 

至此,redis主从复制配置并验证完成 

四、总结:

1、Redis发布订阅

进入redis安装目录,使用./src/redis-server redis.conf开启redis服务

查看是否启动成功:使用 ps -ef |grep redis 命令过滤是否有6379端口,有则是开启成功

使用./src/redis-cli 命令连接redis客户端

因为我设置了密码,所以连接成功后先输入auth 123456验证,验证成功后进行后续操作

使用 subscribe redisChat 命令订阅redisChat频道,此时这个redis客户端就变成了“订阅者”

使用 publish redisChat “Master Linux in 21 days” 给redisChat频道发布消息为“Master Linux in 21 days”

使用subscribe mytest redisChat 可以同时订阅mytest,redisChat两个频道,这时订阅者可以收到来自这两个频道的消息


Redis发布订阅注意事项:

直接使用./src/redis-cli命令连接redis客户端不能直观看出中文消息,想要看出中文消息就在./src/redis-cli命令后面加--raw参数就可以

发布客户端可以向多个订阅客户端发送消息,订阅客户端可以订阅多个发布客户端,也就是说,发布客户端和订阅客户端是多对多的关系

2、Redis事务

① MULTI开启事务,自此,输入的命令进入命令队列;只要事务没有执行就可以通过discard退出事务;使用exec执行事务,一旦执行不能回滚;

② 使用MULTI开启事务后,一旦命令队列中有命令输错,则整个命令队列不会被执行;执行命令队列时,某个命令报错,只有该命令不会被执行,其他命令会继续执行

③ 为什么要有事务?防止事务冲突。

④ 如何解决事务冲突?加悲观锁或者乐观锁。悲观锁,顾名思义,再执行事务时,认为别人也会执行 ,就给他加上锁,这样其他事务就无法操作这个事务,只有等它释放锁,其他人才能操作。乐观锁,顾名思义,执行事务时认为其他人不会操作这个事务,不给它加锁,但是会匹配版本号,只有版本号匹配成功才能操作这个事务。

⑤ Redis事务特性:隔离性,没有隔离级别,不保证原子性

3、Redis主从复制

① Redis主从复制原理:从服务器启动并成功连接到主服务器时会向主服务器发送一条sync命令,主服务器收到该命令后,启动后台的存盘进程,将收集到的修改数据集命令在后台执行,执行完成之后,将整个rdb文件传送到从服务器,自此完成了一次完全同步。只要从服务连接到主服务器,就会完成一次完全同步。

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

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

相关文章

MATLAB中资源管理器无法安装资源解决方法详细教程

摘要:介绍使用MATLAB获取附加功能时出现“续订软件维护服务”的界面问题解决方案,即使用预先从官网下载的安装包文件,直接运行离线安装文件后会自动弹出附加功能管理界面,这时可以安装该附加工具,详细过程见以下介绍。…

ProtoBuf原理

一、文章 https://zhuanlan.zhihu.com/p/404782892 二、测试 1.test.proto syntax "proto3";package proto; option go_package "./;proto";message Msg{uint32 age1 1;sint32 age2 2;string name 3;bytes data 4; }2.main.go package mainimpor…

【滤波】多元卡尔曼滤波器

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第6章节06-Multivariate-Kalman-Filters(多元卡尔曼滤波器)。 %matplotlib inline#format the book import book_format book_format.set_style()简介 我们现在准备研究和实现完整的、多…

财报解读:Q2业绩指引未达预期,狂奔的爱彼迎要减速了?

全球民宿龙头爱彼迎Airbnb迎来了一个强劲的开端。 美东时间5月9日盘后,爱彼迎发布了2023年第一季度财报。财报显示,爱彼迎一季度营收、净利润、总预订金额都获得了不同程度增长,超出市场预期。美中不足的是,公司预计二季度营收下…

分组卷积和深度可分离卷积

文章目录 一、常规卷积操作二、分组卷积三、深度可分离卷积 一、常规卷积操作 在图中,输入的特征图大小为 H * W * 4 卷积核个数为 2 个,每个卷积核的大小为 K * K * 4 输出的特征图大小为 H’ * W’ * 2 二、分组卷积 !!&#…

Java 内存模型

JVM 内部使用的 Java 内存模型, 在逻辑上将内存划分为 线程栈(thread stacks)和堆内存 (heap)两个部分。 如下图所示: JVM 中,每个正在运行的线程,都有自己的线程栈。 线程栈包含了当…

多表查询~

文章目录 多表查询内连接外连接子查询单行单列多行单列多行多列 多表查询 笛卡尔积:有A,B两个集合 取A,B所有的组合情况 内连接 要想查询某一章表的某个字段,可用 表名.字段名表示 也可以给表起别名 隐式内连接INNER可省略 外连接 外连接分左外连接和右外连接 子查…

堆排序创建

堆排序创建 一、介绍1、什么是堆2、大项堆(排序前)3、小项堆(排序前)4、排序思想 二、大项堆排序案例1、流程2、讲解 三、总结 一、介绍 1、什么是堆 堆是一种叫做完全二叉树的数据结构,可以分为大项堆,小…

计算机知识 小tips

目录 什么是R语言? 电脑长期不关机会产生什么影响? nlp是什么? cv是什么? 什么是R语言? R语言是一种用于数据分析和统计建模的编程语言和环境。它由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman于1995年开发而…

【C语言督学训练营 第十三天】栈与循环队列的顺序实现与链式实现

文章目录 前言栈--思想栈--代码实战队列--思想队列--代码实战真题实战! 前言 栈与队列是数据结构中最常见的数据结构之一,因其特性往往可以将问题简单化,在使用栈与队列时要牢记:栈:先进后出,队列&#xf…

逆向练习及相关总结

文章目录 crakeme练习crackme1crackme2crackme3 解题步骤总结关键代码查找方法常见代码C类对象逆向分析C虚函数逆向分析 crakeme练习 crackme1 学到的知识点: main函数查找方法:运行到EntryPoint -> 第一个call(一般在第三行&#xff09…

如何用u盘重装系统win7

​如今的U盘重装win7系统是比较常见的重装win7系统的方法,适用性比较高,操作也十分的简单。有的小伙伴想给自己的电脑重装win7,那么我们用u盘重装系统怎么安装win7?现在小编就来教大家如何用u盘重装系统教程。 工具/原料: 系统…

CTR预估之FMs系列模型:FM/FFM/FwFM/FEFM

前言 ctr预估(点击率,click-through rate, CTR),指一个user在某个特定的场景下会点击一个item的概率估计,这里的item可以是广告、商品等,是推荐和广告系统中十分重要的模块。另外,这里的user-i…

《程序员面试金典(第6版)》面试题 16.18. 模式匹配(暴力破解 + 剪枝)

题目描述 你有两个字符串,即pattern和value。 pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式。 例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a&q…

Redis基础复习

1 Redis基础概述 Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库 1.1 参考网站: 官网 中文文档 1.2 安装 linux安装Redis7 1.3 Re…

全新上线!能源行业大型的S/4升级项目——E.ON(意昂)第五次迁移成功完成

意昂集团是一家德国能源集团的控股公司,总部位于埃森。该公司主要活跃在能源网络、能源服务、可再生能源以及德国核电站的运营和退役领域。 意昂于2019年启动了全公司范围内的S/4联合项目,这是SAP大型S/4项目之一,也是能源行业的大型S/4项目。…

linux下mysql如何修改密码,包括本地密码和远程密码。navicat远程登录

当服务器部署mysql,navicat远程访问,修改密码时需要修改两次 1、修改本地登录密码 mysql > SET PASSWORD PASSWORD(123456); mysql > FLUSH PRIVILEGES;重启mysql服务 service mysql restart上面命令如果报错,则采取以下方法: [ro…

SpringBoot基础篇2(整合第三方技术)

一、SpringBoot整合Junit 直接配置的module,默认就可以测试。 SpringBoot整合第三方技术: 1.pom.xml中引入对应的starter(有勾选的勾选,没有勾选的选项手动导入。在这里查 查依赖的网站) 2.配置相关信息 二、SpringB…

vue diff算法与虚拟dom知识整理(6) 感受diff算法 (不要神话虚拟dom更不要做完美主义)

我们还是打开之前的案例 然后 将src下的index.js代码修改如下 import {init,classModule,propsModule,styleModule,eventListenersModule,h,} from "snabbdom";//创建patch函数const patch init([classModule,propsModule,styleModule,eventListenersModule]);//创…

tcp 三次握手和四次挥手报文分析

1,tcp 三次握手 报文抓取如下: 三段报文分析: 第一次:26->96报文交互 Seq-num 567391014, ACK_NUM 0; flags SYN 第二次:96->26报文交互 Seq-num 416352681, ACK_NUM Seq-num 1 567391014 1 567391015,…