redis中的数据结构

sorted set

sorted set是有序键值对集合,查询结果按照分数排序

1
zrange key 0 -1 withscores

还可以根据field获取到score的值

1
zscore key field

那么内部的是怎么实现的呢?

跳跃表

跳跃表是链表的升级,查询效率是O(log(N)),比链表查询效率高。新增节点和删除节点时,只需要更新临近节点的指针指向,比平衡树插入和删除时操作简单,属于空间换时间。
但是

  • 根据field查询score
  • 根据field查询rank
  • 查询rank范围内的数据

这三种场景如果在跳跃表中实现,需要遍历,复杂度O(N)。所以,
redis同时使用了哈希表,键为field,值为score,这样就支持了O(1)的复杂度根据field查询score。为了能够支持rank相关查询,redis里对跳跃表做了改进,增加了range,使得查询rank相关的操作也能达到O(log(N))。

bitmap

redis的bitmap结构可以支持位图相关操作,有个命令是bitcount,用来计算为1的位个数,这里引申出来了汉明重量,redis使用的是variable-precision SWAR算法

参考

Redis为什么用跳表而不用平衡树?
bitcount优化之路