Redis知识整理

Posted by 大雁小鱼的博客 on November 9, 2019

Redis主从复制原理

Redis的主从复制总共分为6个步骤

  1. 在从节点上执行slaveof命令,这条命令会把主节点IP和端口号保存下来,然后这条命令就返回了
  2. Redis内部是通过每秒执行的定时任务来维护复制逻辑的,当定时任务发现有新的主节点加入的时候,它会尝试与该节点进行网络连接
  3. 连接成功后,从节点会向主节点发送PING请求进行首次通讯,如果从节点没有收到主节点的PONG回复或者超时,从节点就会断开于主节点的连接,以期待下次执行定时任务的时候 重连 所以PING命令的作用是确保主从之间的网络通讯可用,同时确保主节点此时能够接收复制命令
  4. 权限认证,从节点会把权限信息发送给主节点进行权限认证
  5. 同步数据,对首次建立的连接,主节点会把持有的所有数据全部发送给从节点,这一步是所有步骤中耗时最多的
  6. 后续的复制,接下来主节点会把写命令持续不断地发送给从节点,确保主从之间的数据一致性

Redis有哪些数据结构

Redis中共有5种数据结构,分别是字符串、哈希、列表、集合、有序集合

ZSET有序集合是怎么实现的

Redsi中的有序集合,在数据量比较小的时候,是使用ziplist实现的,在数据量大的时候,是使用skiplist+hashtable实现的 因为ziplist是将数据头和数据紧挨在一起,当需要从中间插入元素的时候,就需要挪动后面的所有元素,比较耗时,在数据量不大的时候还可以

为什么会选择skiplist

Redis选择Skiplist来实现有序集合的原因主要有2点

第一,是因为实现简单 skiplist和各种平衡树中元素都是有序排列的,在做范围查找的时候,平衡树先找到指定范围的小值,然后以中序遍历的方式继续寻找不大于大值的节点,如果不对平衡树做一些改造的化,中序遍历并不容易实现。而skiplist在找到指定范围的小值之后,只需在第一层链表上向后顺序查找即可,实现简单

平衡树的插入和删除动作有时会破坏平衡,需要做一些额外的工作来保持平衡,逻辑复杂,而skiplist只需要修改相邻节点的指针,实现简单

第二,内存占用更少 REDIS作为内存数据库,对内存是比较敏感的,平衡树平均每个节点需要包含2个指针,而skiplist在redis中的实现平均每个节点包含1.33个指针,内存占用更少