Redis事务

80 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

Redis事务

Redis事务和Mysql事务有所不同,它不保证原子性,没有隔离级别的概念。Redis事务的本质是一组命令的集合,支持一次执行多个命令,并且所有命令都会被序列化。在事务执行过程中,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插到事务执行命令的序列中。

  • 一次性、顺序行、排他性就是redis事务的特点。
  • Redis事务不保证原子性,事务没有回滚。
  • Redis事务的三个阶段:开始事务、命令入队、执行事务。

事务相关命令

watch key1 key2 ... #监视一或多个key,如果在事务执行之前,被监视的key被其他命令改动,则
事务被打断 ( 类似乐观锁 )
multi # 标记一个事务块的开始( queued )
exec # 执行所有事务块的命令 ( 一旦执行exec后,之前加的监控锁都会被取消掉 )
discard # 取消事务,放弃事务块中的所有命令
unwatch # 取消watch对所有key的监控

测试如下图:

  • 若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行。
  • 若在事务队列中存在语法性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确命令会被执行,错误命令抛出异常。

image.png

  • 中间插入discard命令就可以取消事务。

注意:一旦执行 EXEC 开启事务的执行后,无论事务是否执行成功, WARCH 对变量的监控都将被取消。故当事务执行失败后,需重新执行WATCH命令对变量进行监控,并开启新的事务进行操作。

Redis主从复制

  • 在Redis主从复制中,主机做写的工作,从机做读的工作(从机不能写)。

环境搭建步骤:

1、拷贝多个redis.conf 文件,拷贝命令如:cp redis.conf redis6379.conf

2、指定端口 6379,依次类推

3、开启daemonize yes

4、Pid文件名字 pidfile /var/run/redis_6379.pid , 依次类推

5、Log文件名字 logfile "6379.log" , 依次类推

6、Dump.rdb 名字 dbfilename dump6379.rdb , 依次类推

根据上述步骤配置完成后,使用ps -ef|rep redis命令来查询一下进程情况。

image.png

模拟Redis主从的话至少需要三个进程,一主二从,对于主节点不需要做设置,从节点执行slave 主节点host 主机点端口号命令即可,然后通过info replication来查看节点信息。

注:一主二从的情况下,如果主机断了,从机可以使用命令 SLAVEOF NO ONE 将自己改为主机!但它是手动的!

针对于简单的主从复制有链路型的和一对多的。

Redis哨兵

Redis在做主从复制的时候,当主机宕机后,需要手动把一台从机切换为主机(slaveof no one),需要人工干预,非常不方便。为此,Redis提供了Sentinel哨兵来解决这个问题。

假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover[故障转移]操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。

哨兵能自动检测主机是否故障(如频繁发指令询问主机),主机故障宕机,哨兵会去投票来决定将哪个从机设置为主机。B站上有一个趣话redis的视频,很短很干很形象,推荐给大家:趣话redis