Redis基本类型及其数据结构
副问题[/!--empirenews.page--]
早年在行使Redis的时辰,只是简朴地行使它提供的根基数据范例和接口,并没有深入研究它底层的数据布局。最近规划从头进修梳理一下Redis方面的常识,以是规划从先容Redis的根基范例及其数据布局入手。 redisObjectRedis的key是顶层模子,它的value是扁平化的。Redis中,全部的value都是一个object,它的布局如下:
简朴先容一下这几个字段:
string在Redis内部,string范例有两种底层储存布局。Redis会按照存储的数据及用户的操纵指令自动选择吻合的布局:
SDS SDS的内部数据布局:
可见,其底层是一个char数组。buf最大容量为512M,内里可以放字符串、浮点数和字节。以是你乃至可以放一张序列化后的图片。它为什么没有直接行使数组,而是包装成了这样的数据布局呢? 由于buf会有动态扩容和缩容的需求。假如直接行使数组,那每次对字符串的修改城市导致从头分派内存,服从很低。 buf的扩容进程如下:
惰性空间开释指的是当字符串收缩时,并没有真正的缩容,而是移动free的指针。这样未来字符串长度增进时,就不消从头分派内存了。但这样会造成内存挥霍,Redis提供了API来真正开释内存。 listlist底层有两种数据布局:链表linkedlist和压缩列表ziplist。当list元素个数少且元素内容长度不大时,行使ziplist实现,不然行使linkedlist。 链表 Redis行使的链表是双向链表。为了利便操纵,行使了一个list布局来持有这个链表。如图所示:
data存的着实也是一个指针。链表内里的元素是上面先容的string。由于是双向链表,以是可以很利便地把它当成一个栈可能行列来行使。 压缩列表 与上面的链表相对应,压缩列表有点儿相同数组,通过一片持续的内存空间,来存储数据。不外,它跟数组差异的一点是,它应承存储的数据巨细差异。每个节点上增进一个length属性来记录这个节点的长度,这样较量利便地获得下一个节点的位置。 上图的各字段寄义为:
压缩列表不可是list的底层实现,也是hash的底层实现之一。当hash的元素个数少且内容长度不大时,行使压缩列表来实现。 hashhash底层有两种实现:压缩列表和字典(dict)。压缩列表方才上面已经先容过了,下面首要先容一下字典的数据布局。 字典 (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |