Redis主从复制原理
Redis的主从复制总共分为6个步骤
- 在从节点上执行slaveof命令,这条命令会把主节点IP和端口号保存下来,然后这条命令就返回了
- Redis内部是通过每秒执行的定时任务来维护复制逻辑的,当定时任务发现有新的主节点加入的时候,它会尝试与该节点进行网络连接
- 连接成功后,从节点会向主节点发送PING请求进行首次通讯,如果从节点没有收到主节点的PONG回复或者超时,从节点就会断开于主节点的连接,以期待下次执行定时任务的时候 重连 所以PING命令的作用是确保主从之间的网络通讯可用,同时确保主节点此时能够接收复制命令
- 权限认证,从节点会把权限信息发送给主节点进行权限认证
- 同步数据,对首次建立的连接,主节点会把持有的所有数据全部发送给从节点,这一步是所有步骤中耗时最多的
- 后续的复制,接下来主节点会把写命令持续不断地发送给从节点,确保主从之间的数据一致性
Redis有哪些数据结构
Redis中共有5种数据结构,分别是字符串、哈希、列表、集合、有序集合
ZSET有序集合是怎么实现的
Redsi中的有序集合,在数据量比较小的时候,是使用ziplist实现的,在数据量大的时候,是使用skiplist+hashtable实现的 因为ziplist是将数据头和数据紧挨在一起,当需要从中间插入元素的时候,就需要挪动后面的所有元素,比较耗时,在数据量不大的时候还可以
为什么会选择skiplist
Redis选择Skiplist来实现有序集合的原因主要有2点
第一,是因为实现简单 skiplist和各种平衡树中元素都是有序排列的,在做范围查找的时候,平衡树先找到指定范围的小值,然后以中序遍历的方式继续寻找不大于大值的节点,如果不对平衡树做一些改造的化,中序遍历并不容易实现。而skiplist在找到指定范围的小值之后,只需在第一层链表上向后顺序查找即可,实现简单
平衡树的插入和删除动作有时会破坏平衡,需要做一些额外的工作来保持平衡,逻辑复杂,而skiplist只需要修改相邻节点的指针,实现简单
第二,内存占用更少 REDIS作为内存数据库,对内存是比较敏感的,平衡树平均每个节点需要包含2个指针,而skiplist在redis中的实现平均每个节点包含1.33个指针,内存占用更少