登 录
注 册
< 数 据 库
MySQL
ClickHouse
ES
Doris
MongoDB
Redis
其他DB
Redis概述与安装
Redis持久化
Redis事务与主备
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
当前位置:
首页
>>
Redis
>>
Redis事务与主备
Redis事务与主备
2023-09-03 21:57:13 星期日 发表于北京 阅读:537
![](/static/images/article_images/1693748885.2341068.jpeg) #### Redis事务是什么? 可以一次执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会有序列化,按顺序地串行执行而不会被其他命令插入,不许加塞。 `Redis对事务的支持其实是部分支持(不保证原子性)` 如果一个事务中的命令在每个命令敲完后就报错(语法错误等),则这个事务中的其他命令不会被执行——支持事务 如果一个事务中的所有命令在exec运行时才报错,那么只有报错的命令执行不成功,其他命令会执行成功——不支持事务 #### Redis事务常用的5大命令 1、取消事务——discard 2、执行所有事务块的命令——exec 3、标记一个事务块的开始——multi 4、监视一个或多个key——watch 5、watch指令,类似于乐观锁,事务提交时,如果key的值已经被别的客户端改变,比如某个list已经被别的客户端push/pop过了,则整个事务队列都不会被执行。 取消watch命令对所有key的监视——unwatch 实例 ```bash # 开启事务 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set k2 v1 QUEUED 127.0.0.1:6379> set k3 v3 QUEUED 127.0.0.1:6379> set k4 v4 QUEUED 127.0.0.1:6379> set k5 v5 QUEUED # 执行事务 127.0.0.1:6379> EXEC 1) OK 2) OK 3) OK 4) OK ``` #### 乐观锁与悲观锁 有点类似MySQL的表锁(悲观锁)和行锁(乐观锁)。在实际生产中环境中大多使用乐观锁——为了提高程序的并发性。 #### 事务的三个阶段 `开启`:以multi命令开启一个事务 `入队`:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面 `执行`:由exec命令触发执行事务队列里的所有命令 #### Redis的发布订阅 其实是进程间的一种消息通信模式:发送者发送消息,订阅者接收消息,但是公司中一般不会用作消息发布订阅系统,Redis主要还是用来做缓存。 #### Redis主从复制 概念:主机数据更新后,根据配置和策略,自动同步到备机的master/slaver机制,master以写为主,slave以读为主。 用途:读写分离、容灾恢复 ##### 主从配置 1、配从不配主(主库不需要配置) 2、从库配置slaveof 主库IP 主库端口:每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件 示例: 假设现在有三台Redis服务器:A、B、C,我们希望A当做主,B、C当做从。则在三台服务器都正常开启后,在B、C的Redis客户端上执行以下命令即可实现 这里假设ABC三台机器的IP分别是 >192.168.1.101 192.168.1.102 192.168.1.103 ```bash # 机器B上执行命令 192.168.1.102:6379> SLAVEOF 192.168.1.101 6379 # 机器C上执行命令 192.168.1.103:6379> SLAVEOF 192.168.1.101 6379 ``` 执行成功后,可通过如下命令查看三台机器的角色是master还是slave ```bash 192.168.1.102:6379> info replication # Replication role:slave connected_slaves:0 master_replid:00e17a8949bb43440f147b7d3e9b9e04d9edbc33 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 ``` 所以,主从配置的整个过程不需要主的参与 **`需要注意的点`** 1、配置主从复制之前,如果A已经有数据,则配置主从复制后,B和C也会将A以前的数据拉过来 2、配置主从复制后,突然B、C中的一台或者2台挂了,则再重启时,需要再次执行上面的slaveof命令,去关联A,否则他重启后会把自己当做一台独立的Redis服务器,不产生主从关系 3、配置主从复制后,A挂了,那么B和C不会上位为master,它会与A断开连接,直到A再次恢复正常 4、配置主从复制后,如果B、C尝试写入数据会报错,因为slave角色只允许读 #### 主备切换 在上面的列子中,如果A挂了,B和C会进入阻塞状态,等待A的重新启动。如果不想等待,从B和C中选出一台来当master,这里假设把B当做master,则只需在B服务器上执行如下命令即可 `192.168.1.102:6379> SLAVEOF no noe ` 表示:是当前数据库停止与其他数据库的同步,转换为主数据库 同时,B成为主之后,想把C设置为从,则只需在C服务器上执行如下命令:也就是将跟随的master由A切换为B `192.168.1.103:6379> SLAVEOF 192.168.1.102 6379` 如果B和C完成以上切换后,A恢复了,那么A会作为一台单独的Redis服务器存在,以B和C没有任何关系了。 #### 哨兵模式 哨兵模式能够后台监控主机(master)是否故障,如果故障了根据投票数自动将从库转为主库。 ##### 配置方式 在Redis的配置文件目录下创建哨兵文件:sentinel.conf 增加下内容 `sentinel monitor host101 192.168.1.101 6379 1 ` 解释: >sentinel monitor为固定写法 host101表示被监控的主机名称(可以自定义 ) 192.168.1.101表示被监控的Redis服务器IP 6379表示被监控的Redis端口 最后面的1表示主机挂掉以后slave投票看让谁接替成为主机,得票数多的会成为master ##### 启动哨兵 `bin/redis-sentinel sentinel.conf` 此时如果A挂了,会自动从B、C中选出一个来当master,并实现自动切换 如果切换完成后,A又起来了,那么A会以slave的身份加入B、C 拓展:一组sentinel能同时监控多个master(上面的配置文件可以加入多行) #### 主从复制的缺点 主要是复制延迟问题:如果并发量比较大,网络延迟比较严重,那么复制延迟时间更长。