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的水平的话, ...
随机推荐
- 微信小程序获取当前页面的路径的方式
使用getCurrentPages可以获取当前加载中所有的页面对象的一个数组,数组最后一个就是当前页面. var pages = getCurrentPages() //获取加载的页面 var cur ...
- C#,WebRequest类、HttpWebRequest类与HttpRequest类的区别
C#,WebRequest类和HttpWebRequest类的区别? httpWebRequest是webRequest的子类,httpWebRequest是基于http协议的 . HttpWebRe ...
- Linux0.11信号处理详解
之前在看操作系统信号这一章的时候,一直是云里雾里的,不知道信号到底是个啥玩意儿..比如在看<Unix环境高级编程>时,就感觉信号是个挺神奇的东西.比如看到下面这段代码: #include& ...
- 手游服务端框架之GM金手指的设计
玩过单机游戏的朋友,应该对金山游侠这个软件很熟悉把.当初我经常嫌刷怪升级非常辛苦,很多时候都是直接用金山游侠来修改游戏的经验或者等级内存,直接把角色调得很牛逼. 游戏开发也非常需要这些可以修改玩家数据 ...
- 特殊的 html 空格
http://www.zhangxinxu.com/wordpress/2015/01/tips-blank-character-chinese-align/
- HttpUrlConnection使用Get和Post访问服务器的工具类(一)
首先我们有一个返回响应的接口HttpCallBackListener public interface HttpCallbackListener { void onFinish(String resp ...
- 使用PullToRefreshListView时遇到Item点击事件失效问题 解决方法
最近在自己的项目中使用到了以下开源项目: https://github.com/nanchen2251/pullToRefreshDemo 相关介绍博客如下: http://www.cnblogs.c ...
- allow-hotplug eth0 allow-hotplug error
/********************************************************************* * allow-hotplug eth0 error * ...
- 内联汇编实现 memcpy 和 memset
#pragma check_stack( off) LPVOID __cdecl _memcpy(void * dst, void* src, size_t size) { int dwSize = ...
- Ubuntu12.04中在桌面建立指向网页的链接文件的方法
#cd /usr/share/applications #cp firefox.desktop ~/Desktop #cd ~/Desktop #chmod +x firefox.desktop 右键 ...