Redis学习笔记第三天

在这里插入图片描述

Redis事务

基本概念

  Redis事务的本质上就是一组命令的集合。事务支持一次执行多个命令,一个事务中的所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
  总结说,Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。

Redis中没有隔离级别的概念

批量操作在发送EXEC命令前被放入队列缓存,并不会被实际执行。

Redis的事务不保证原子性,在Redis可以保证单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会依然执行。

Redis事务相关命令

  • discard 取消事务,放弃执行事务快内的所有命令
  • exec 执行所有事务块内的命令
  • multi 标记一个事务块的开始
  • unwatch 取消watch命令对所有key的监视
  • watch key [key....] 监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断。

正常执行案例

在这里插入图片描述

可以看出,当我们开启了事务之后,只是将我们键入的命令添加到待执行队列并未实际的去执行。当我们键入exec命令之后,在队列中的所有命令全部执行,并返回所执行后的返回值。

放弃事务案例

在这里插入图片描述

当我们开启事务之后,添加了相关命令到待执行队列,如果最后键入的命令是discard那么此时是放弃事务,该事务中的所有命令都不会被执行,此时库中的数据与执行事务前的数据一致。

事务中存在语法错误

上面演示了命令都是正确情况下的例子,在这一小节我们来看一下,如果当一个事务中,有些命令是存在语法错误的。这种情况下,如果我们选择执行事务,会出现什么情况。

在这里插入图片描述

我们可以看到当一个事务中,如果某条命令有语法错误时,那么该事务中的所有的命令都不会被执行!!!

事务中命令出现运行时错误

上面演示了语法错误,导致一个事务中所有的命令都不会被执行。接下来,我们来看一下,当一个事务中某条命令执行错误,那么会咋样影响整个事务。

在这里插入图片描述

我们可以看出,当事务中某条命令没有语法错误在运行时发生错误时,仅仅是当前命令报错,而其他命令都不会受到影响!!!

watch

当启用了watch监视一个或一些key之后开启事务,键入一些相关命令,当执行事务时,会判断当前监视的key是否发生过写操作,如果发生过则此次事务全部不执行,没发生过则此次事务正常执行。

且亲测不存在ABA问题,所以其应该是通过判断版本号或时间戳之类的机制来实现CAS操作。

演示watch监视key之后,key没被写操作的事务执行情况。
在这里插入图片描述

演示watch监视key之后,key被其他客户端进行了写操作后的事务执行情况。

客户端1进行设置money的值,并进行监视,开启事务
在这里插入图片描述

客户端2对money的值进行了写操作,但是最终还原为原值。
在这里插入图片描述

接着客户端1继续执行。并键入一些命令,代表客户端1的逻辑处理
在这里插入图片描述

可以发现,事务执行失败了,全部命令都没有执行,因为有其他客户端对监视的键值进行了写操作。且从这个例子中可以看出,Redis的watch是解决了ABA问题的。

一旦事务执行后,无论事务是否执行成功,watch对键的监视都将取消。所以当事务失败之后,应该重新进行监视相关键,开启新的事务操作!

watch类似于乐观锁,基于比较并交换的基础概念。当发现监视中的键值没有被其他客户端进行修改时才可以执行成功,否则该事务执行失败。

Redis消息订阅

可以利用Redis做客户端之间的消息订阅: 发送者(pub)发送消息,订阅者(sub)接收消息。

Redis客户端可以订购任意数量的频道
这里抄了菜鸟教程的图片及文件。附原帖链接:
菜鸟教程-Redis发布订阅

在这里插入图片描述

我们可以看到,当有客户端订阅频道后,频道通过pub消息之后,由Redis服务进行消息的分发。

我们可以在Redis客户端键入subcribe channel 或者 键入 psubscribe pattern 前者为指定订阅名而后者为通配符,符合通配符的都将被订阅。 然后其他Redis客户端可以键入命令 publish channel message向订阅当前频道的客户端发送消息!

  • PSUBSCRIBE pattern [pattern …] 订阅一个或多个符合给定模式的频道。
  • PUBSUB subcommand [argument [argument …]] 查看订阅与发布系统状态。
  • PUBLISH channel message 将信息发送到指定的频道。
  • PUNSUBSCRIBE [pattern [pattern …]] 退订所有给定模式的频道。
  • SUBSCRIBE channel [channel …] 订阅给定的一个或多个频道的信息。
  • UNSUBSCRIBE [channel [channel …]] 只退订给定的频道。

Redis主从复制

基本概念

虽然Redis的读写速度都非常快,但是当并发量非常大的时候,单机服务就没有办法承载了。为了分担压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。

Redis主从的结构
在这里插入图片描述

全量同步

Redis全量复制一般发生在Slave初始化阶段,这事Slave需要将Master上的所有数据都复制一份。具体步骤如下:

  • 从服务器连接到主服务器,发送SYNC命令
  • 主服务器接收到SYNC命令后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令
  • 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续纪录被执行的写命令
  • 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照
  • 主服务器快照发送完毕后开始向服务器发送缓冲区的写命令
  • 从服务器完成对快照的载入,开始接受命令请求,并执行来自主服务器缓冲区的写命令。

从服务器初始化流程图
在这里插入图片描述
上面几个步骤就是从服务器数据初始化的所有过程,从服务器此时就可以接受来自用户的读请求。

增量同步

Redis的增量复制是指Slave初始化后开始正常工作时, 主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接受并执行收到的写命令。

同步策略

主从刚刚连接时,进行初始化即全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave在任何时候都可以发起全量同步。 redis的策略是,无论如何首先会尝试进行增量同步,如不成功则要求从机进行全量同步。

如果多个salve同时短线需要重启的时候,因为只要slave启动,就会发送sync请求和主机全量同步,当多个出现的时候,可能会导致master的IO剧增宕机

相关命令

slaveof ip port 将自身Redis服务器设为从服务器,指定主服务器的ip和端口

如果主服务器设置了远程访问且设置了密码,则需要更改从服务器的配置文件或者键入命令config set masterauth password来完成主从

-------------本文结束,感谢您的阅读!-------------