Redis五种数据类型的底层实现总结

Redis的五种数据类型:

  • 字符串(string)
  • 列表(list)
  • 哈希(hash)
  • 集合(set)
  • 有序集合(zset)

Redis所用到的底层数据结构:

对象系统

redis并没有直接使用以上的数据结构来实现键值对数据库,而是基础这些数据结构创建了一个对象系统,包含:字符串对象、列表对象、哈希对象、集合对象和有序集合对象,这些对象都至少用到了一种数据结构。

使用对象的优点:
  • 针对不同的使用场景,为对象设置不同的数据结构实现,从而优化对象在不同场景下的使用效率
  • Redis的对象系统实现了基于引用计数技术的内存回收机制,当程序不再使用某个对象的时候,这个对象所占用的内存就会自动释放
  • Redis还基引用计数技术实现了对象共享机制,在适当的条件下,通过让多个数据库键共享同一个对象来节约内存
  • Redis的对象带有访问时间的记录信息,该信息可以用于计算数据库键的空转时长,在服务器启用了maxmemory功能的情况下,空转时长较大的那些键可能会优先被服务器删除
对象的类型和编码

一个键值对会至少创建两个对象:键对象、值对象
如set a “a”命令,会创建两个字符串对象,redis中的每个对象由一个redisObject结构表示:

typedef struct redisObject{
	unsigned type:4; //类型
	unsigned encoding 4; //编码
	void * ptr; //指向底层实现数据结构的指针
	......
}robj;

对象类型:
在这里插入图片描述
所有的键的对象类型都是字符串对象,使用type命令可以查看一个键值对的值对象类型:
在这里插入图片描述
编码和底层实现:
对象的ptr指针指向对象的底层数据结构,这些数据结构由encoding(编码)属性决定,下图为对象的编码表:
在这里插入图片描述
每种类型的对象都至少使用的两种不同的编码,可以通过如下命令查看对象所使用的编码:
在这里插入图片描述
下图列出了每种对象可以使用的编码:
在这里插入图片描述
下图为不同的编码的对象所对应的object encoding 命令输出值:
在这里插入图片描述
在这里插入图片描述
同一种数据类型的redis可以有多种底层实现数据结构,极大地提升了reids的灵活性和效率,下面列出不同的对象类型,以及相同的对象类型不同的值的情况下所对应的底层数据结构。

字符串对象

字符串对象可以使用的编码有:int、raw、embstr

  • 当值时为大于32字节的字符串时,使用raw
  • 当值为整数,并且这个整数可以用long类型来表示时,使用int
  • 当值时为小于等于32字节的字符串时,使用embstr
    在这里插入图片描述
    在这里插入图片描述

embstr编码是专门用于保存短字符串的一种编码方式。

列表对象

列表对象的编码可以是ziplist或者linkedlist

  • 列表对象保存的所有字符串元素长度小于64字节并且元素数量小于
    512个时,使用ziplist编码
  • 否则使用linkedlist编码
    ziplist编码:
    在这里插入图片描述
    linkedlist编码:
    在这里插入图片描述
哈希对象

哈希对象的编码可以是ziplist或者hashtable

  • 哈希对象保存的所有键值对的键和值的字符串长度小于64字节并且键值对数量小于
    512个时,使用ziplist编码
  • 否则使用hashtable编码
    ziplist编码:
    在这里插入图片描述
    压缩列表:
    在这里插入图片描述
    hashtable编码:
    在这里插入图片描述
集合对象

集合对象的编码可以是intset或者hashtable

  • 集合对象保存的所有元素是整数值并且元素个数不超过512个,用intset编码
  • 否则使用hashtable编码
    intset编码:
    在这里插入图片描述
    hashtable编码:
    在这里插入图片描述
有序集合对象

有序集合对象的编码可以是ziplist或者skiplist

  • 有序集合保存的元素个数小于128并且元素采用长度小于64字节时,用ziplist编码
  • 否则使用skiplist编码
    ziplist编码:
    在这里插入图片描述
    skiplist编码:
    在这里插入图片描述
回答: Redis中常用的5种数据类型分别是String字符串类型、List列表类型、Hash哈希类型、Set集合类型和Zset有序集合类型。每种数据类型都有不同的用途和适用场景。String字符串类型适用于存储单个值,比如存储用户信息、计数器等。List列表类型适用于存储有序的多个值,比如消息队列、最新消息列表等。Hash哈希类型适用于存储多个键值对,比如存储用户信息、商品信息等。Set集合类型适用于存储无序的唯一值,比如存储用户标签、好友列表等。Zset有序集合类型适用于存储有序的唯一值,并可以给每个值关联一个分数,比如存储排行榜、帖子按热度排序等。不同的数据类型可以根据业务需求选择合适的类型来存储数据。\[1\] #### 引用[.reference_title] - *1* [Redis5种数据类型使用场景梳理](https://blog.csdn.net/weixin_40918067/article/details/116572462)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [redis 五种数据类型底层数据结构](https://blog.csdn.net/dmcdust/article/details/121917775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值