加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Redis基本类型及其数据结构

发布时间:2019-09-02 20:24:53 所属栏目:建站 来源:xy的技术圈
导读:早年在行使Redis的时辰,只是简朴地行使它提供的根基数据范例和接口,并没有深入研究它底层的数据布局。最近规划从头进修梳理一下Redis方面的常识,以是规划从先容Redis的根基范例及其数据布局入手。 redisObject Redis的key是顶层模子,它的value是扁平化

字典着实就相同于Java说话中的Map,Python说话中的dict。与Java中的HashMap相同,Redis底层也是行使的散列表作为字典的实现,办理hash斗嘴行使的是链表法。Redis同样行使了一个数据布局来持有这个散列表:

Redis根基范例及其数据布局

在键增进或镌汰时,会扩容或缩容,而且举办rehash,按照hash值从头计较索引值。那假如这个字典太大了怎么办呢?

为了办理一次性扩容耗时过多的环境,可以将扩容操纵穿插在插入操纵的进程中,分批完成。当负载因子触达阈值之后,只申请新空间,但并不将老的数据搬移到新散列表中。当有新数据要插入时,将新数据插入新散列表中,而且从老的散列表中拿出一个数据放入到新散列表。每次插入一个数据到散列表,都一再上面的进程。颠末多次插入操纵之后,老的散列表中的数据就一点一点所有搬移到新散列表中了。这样没有了齐集的一次一次性数据搬移,插入操纵就都变得很快了。这个进程也被称为渐进式rehash。

set

set内里没有一再的荟萃。set的实现较量简朴。假如是整数范例,就直接行使整数荟萃intset。行使二分查找来帮助,速率照旧挺快的。不外在插入的时辰,因为要移动元素,时刻伟大度是O(N)。

假如不是整数范例,就行使上面在hash那一节先容的字典。key为set的值,value为空。

zset

zset是可排序的set。与hash的实现方法相同,假如元素个数不多且不大,就行使压缩列表ziplist来存储。不外因为zset包括了score的排序信息,以是在ziplist内部,是凭证score排序递增来存储的。意味着每次插入数据都要移动之后的数据。

跳表

跳表(skiplist)是另一种实现dict的数据布局。跳表是对链表的一个加强。我们在行使链表的时辰,纵然元素的有序分列的,但假如要查找一个元素,也必要从新一个个查找下去,时刻伟大度是O(N)。而跳表顾名思义,就是跳跃了一些元素,可以抽象多层。

如下图所示,好比我们要查找8,先在最上层L2查找,发此刻1和9之间;然后去L1层查找,发此刻5和9之间;然后去L0查找,发此刻7和9之间,然后找到8。

当元素较量多时,行使跳表可以明显镌汰查找的次数。

Redis根基范例及其数据布局

同list相同,Redis内部也不是直接行使的跳表,而是行使了一个自界说的数据布局来持有跳表。下图左边蓝色部门是skiplist,右边是4个zskiplistNode。zskiplistNode内部有许多层L1、L2等,指针指向这一层的下一个结点。BW是回退指针(backward),用于查找的时辰回退。然后下面是score和工具自己object。

Redis根基范例及其数据布局

总结

Redis对外袒露的是工具(数据范例),而每个工具都是用一个redisObject持有,通过差异的编码,映射到差异的数据布局。从最开始的谁人图可以知道,偶然辰差异工具也许会底层行使统一种数据布局,好比压缩列表和字典等。

在相识数据布局后,我们就可以或许更清晰应该选用什么样的工具,呈现题目时应该怎样优化了。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读