回顾redis底层数据结构
参考,欢迎点击原文: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底层数据结构的更多相关文章
- Redis 底层数据结构介绍
Redis 底层数据结构 版本:2.9 支持的数据类型: 字符串 散列 列表 集合 有序集合 字符串 Redis 利用原生的 c 字符串进行了一次封装.封装的字符串叫做简单动态字符串:SDS(simp ...
- Redis底层数据结构详解
上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言 ...
- redis底层数据结构之快速列表(quicklist)
快速列表(quicklist) redis3 .2版本之前,List类型数据使用的底层数据结构是压缩列表(ziplist)或双向链表(linkedlist),当列表元素个数比较少并且每个元素占用空间比 ...
- 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...
- Redis学习笔记(二)redis 底层数据结构
在上一节提到的图中,我们知道,可以通过 redisObject 对象的 type 和 encoding 属性.可以决定Redis 主要的底层数据结构:SDS.QuickList.ZipList.Has ...
- redis底层数据结构之字典(dict)
字典(dict) 字典又称为符号表或者关联数组.或映射(map),是一种用于保存键值对(key-value)的抽象数据结构 字典中的每个key都是唯一的,通过key对值来进行查找或修改,时间复杂度为 ...
- redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表
1.动态字符串 redis中使用c语言的字符床存储字面量,默认字符串存储采用自己构建的简单动态字符串SDS(symple dynamic string) redis包含字符串的键值对都是用SDS实现的 ...
- redis 底层数据结构 压缩列表 ziplist
压缩列表是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现 当一个哈希键只包含少量键 ...
- redis 底层数据结构 整数集合intset
整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时Redis就会使用整数集合作为集合键的底层实现 整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保存 ...
- Redis底层数据结构实现
REDIS 较宽泛的支持5种数据结构 分别为 字符串 列表 集合 散列 有序集合 关于这几种数据结构的使用 相信网上有很多资料,查看官网API 也很详细了 读者可以自己随意翻阅 很方便 . 接下 ...
随机推荐
- Windows XP Professional with Service Pack 3 (x86)
Windows XP Professional with Service Pack 3 (x86) 链接:https://pan.baidu.com/s/1p99vLx5psoq9K4ONlRpkZA ...
- Mygin之错误恢复Recover中间件
本篇是mygin这个系列的最后一篇.如果想自己动手实现一个类似Gin的Web框架,建议从 mgin第一篇开始, 总代码行数有效行数只有600多行 github源码 mygin 目的 实现错误处理机制 ...
- CentOS 安装字体
问题来源,今天服务端生成中文图片验证码的Base64字符串,结果返回到客户端后,解码Base64发现是乱码,怀疑是Centos 系统不包含中文字体的问题, 安装字体后,果然问题解决了,以后做系统镜像的 ...
- Linux中单引号和双引号的区别
区别:单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动的使用:而双引号属于弱引用,它会对一些被引起来的字符进行特殊处理.简单来说,单引号直接输出内部字符串,不解析特 ...
- 吉特日化MES & 某配料自动化项目业务架构图
作者:情缘 出处:http://www.cnblogs.com/qingyuan/ 关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路 版权声明:本文版权归作者和博客园 ...
- Spring Boot + MyBatis-Plus 实现 MySQL 主从复制动态数据源切换
MySQL 主从复制是一种常见的数据库架构,它可以提高数据库的性能和可用性.动态数据源切换则可以根据业务需求,在不同场景下使用不同的数据源,比如在读多写少的场景下,可以通过切换到从库来分担主库的压力. ...
- NC20477 [ZJOI2008]树的统计COUNT
题目链接 题目 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II ...
- Laravel入坑指南(12)——最终章:Session、缓存与Redis
因为web服务除了业务准确之外,我们最关注的就是服务的性能.鉴于web服务几乎都是IO密集型,我们为了提高IO的速度,自然不能把所有的数据都放在关系型数据库中.而redis的并发与性能可以很好地帮我们 ...
- 我的小程序之旅六:微信公众号授权登录(适用于H5小程序)
实现步骤 1 第一步:用户同意授权,获取code 2 第二步:通过code换取网页授权access_token 3 第三步:刷新access_token(如果需要) 4 第四步:拉取用户信息(需sco ...
- 05、etcd 读请求执行流程
本篇内容主要来源于自己学习的视频,如有侵权,请联系删除,谢谢. 1.etcd读请求概览 etcd是典型的读多写少存储,在我们实际业务场景中,读一般占据2/3以上的请求.一个读 请求从client通过R ...