Redis设计核心-1-Redis底层数据结构总结3

前言

最近看了相关的Redis设计核心相关的书籍,对Redis有了一些小的认识,然后自己也做一些产出加深映象,我会从几个方面去总结Redis设计的核心内容:Redis底层数据结构总结、Redis高性能由哪些基础支撑、Redis应用场景、那些有趣的功能。

概述 

本篇主要内容是对Redis的基础数据结构是如何实现底层数据结构做一个汇总。Redis为大部分数据结构提供了多种实现,目的体现了Redis的两个设计核心:存储效率--节省内存,内存利用率高,响应效率-降低单次的响应时间。


前言

概述 

基础数据结构的实现

RedisObject表示的数据结构编码类型

存储效率:采用了什么样的设计提升了存储效率

响应效率

为什么Redis会为每种数据结构设计多种实现?


 


基础数据结构的实现


String使用SDS结构存储字符串,SDS根据字符串长度分为SDSHDR5、SDSHDR8、SDSHDR16、SDSHDR32、SDSHDR64,和多种编码类型:int、emb、raw


List使用Quicklist存储元素,Quicklist利用双向链表+Ziplist的特性来实现,将Ziplist分段存储,每段Ziplist作为一个node节点相互连接组成一个大的双向链表。


Set有两种底层数据结构:非标准结构-inset,标准结构-Dict字典,当存储元素数量较少时且全为整形时使用inset结构,可以节省内存空间。

临界点:


Zset有两种底层数据结构:非标准结构-Ziplist,标准结构-Skiplist。当元素数量较少且元素占用空间小于临界点时,使用非标准结构。

临界点:

       zset-max-ziplist-entries 128   :最多存储128个元素,既256个数据项(因为score和value占用两个位置)

        zset-max-ziplist-value 64     :任意一个数据长度超过64k


Hash有两种底层数据结构:非标准结构-Ziplist,标准结构-Skiplist。当元素数量较少且元素占用空间小于临界点时,使用非标准结构。

临界点:

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

RedisObject表示的数据结构编码类型

 

图片来源于网络

RedisObject中,使用type来表示数据类型,如String、zset、hash等,使用encoding来表示数据编码结构,如int(SDS)、emb(SDS)、raw(SDS)、ziplist、skiplist等。


存储效率:采用了什么样的设计提升了存储效率

  •     1.SDS为了节省内存,内部使用多种SDS结构:SDSHDR5、SDSHDR8、SDSHDR16、SDSHDR32、SDSHDR64,每种结构的占用空间都不相同。
  •     2.SDS为了节省内存,内部使用紧凑排列+压缩数据格式,使用字节数组存储元素
  •     3.Ziplist内部的Encoding做了压缩编码,使其能表示多种数据结构和字符占用空间,节省内存,但在使用时需要先解码。
  •     4.Ziplist底层使用紧凑字节数组存储,内部部分字段压缩编码,根据占用空间选择合适的结构存储,如pre_e_l和encoding,内存占用率和内存碎片率低。
  •     5.quicklist使用小的ziplist存储数据,利用ziplist提高存储效率,并且只维护了少量的node节点,也提高了内存效率,降低内存碎片率
  •     6.quicklist提供数据压缩功能,提升存储效率。因为一般list操作都是首尾操作,将非首尾元素进行压缩,减少占用内存。
  •     7.listpak对ziplist结构做了优化,将元素之间相互对立,提供length来实现反向遍历,并且length是变长结构。

响应效率

  •     1.Dict使用散列表结构,时间复杂度为O(1),其中Database、Set、Ziplist、Hash都使用了Dict结构
  •     2.SDS为了节省内存提升效率,内部有多种编码格式:int、emb、raw,根据数据类型选择合适的编码。emb内存连续,提供顺序读等优点。
  •     3.iplist是一个紧凑数组,内存是连续的可以提供顺序读取
  •     4.ziplist提供zlentry缓存解码数据
  •     5.quickulist使用小的ziplist,避免了大ziplist的空间重分配慢,
  •     6.Skiplist的时间复杂度优于平衡树,因为其内部做修改时只需要维护前后向引用,而平衡可能会导致旋转。

 

为什么Redis会为每种数据结构设计多种实现?

当元素数量少时,使用标准结构和非标准结构提供的性能相似,但占用的内存空间却有很大差别。大部分情况下容器类的key存储元素数量相对较少,而如果采用标准结构来实现需要占用大量的内存空间,并且标准结构的内存碎片率也相对较高。所以在设计非标准结构时Redis围绕这几点做了设计:响应效率、存储效率、内存碎片率,比如SDS、Ziplist结构的字节数组紧凑存储,内存碎片率低,占用内存少,比如内部的数据压缩结构,根据数据长度选择合适的结构存储,都是为了提高性能,降低内存占用。

未完待续.....
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值