高性能的 Redis 有哪些数据类型?

上一篇讲到 Redis 有高性能,其中一个原因是有高效的数据结构,今天我们就来讲一讲。

数据类型

在 Redis 中,所有的对象都被封装成 redisObject,包括 type、encoding 两个属性。

  • type,就是 Redis 支持的 string、hash、list、set 和 zset 五种数据类型
  • encoding,就是对应的数据结构

下面我简单说下这五种数据类型:

  • String:可存放数字和字符,常用来计数。
    底层用 int 存放数字,用简单动态字符串 SDS 存放字符。SDS 通过记录长度,和预分配空间,
    将获取长度的时间复杂度从 O(n) 降到 O(1),同时减少了内存重分配的次数。
  • Hash:键值对结构,常用来存放对象,可以单独对某个字段进行操作。
  • List:一个有序可重复的集合,支持在首尾增删,常用来实现类似最新回复的功能。
  • Set:一个无序不可重复的集合,支持取交集、并集,常用来实现类似共同关注的功能。
  • ZSet:比 Set 多了一个权重参数 score,使元素可以按 score 排列,常用来做排行榜。

跳表

ZSet 底层一开始用压缩列表(ziplist),当数据量变大时用跳表。

压缩列表在查找时,首尾元素可通过表头字段直接定位,复杂度是 O(1),
而其他的只能遍历查找,复杂度是 O(N)。

而跳表是在有序链表的基础上,增加了多级索引。

  • 查找时,从高层索引一次跳跃多个节点,如果找过头了,就用更下层的索引,复杂度是 O(logN)
  • 节点按照分值 score 排序,如果相等,就按照 value 排序,避免复杂度退化为 O(N)
  • 插入时,Redis 会随机分配层数,
    从 1 层到 32 层,晋升概率是 25%,从而保证越往上层节点数越少,便于跨越。
posted @ 2021-11-15 10:07  ayuecoding  阅读(176)  评论(0)    收藏  举报