参考,欢迎点击原文:https://blog.csdn.net/qq_38286618/article/details/102530020
https://www.cnblogs.com/jaycekon/p/6277653.html

提示:本文谨作知识梳理


前言

因为最近时期有必要好好回顾下各块知识,然后看到redis这块发现按照现在的工作年限不能再像之前一样只知道几种基本类型就行了,需要深耕一下了,记录如下

众所周知redis有5种基本类型:string,list,set,zset,hash
接下来我们需要进一步深扒这5种基本类型低层是什么样的数据结构,这样的结构有啥好处。

一、string

基于简单动态字符串simple dynamic string SDS(不是ssd)
该结构对象里有三个主要属性:

int len;// 已使用长度
int free;// 未使用长度
char bugf[];// 使用的“数组”空间

有以上三个属性,当需要拓展空间时会预估空间然后分配内存,这样避免了缓冲区溢出做到了对空间动态释放和扩容

二、list

1、基于双向链表实现,该结构属性如下

    listNode  * head;// 表头节点
listNode * tail;// 表尾节点
unsigned long len; // 链表长度
void *(*dup) (void *ptr);// 节点值复制函数
void (*free) (void *ptr);// 节点值释放函数
int (*match)(void *ptr, void *key);// 节点值对比函数

2、基于压缩列表实现

每个节点node里面存储了如value值,前后指针等信息。当list元素个数少且元素内容长度不大时,使用压缩列表实现
链表特点:有序,可存多个相同值,非连续内存空间,使用指针前后相连

三、set

1、基于字典,也就是hash表实现,实质是个map映射关系。该结构属性如下

dictEntry **table;//哈希表数组
unsigned long size;//哈希表大小
unsigned long sizemask;//哈希表大小掩码,用于计算索引值
unsigned long used;//该哈希表已有节点的数量

2、如果都是整数,使用整数集合。

tip:如果遇到hash冲突,使用头插法插入到hash表的节点中

四、zset

1、基于跳跃表skiplist,跳跃表实际是一个有节点的有序链表,里面每个节点中维持多个指向其他节点的指针,相当于二分查找

2、数据量不大基于压缩列表

五、hash

基于压缩列表和字典

回顾redis底层数据结构的更多相关文章

  1. Redis 底层数据结构介绍

    Redis 底层数据结构 版本:2.9 支持的数据类型: 字符串 散列 列表 集合 有序集合 字符串 Redis 利用原生的 c 字符串进行了一次封装.封装的字符串叫做简单动态字符串:SDS(simp ...

  2. Redis底层数据结构详解

    上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言 ...

  3. redis底层数据结构之快速列表(quicklist)

    快速列表(quicklist) redis3 .2版本之前,List类型数据使用的底层数据结构是压缩列表(ziplist)或双向链表(linkedlist),当列表元素个数比较少并且每个元素占用空间比 ...

  4. 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等

    redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...

  5. Redis学习笔记(二)redis 底层数据结构

    在上一节提到的图中,我们知道,可以通过 redisObject 对象的 type 和 encoding 属性.可以决定Redis 主要的底层数据结构:SDS.QuickList.ZipList.Has ...

  6. redis底层数据结构之字典(dict)

    字典(dict) 字典又称为符号表或者关联数组.或映射(map),是一种用于保存键值对(key-value)的抽象数据结构 字典中的每个key都是唯一的,通过key对值来进行查找或修改,时间复杂度为 ...

  7. redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表

    1.动态字符串 redis中使用c语言的字符床存储字面量,默认字符串存储采用自己构建的简单动态字符串SDS(symple dynamic string) redis包含字符串的键值对都是用SDS实现的 ...

  8. redis 底层数据结构 压缩列表 ziplist

    压缩列表是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现 当一个哈希键只包含少量键 ...

  9. redis 底层数据结构 整数集合intset

    整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时Redis就会使用整数集合作为集合键的底层实现 整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保存 ...

  10. Redis底层数据结构实现

    REDIS  较宽泛的支持5种数据结构  分别为 字符串 列表 集合 散列 有序集合 关于这几种数据结构的使用 相信网上有很多资料,查看官网API 也很详细了  读者可以自己随意翻阅 很方便 . 接下 ...

随机推荐

  1. 群联预告满血PCIe 5.0 SSD主控:飙上14.7GB/s

    群联电子将在CES 2024上展示两款新的PCIe 5.0 SSD主控方案,一个定位旗舰,一个面向主流. PCIe 5.0 SSD诞生已经差不多一年了,但是受限于群联E26主控的先天不足,以及闪存技术 ...

  2. 每日一道Java面试题:说一说Java中的泛型?

    写在开头 今天的每日一道Java面试题聊的是Java中的泛型,泛型在面试的时候偶尔会被提及,频率不是特别高,但在日后的开发工作中,却是是个高频词汇,因此,我们有必要去认真的学习它. 泛型的定义 什么是 ...

  3. 会话跟踪技术之SESSION

    会话跟踪技术之SESSION 一般来说,登录信息既可以存储在session中,也可以存储在cookie中,他们之间的差别在于session可以方便的存取多种数据类型,而cookie只支持字符串类型,同 ...

  4. 教你用JavaScript实现实时字符计数器

    案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个实时字符计数器.用户在指定位置打字,程序实时显示字符数量. 案例演示 在编辑框内输入 ...

  5. .NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(下)

    18 | 日志框架:聊聊记日志的最佳姿势 除了使用 CreateLogger 指定 logger 的名称,实际上还可以借助容器来构造 logger,通常情况下我们会定义自己的类 namespace L ...

  6. Linux-Shell变量的算术运算

    一.算术运算符 1.+.- 求和. a+b   a-b 2. *./.% 求乘积,商,余数    a*b   a/b    a/b 3.** 幂运算,例如 3**3 是求 3 的立方,即 27 4. ...

  7. NC17890 方格填色

    题目链接 题目 题目描述 给一个m x n的方格,Applese想要给方格填上颜色,每个格子可以是黑色或者白色.他要求左右相邻两格不能同为白色且相邻两列不能全为黑色. 求满足条件的方案数. 输入描述 ...

  8. NC16856 [NOI1999]钉子和小球.md

    题目链接 题目 题目描述 有一个三角形木板,竖直立放,上面钉着n(n+1)/2颗钉子,还有(n+1)个格子(当n=5时如图1).每颗钉子和周围的钉子的距离都等于d,每个格子的宽度也都等于d,且除了最左 ...

  9. Github 使用PAT(Personal Access Token)后的命令行登录

    在Github上启用PAT 命令行下使用git push不能再直接使用用户名密码, 在输入密码的地方需要使用PAT来代替. 具体的创建步骤为 https://docs.github.com/en/gi ...

  10. 【framework】TaskStack简介

    1 前言 ​ TaskStack 用于管理 app,一般一个应用程序对应一个 TaskStack,其父容器为 TaskStackContainers(DisplayContent 的子容器),子容器为 ...