【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等
Redis有五种数据类型string、list、hash、set、zset(字符串、哈希、列表、集合、有序集合)并且自实现了简单动态字符串、双端链表、字典、压缩列表(ziplist)、整数集合、跳跃表(skiplist)等数据结构。Redis底层使用了多种数据结构来实现各种特性。对于Redis底层实现的了解,可以让我们对Redis工作原理更加清晰。
Redis的五种数据类型

Redis数据结构与内部编码,如下图:

从上图可知Redis每种数据结构可以有多种实现,比如hash可以用hashtable实现也可以用ziplist实现,这样的好处是当有更好的算法实现的时候,像quickList(快速列表)就是比ziplist和linkedList性能更好,那么这时候用更好的算法来替代底层只需要切换具体的实现方式就可以,而不用改动太多的代码,这个有点类似于设计模式里的策略模式,对于用户来说是无感知的。
redis对象(redisObject)
redis源码内部是有一个redisObject对象,redis的键值都是redisObject对象,即在创建时会生成一个用于键名的redisObject对象和一个用于键值的redisObject对象,它是一个c语言结构体。
其结构体如下:
typedef struct redisObject {
// 类型
unsigned type:;
// 编码
unsigned encoding:;
// 指向数据的指针
void *ptr;
// 记录对象最后一次被程序访问时间,用于计算空转时长(当前时间-lru)
unsigned lru:; /* lru time (relative to server.lruclock) */
// 引用计数,用于内存回收
int refcount;
} robj;
redisObject包含信息:
1.数据类型(type)
数据类型包括对外的数据结构类型,包括string,hash,list,set,sorted set。
2.编码方式(encoding)
编码方式包括raw,int,ziplist,linkedlist,hashmap,intset等内部实现的算法。redis在底层设计的时候比较灵活,编码算法都是可以替换的,比如list有ziplist,linkedlist两种实现,在redis3.2版本中又添加了性能更好的quickList数据结构。
3.数据指针(ptr)
4.虚拟内存(vm)
5.其他信息
结构体中定义中的type:4、encoding:4这种定义方式称为位段类型。位段是C语言中允许在一个结构体中以位为单位来指定其成员所占内存长度,能够用较少的位数存储数据,所以使用位段类型的好处就是避免浪费内存。
简单动态字符串(simple dynamic string,SDS)
虽然Redis是用c语言编写的,但是Redis底层很多地方都哟自己的实现。就比如简单动态字符串。Redis中字符串的表示并没有直接使用C字符串来表示,C字符串仅仅作为字符串字面量。它是以Struct的形式构造了一个SDS的抽象类型。当Redis需要一个可以被修改的字符串时,就会使用SDS来表示。在Redis数据库里,包含字符串值的键值对都是由SDS实现的(Redis中所有的键都是由字符串对象实现的即底层是由SDS实现,Redis中所有的值对象中包含的字符串对象底层也是由SDS实现)。
SDS的定义位于sds.h
struct sdshdr {
// buf 中已占用空间的长度
int len;
// buf 中剩余可用空间的长度
int free;
// 数据空间,默认是使用C字符串的空字符结尾的
char buf[];
};
【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等的更多相关文章
- redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表
1.动态字符串 redis中使用c语言的字符床存储字面量,默认字符串存储采用自己构建的简单动态字符串SDS(symple dynamic string) redis包含字符串的键值对都是用SDS实现的 ...
- redis 系列3 数据结构之简单动态字符串 SDS
一. SDS概述 Redis 没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型,并将SDS用作Redis的默 ...
- [Redis]Redis的设计与实现-链表/字典/跳跃表
redis的设计与实现:1.假如有一个用户关系模块,要实现一个共同关注功能,计算出两个用户关注了哪些相同的用户,本质上是计算两个用户关注集合的交集,如果使用关系数据库,需要对两个数据表执行join操作 ...
- Redis数据结构之简单动态字符串SDS
Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话, ...
- Redis核心原理-简单动态字符串SDS
SDS简介 Redis是C语言编写的,但没有使用c语言的字符串结构,而是自己实现了一套简单动态字符串 simple dynamic string 简称SDS,SDS兼容C语言的字符串类型,原理类似Ja ...
- Redis数据结构之简单动态字符串
Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将SDS用作Redi ...
- 跟着大彬读源码 - Redis 7 - 对象编码之简单动态字符串
Redis 没有直接使用 C 语言传统的字符串表示(以空字符串结尾的字符数组),而是构建了一种名为简单动态字符串(simple dynamic string)的抽象类型,并将 SDS 用作 Redis ...
- Redis源码阅读一:简单动态字符串SDS
源码阅读基于Redis4.0.9 SDS介绍 redis 127.0.0.1:6379> SET dbname redis OK redis 127.0.0.1:6379> GET dbn ...
- Redis底层探秘(二):链表和跳跃表
链表简介 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地跳转链表的长度. 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用C语言并没有内 ...
随机推荐
- java学习-初级入门-面向对象①-面向对象概述-结构化程序设计
为了学习面向对象程序设计,今天我们先利用面向对象以前的知识,设计一个学生类. 要求进行结构化程序设计. 学生类: Student 要求:存储学生的基本信息(姓名.性别.学历层次和年级),实现学生信息的 ...
- Windows下配置多个Git账号
1. 为什么会用多个git账号? 不同git账号对应不同代码托管平台,如:github.bitbucket.gitlab.gitee(码云)等 2个GitHub账号,用于测试(最近需求,之前没研究过g ...
- Hive的原理和基本用法
一.Hive的概述 1.Hive的定义 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL进行数据读取.写入和管理. 2.Hive的架构图 hive ...
- Ubuntu基于Apache为自己的网站开启HTTPS
暂时放这里链接,之后整理 https://www.deanhan.cn/ubuntu-apache-https.html
- LoadRunner之Block
如何在一个脚本中实现不同事务不同次数的循环呢? 案例:假如你想在一个脚本中,实现登录执行1次,查询执行2次,插入执行3次,怎么办?录3个脚本?每个事务分别在脚本中复制N次? 当然不用,LR早就想到了你 ...
- C++字符集和词法记号以及符号常量
C++字符集 大小写的英文字母:A~Z,a~z 数字符号:0~9 特殊字符:!#%*()等 关键字:C++预定义的单词 标识符:程序员声明的单词,它命名程序正文中的一些实体 文字:在程序中直接使用符号 ...
- MySQL学习之SQL基础(一)DDL
Sql基础 DDL (data defination language) 创建表 CREATE TABLE emp( ename varchar(10), hiredate date, sal dec ...
- POJ 3292:Semi-prime H-numbers 筛选数
Semi-prime H-numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8216 Accepted: 3 ...
- sftp 多用户安装与配置
sftp 是 Secure File Transfer Protocol 的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.SFTP 为 SSH 的一部分,由于这种传输方式使用了加密/解 ...
- package报错
java类的第一行package 包路径 package报错 jdk版本不一致 或者jar包冲突