事务操作
使用MULTI命令开启事务,redis会将之后的命令存放到队列中,直到执行exec命令,提交事务。然后redis会执行队列中的所有命令,并依次返回结果。
开启事务前,受用watch命令监视指定的key,如果key的值被其它redis客户端改变,则exec失败。
Watch原理(下面这段摘自这篇文章):
被监控的key是在一个watched_keys字典中维护的,每多一个客户端监控,就会在key后面增加一链。例如下图key3这个key被client3、client4、client6三个客户端watch中。
对这些key执行修改命令时,会将该建挂载的client链上所有客户端上REDIS_DIRTY_CAS选项打开,而客户端再执行事务的exec命令时会先判断自己的REDIS_DIRTY_CAS是否被打开,如果被打开那么事务执行失败。
由于REDIS_DIRTY_CAS这个状态位是属于客户端的而不是属于客户端上某一个key的,所以事务执行结果只能单纯的返回成功失败,而不能返回具体是哪个key引起的失败。
事务结束时,无论成功失败,所有watched_keys中该client的链环都将被清楚。
订阅发布
publish n1 “hello”,向频道 n1发布一条消息 hello
subscribe n1 订阅频道n1
主从复制原理
Redis主从复制可以根据是否是全量分为全量同步和增量同步。
全量同步
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
- 从服务器连接主服务器,发送SYNC命令;
- 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
- 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
- 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
- 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
- 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
增量同步
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
主从关系建立时,会执行一次全量同步,之后默认执行增量同步。
如果主从关系断裂,再次建立联系时,从机会根据同步日志中的标志是否在主机的同步日志中来判断是否需要执行全量同步。