三种编码格式: int (8 个字节,2^64), embstr (小于39字节), raw (大于 39字节)
Redis 会根据字符串大小动态调整长度。
两种实现,压缩列表和散列表。数据量小使用压缩列表。
Redis 使用链表发解决哈希冲突。支持散列表的动态扩容,缩容。
当装载因子过大(碰撞概率高,空位少,多次寻找空位),需要动态扩容,重新申请散列表,进行复制。每次数据迁移,因为散列表变了,哈希计算结果有变化,需要重新计算位置。Redis 需要动态扩容时,不直接迁移数据,而是先申请一个空间,在插入过程中,逐渐数据迁移。每次新插入进入新申请的散列表,然后搬迁从旧散列表一个数据。避免一次扩容时,大量耗时的数据搬迁。(渐进式扩容策略)
删除元素后,空闲空间太多,浪费空间,需要缩容。
有压缩列表和双向链表两种方式。
当列表中保存的单个数据(有可能是字符串类型的)小于 64 字节; 列表中数据个数少于 512 个 的时候使用压缩链表。
压缩链表可以按照元素大小调整空间。数据存储在连续空间内
