Redis 是什么

  1. 基于键值,使用哈希结构
  2. 基于内存,避免磁盘 I/O
  3. 单进程单线程模型,支持 I/O多路复用,支持多个 Socket连接
  4. 支持多种数据类型。

常见数据类型

String

三种编码格式: int (8 个字节,2^64), embstr (小于39字节), raw (大于 39字节)

Redis 会根据字符串大小动态调整长度。

Hash

两种实现,压缩列表和散列表。数据量小使用压缩列表。

Redis 使用链表发解决哈希冲突。支持散列表的动态扩容,缩容。

当装载因子过大(碰撞概率高,空位少,多次寻找空位),需要动态扩容,重新申请散列表,进行复制。每次数据迁移,因为散列表变了,哈希计算结果有变化,需要重新计算位置。Redis 需要动态扩容时,不直接迁移数据,而是先申请一个空间,在插入过程中,逐渐数据迁移。每次新插入进入新申请的散列表,然后搬迁从旧散列表一个数据。避免一次扩容时,大量耗时的数据搬迁。(渐进式扩容策略)

删除元素后,空闲空间太多,浪费空间,需要缩容。

List

有压缩列表和双向链表两种方式。

当列表中保存的单个数据(有可能是字符串类型的)小于 64 字节; 列表中数据个数少于 512 个 的时候使用压缩链表。

压缩链表可以按照元素大小调整空间。数据存储在连续空间内