zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Redis 基础数据类型

2023-04-18 14:24:41 时间

Redis底层数据结构

简单动态字符串(Simple Dynamic String)

特点:主要解决C语言不支持字符串功能,对C语言字符数组进行扩充增加字符串属性与方法。

优点:

  1. 通过增加长度属性,减少获取长度的复杂度
  2. 通过预分配和惰性释放来,减少修改字符串长度时需要的内存分配次数
  3. 二进制安全(RedisAPI通过二进制来处理字符数组,不会象C一样改变数据内容)
  4. 因本质上存放数据的依然是C字符数组,所有兼容C字符串函数     

链表

特点

  • 无环:头节点的前一个节点,和尾节点的下一个节点,均指向NULL
  • 双向:每个节点都有前一个和下一个节点

优点

  1. 带头尾节点与节点数量,有效简化查询
  2. 可支持多种数据类型

字典

特点:

  • 使用Hash Table来存储数据,且使用两个Hash表,一个用于存储数据,另一个用于rehash时中转。

优点:

  1. 有效减少Rehash的开销(使用渐进式rehash,“标记-复制”)
  2. 在作为数据库使用时,使用MurmurHash2算法(4.0以上使用SipHash)

跳跃表

扩展阅读(【有料】Redis(2)——跳跃表-CSDN博客

特点:

  • 由zskiplist和zskipnode组成,zskiplist保存跳表的层数、长度

优点:

  1. 底层使用双向链表存储数据,数据查找更加方便快速
  2. Redis 跳跃表默认允许最大的层数是 32 ,通过ZSKIPLIST_MAXLEVEL 设置   

整数集合

特点

  • 只支持升级,不支持降级通过Int数组实现

优点:

  1. 升级操作,提高了灵活性,节约了内存

压缩列表

特点:

  • 可以有多个节点,每个节点可保存一个字节数组或整数值
  • 添加和删除节点有一定几率会引起连锁更新操作

优点:

  1. 紧凑的顺序型数据结构,节约内存

数据对象

数据对象通过type属性来确定对象类型.

具体如下:

类型常量对象名称
REDIS_STRING字符串对象
REDIS_LIST列表对象
REDIS_SET集合对象
REDIS_HASH哈希对象
REDIS_ZSET有序集合对象

字符串对象

底层数据结构:小于等于44个字节使用EMSTR,大于44个字节使用SDS结构

编码转换

int->raw:追加非数字内容则转换为RAW

embstr->raw ,追加或者修改内容长度大于44个字节

列表对象

底层数据结构:使用ziplist(压缩编码)和Linkedlist(链表)

编码转换

ziplist->linkedlist

  1. 列表中有元素长度大于64字节
  2. 列表元素个数大于等于512个

可在配置文件中修改list-max-ziplist-value,list-max-ziplist-entries修改默认配置

哈希对象

底层数据结构:ziplist和hashtable

编码转换

ziplist->HashTable

  1. 列表中有元素长度大于64字节
  2. 列表元素个数大于等于512个

可在配置文件中修改list-max-ziplist-value,list-max-ziplist-entries修改默认配置

集合对象

底层数据结构:isntset或者HashTable

编码转换:

intset->HashTable

集合中有非数字内容

集合的元素数量大于等于512个

set-max-intset-entries,可以修改集合元素个数上限

有序集合对象

底层数据结构:ziplist或者skiplist

编码转换:

1.集合内元素大于等于128个

2.向集合添加,超过64个字节长度的元素

zset-max-ziplist-entries :可修改集合元素个数上限

zset-max-ziplist-value:可修改集合元素长度上限