什么是redis事务
学习数据库时对事务的定义如下:一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位
redis对事务的定义:一次性执行多个命令本质上是一组命令的集合,所有命令都会被序列化放入到一个队列中,按顺序串行化执行不会被其他命令打断
redis事务常用命令
MULTI 开启事务 它会将后续的命令加入到事务队列中,但并不会立即执行
EXEC 命令用于执行事务队列中的所有命令,如果有语句是语法错误无法通过编译则所有命令都不会执行 如果有语句通过了编译但是逻辑不正确则这条语句无法正常执行别的语句任然正常执行
DISCARD 命令用于取消一个事务,它会清空事务队列中的所有命令
WATCH 用于监视一个或多个key 如果这事务中被监视的key如果被修改那么被监视的key所执行的操作将无效别的正常 WATCH只在一次事务中有效 先开启监视在开启事务
什么是管道
是一种批量执行命令的机制,在一次请求中可以发送多个命令,在一次响应中可以接受多个命令的响应,可以优化频繁的命令往返造成的性能瓶颈
怎么使用管道
将执行的命令放在一个txt文档中 命令如下
cat temp.txt | redis-cli -a xxxxxx --pipe
事务和管道的区别
Redis事务和管道都是Redis提供的优化性能的机制,但它们的实现方式和使用场景有所不同。Redis事务主要用于保证一组命令的原子性和数据一致性,而Redis管道主要用于减少网络延迟和提高吞吐量 使用事务时其他的命令会阻塞 使用管道时其他的命令不会阻塞
使用管道不适宜一次执行太多的命令会造成客户端阻塞
什么是复制
Redis主从复制是指将一个Redis服务器的数据复制到另一个Redis服务器的过程 主服务器负责写从服务器负责读
配置文件
配从不配主 在从服务器做以下配置
replicaof <masterip> <masterport> #配置主服务器的ip和端口
masterauth <master-password> #配置主服务器的密码
常用命令
info replication 查看主从关系配置信息
slaveof 主库ip 主库端口号 从库更换主库
slaveof no one 从库变成主库
复制实现的两种方式
一主二仆
配置一个主机两个从机 主机宕机的话从机 会等待主机的启动
从机宕机或者从机的启动晚于主机那么从机 会自动把缺失的数据进行复制
这种配置会增加主机的压力 所以薪火相传可以有效的减轻主机的压力
薪火相传
在两台从机中选择其中的一台为另一台的主机如下图
说明:2号虽然是3号的主机但是2号仍然只有读的功能
在3号服务器输入 slaveof 2号的ip 2号的端口号 命令便可以实现薪火相传
复制的缺点
如果主服务器宕机那么就无法提供写的服务哨兵的出现便解决了这一问题
什么是哨兵
它是一个独立的进程,用于监视Redis主节点和从节点的状态,并在主节点宕机时自动将从节点选出新的主节点
哨兵的配置文件
bind 0.0.0.0
daemonize yes
protected-mode no
port 26379
logfile "/myredis/sentinel26379.log"
pidfile "/var/run/redis-sentinel26379.pid"
dir "/myredis"
sentinel monitor mymaster 监控主机ip 监控主机端口号 客观下线票数
sentinel auth-pass mymaster 主机密码
哨兵的默认端口号为26379
通常我们会配置一个哨兵集群用于监控节点
哨兵的工作流程和哨兵之间的通信
1,哨兵会向监控的主机发送ping命令如果主节点在30秒内没有恢复哨兵便认为这个主节点宕机了这一过程我们成为主观下线
2,当主观线下的个数达到我们配置文件的个数时便认为这个主机确实宕机了此时便通过raft算法选举出领导者哨兵用于完成选举新主机的任务
新主节点的选举策略:
(1)根据从节点优先级 优先级越小成为主节点的可能性越大默认优先级为100 在redis配置文件中可以看到优先级 设置为0就永远不会成为主节点
# The replica priority is an integer number published by Redis in the INFO
# output. It is used by Redis Sentinel in order to select a replica to promote
# into a master if the master is no longer working correctly.
#
# A replica with a low priority number is considered better for promotion, so
# for instance if there are three replicas with priority 10, 100, 25 Sentinel
# will pick the one with priority 10, that is the lowest.
#
# However a special priority of 0 marks the replica as not able to perform the
# role of master, so a replica with priority of 0 will never be selected by
# Redis Sentinel for promotion.
#
# By default the priority is 100.
replica-priority 100
(2)复制偏移量最大的从从节点(复制偏移量是指从节点已经复制的主节点的数据量,也就是从节点和主节点之间的同步进度。因此,复制偏移量最大的从节点是最新的从节点,它的数据最新,可以保证数据的一致性。)
(3)根据从节点的id越小可能性越大
领导者哨兵选举出主节点后会在哨兵中进行投票如果超过半数同意那么选举同过 否则进行重新选举
3,主节点选举通过会在领导者哨兵的帮助下成为主节点并且之前的从节点也会成为主节点的从节点 之前的主节点启动后也会成为新主节点的从节点
哨兵之间的通信
哨兵之间的通信是通过Redis的发布订阅机制实现的。当一个哨兵发现主节点失效时,它会向Redis服务器发送一个PUBLISH消息,消息的内容是一个JSON格式的字符串,包含了当前哨兵所知道的关于主节点失效的信息。其他哨兵会订阅这个频道,当它们收到这个消息时,会根据消息中的信息进行选举,选出一个新的主节点。
哨兵虽然解决了主节点宕机没有主节点的问题但是主节点的选举是需要时间的这种方案并不完美但是集群就很好的解决了这个问题