Redis中常用算法

in with 0 comment

Redis 中常用算法

sds

quicklist

skiplist

skiplist 本质也是一种查找结构,用于解决算法中的查找问题,即根据给定的 key,快速查到他所在的位置或者对应的 value。一般查找问题的解法分为两个大类:一个是基于各种平衡树,一个是基于哈希表。但是 skiplist 比较特殊,它没法归属到这两个大类中。

skiplist 跳表又称跳跃表,指的是除了最下面第一层链表之外,会产生若干层稀疏的链表,这些链表里面的指针故意跳过一些节点(而且越高层的链表跳过的节点越多)。这就使得我们在查找数据的时候能够现在高层的链表中进行查找,然后珠层减低,最终见到第一层链表来精确地确定数据位置。

skiplist与平衡树、哈希表的比较

Redis 中 skiplist 的实现

Redis 中 zset 包含一个 dict + skiplist。dict 用来查询数据到分数(score)的对应关系,而 skiplist 用来根据分数查询数据(可能是范围查找)。

lru

迁移槽和数据的流程

  1. 目标节点准备导入槽
  2. 源节点准备导出槽
  3. 获取 slot 下 个键
  4. 批量迁移相关键的数据
  5. 重复 3 4 步骤
  6. 通知槽分配给目标节点

键命令执行步骤

一、计算槽

根据键的有效部分使用 CRC16 函数计算出散列值,再取对 16383 的余数,使每个键都可以映射到 0 ~ 16383 槽范围内

二、查找槽所对应的节点

通常集群客户端都采用一种实现:Smart (智能)客户端

Smart 客户端通过在内部维护 slot -> node 的映射关系,本地就可以实现键到节点的查找,从而保证 IO 效率的最大化,而 MOVED 重定向负责协助 Smart 客户端更新 slot -> node 映射