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算法。