redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表
1.动态字符串
redis中使用c语言的字符床存储字面量,默认字符串存储采用自己构建的简单动态字符串SDS(symple dynamic string)
redis包含字符串的键值对都是用SDS实现的
结构s d s.h/sdshdr
struct sdshdr{
int len; //buf使用的长度 SDS的长度
int free; //buf未使用的长度
char buf[]; //字节数据,保持字符串
}
free属性值 0,表示SDS没有分配使用空间
len属性值 5 表示SDS保存了5个字节长度的字符串
buf属性值char类型的数组,最欠扁保存 R e d i s五个字符,最后 \0 空字符结束
SDS和原生的c字符串的区别
获取字符串长度的时间复杂度O(1),c字符串O(N)
没有缓冲区溢出,c字符串在长度超过开辟的内存空间就会造成缓冲区溢出,SDS在修改时会查看当前长度和空间是否足够
减少内存重新分配次数。SDS在增加和减少字符串长度时候不会重新分配内存,也不会内存泄漏
空间预分配。SDS扩展空间 len<1mb 会预分配len大小的空间, len>1mb会预分配1mb空间
惰性空间释放 缩减字符串长度空间不会释放,会放到free属性记录
二进制安全 c字符串只能结尾空字符串,所以只能存储文本,SDS可以存储图片 音频 压缩文件等二进制数据,不会对二进制数据进行过滤限制等
2.链表。最常见的数据结构,c语言没有内置这种结构 redis构建了自己的链表实现
结构a d li s t.h/listNode
typedef struct listNode{
struct listNode *prev;
struct listNode *next;
void *value;
}listNode
typedef struct list{
listNode *head;
listNode *tail;
unsigned long len;
void *(*dup) (void *ptr);
void (*free) (void *ptr);
void (*match) (void *ptr, void *key);
}
redis实现了双端链表(prev next指针) 无环(头节点prev和尾节点的next指向null)。带头指针和尾指针 带长度值 多态
3.字典 符号表 关联数组 映射 一种key-value的抽象数据结构
redis的字典是有的hash表定义 dict.h/dictht
typedef struct ditch{
dictEntry **table;
unsigned long size;
unsigned long size mask;
unsigned long used;
}ditch;
typedef struct dicEntry{
void *key;
union{
void *val;
uint64_tu64;
int64_ts64;
}v;
struct dictEntry *next;
}dicEntry;
next属性值用来解决hash冲突的 链式地址法
4.跳跃表 有序的数据结构 每个节点存在多个指针,可以快速访问其他节点
结构
typedef struct zskiplistNode{
struct zskiplistlevel{
struct zskiplistNode *forward;
unsigned int span;
}
struct zskiplistNode *backward;
double score;
robj *obj;
}
5.整数集合 只包含整数值元素。元素数量不多的集合 redis会使用整数集合作为集合键的底层实现
保存 int16 32 64_t 类型的整数值 集合元素不重复
typedef struct inset{
uint32_t encoding;
uint32_t length;
int8_t contents[];
}iniset;
contents 数组元素不重复 从小到大排列
6.压缩列表 为了节约内存而开发的,特殊编码的连续内存快组成的顺序型数据结构
redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表的更多相关文章
- 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...
- [Redis]Redis的设计与实现-链表/字典/跳跃表
redis的设计与实现:1.假如有一个用户关系模块,要实现一个共同关注功能,计算出两个用户关注了哪些相同的用户,本质上是计算两个用户关注集合的交集,如果使用关系数据库,需要对两个数据表执行join操作 ...
- 深入理解Redis 数据结构—简单动态字符串sds
Redis是用ANSI C语言编写的,它是一个高性能的key-value数据库,它可以作用在数据库.缓存和消息中间件.其中 Redis 键值对中的键都是 string 类型,而键值对中的值也是有 st ...
- redis 笔记01 简单动态字符串、链表、字典、跳跃表、整数集合、压缩列表
文中内容摘自<redis设计与实现> 简单动态字符串 1. Redis只会使用C字符串作为字面量,在大多数情况下,Redis使用SDS(Simple Dynamic String,简单动态 ...
- Redis中的简单动态字符串
Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SD ...
- Redis核心原理-简单动态字符串SDS
SDS简介 Redis是C语言编写的,但没有使用c语言的字符串结构,而是自己实现了一套简单动态字符串 simple dynamic string 简称SDS,SDS兼容C语言的字符串类型,原理类似Ja ...
- 关于redis中SDS简单动态字符串
1.SDS 定义 在C语言中,字符串是以’\0’字符结尾(NULL结束符)的字符数组来存储的,通常表达为字符指针的形式(char *).它不允许字节0出现在字符串中间,因此,它不能用来存储任意的二进制 ...
- 图解Redis之数据结构篇——简单动态字符串SDS
图解Redis之数据结构篇--简单动态字符串SDS 前言 相信用过Redis的人都知道,Redis提供了一个逻辑上的对象系统构建了一个键值对数据库以供客户端用户使用.这个对象系统包括字符串对象 ...
- Redis数据结构之简单动态字符串SDS
Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话, ...
随机推荐
- TCP三次握手,四次挥手,状态变迁图
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- Linux:uniq命令详解
uniq uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用. 语法 uniq(选项)(参数) 选项 -c或——count:在每列旁边显示该行重复出现的次数: -d或--repeat ...
- Linux:grep命令详解
grep grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具, ...
- Eclipse Java EE IDE中jsp页面编码修改
Eclipse Java EE IDE模板编码是ISO8859,肯定不是我们需要的,修改方法如下图: 依次点击:Window---->Preference---->Web---->J ...
- d3.js入门学习
个人感觉前端数据可视化是个趋势,并且现在所在公司也是有做这块的项目,虽然我目前还没有接触到公司数据可视化的项目,但是,今后总是要接触的嘛. 今天看了一下公司目前所用的两种数据可视化工具---D3和EC ...
- Leetcode 429. N-ary Tree Level Order Traversal
bfs class Solution: def levelOrder(self, root: 'Node') -> List[List[int]]: q,ans=[root],[] while ...
- 为什么Android无法设置无标题栏?
首先我用的是Android Studio开发,但几乎试过了所有的方法,都无法设置无标题栏,最后改了一下style才解决 要在parent的值里面要加Base.····· 然后问题就解决了,这样所有的标 ...
- Android Bluetooth 总结
一.Android Bluetooth现状 (1)Android2.2版 支持的蓝牙核心版本是Bluetooth 2.0 + EDR. (2)Android 的蓝牙 使用了BlueZ协议栈,但只实现了 ...
- linux 系统优化+定时任务
安装软件 通过yum安装 自动补全工具:yum completion yum install -y tree bash-completion wget vim find -[TAB] 更改系统的yum ...
- Buildroot 使用默认配置
/******************************************************************************** * Buildroot 使用默认配置 ...