《我想进大厂》之Redis夺命连环11问( 四 )


《我想进大厂》之Redis夺命连环11问文章插图
当客户端向节点发送命令 , 如果刚好找到slot属于当前节点 , 那么节点就执行命令 , 反之 , 则会返回一个MOVED命令到客户端指引客户端转向正确的节点 。 (MOVED过程是自动的)
《我想进大厂》之Redis夺命连环11问文章插图
如果增加或者移出节点 , 对于slot的重新分配也是非常方便的 , redis提供了工具帮助实现slot的迁移 , 整个过程是完全在线的 , 不需要停止服务 。
故障转移【《我想进大厂》之Redis夺命连环11问】如果节点A向节点B发送ping消息 , 节点B没有在规定的时间内响应pong , 那么节点A会标记节点B为pfail疑似下线状态 , 同时把B的状态通过消息的形式发送给其他节点 , 如果超过半数以上的节点都标记B为pfail状态 , B就会被标记为fail下线状态 , 此时将会发生故障转移 , 优先从复制数据较多的从节点选择一个成为主节点 , 并且接管下线节点的slot , 整个过程和哨兵非常类似 , 都是基于Raft协议做选举 。
了解Redis事务机制吗?redis通过MULTI、EXEC、WATCH等命令来实现事务机制 , 事务执行过程将一系列多个命令按照顺序一次性执行 , 并且在执行期间 , 事务不会被中断 , 也不会去执行客户端的其他请求 , 直到所有命令执行完毕 。 事务的执行过程如下:

  1. 服务端收到客户端请求 , 事务以MULTI开始
  2. 如果客户端正处于事务状态 , 则会把事务放入队列同时返回给客户端QUEUED , 反之则直接执行这个命令
  3. 当收到客户端EXEC命令时 , WATCH命令监视整个事务中的key是否有被修改 , 如果有则返回空回复到客户端表示失败 , 否则redis会遍历整个事务队列 , 执行队列中保存的所有命令 , 最后返回结果给客户端
WATCH的机制本身是一个CAS的机制 , 被监视的key会被保存到一个链表中 , 如果某个key被修改 , 那么REDIS_DIRTY_CAS标志将会被打开 , 这时服务器会拒绝执行事务 。
- END -