目录 前言 1. 跳跃表 1.1 跳跃表与其节点的定义 1.2 跳跃表的API 2. 整数集合 2.1 整数集合的实现 2.2 整数集合的类型升级 2.3 整数集合的API 3. 压缩列表 3.1 压缩列表的结构 3.2 压缩列表节点的定义 3.3 连锁更新 3.4 压缩列表的API 最后 前言 参考资料:<Redis设计与实现 第二版>: 本篇笔记按照书里的脉络,将知识点分为四个部分.其中第一部分数据结构与对象分为上中下篇,上篇包括:SDS.链表和字典:中篇包括跳跃表.整数集合和压缩列表:下…
- 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis的键值对中,键必然是用字符串对象实现的,所以我们一般说的列表键,指的是字符串键+列表值. - 但是redis并没用这些数据结构直接实现redis的键值数据库,而是基于这些数据结构有一个对象系统,这个系统包括:字符串对象,列表对象,哈希对象,集合对象和有序集合对象,每一种对象都可能用到一到多种基本的数…
1.前言 此系列博客记录redis设计与实现一书的笔记,提取书本中的知识点,省略相关说明,方便查阅. 2.基本数据结构 2.1 简单动态字符串SDS(simple dynamic string) 结构体定义: len:  buf数组中已使用字节的数量,使用len判断实际内容长度,而不是'\0'字符 free: 未使用字节的数量,查询该值,杜绝内存溢出 buf[]: 实际分配空间及存储内容(字节数组,保证二进制安全,怎么存怎么取) 保留C语言的习惯,字符串以'\0'结束,好处在于可以兼容使用C的A…
目前为止,我们介绍了 redis 中非常典型的五种数据结构,从 SDS 到 压缩列表,这都是 redis 最底层.最常用的数据结构,相信你也掌握的不错. 但 redis 实际存储键值对的时候,是基于对象这个基本单位的,并且往往一个对象下面对对应不同的底层数据结构实现以便于在不同的场景下切换底层实现提升效率.例如列表对象在元素不多情况话会使用压缩列表来实现以压缩内存,而在元素比较多的时候常规的双端链表进行实现. 下面我们就具体来看看 redis 中都有哪些对象,底层又对应哪些可供选择的数据结构.…
---恢复内容开始--- 1,为什么要使用非关系型数据库,关系型数据库咋滴,不能用嘛? 存在即合理,非关系型数据库的出现,那说明关系型数据库不适用了. 非关系型数据库(NOSQL)-->Not only SQL,不仅是SQL. 2.关系型数据库遇到的问题, 社交网络飞速发展,难以应付每秒上万次的高并发数据库写入. 查询上亿量数据的速度极其缓慢 分库,分表形成的子库达到一定规模后难以进一步扩展 分库,分表的规则可能因为需求变更而发生变更 修改表结构困难. 以上都是关系型数据遇到的困难. 所以非关系…
Cygwin工具编译Redis Redis6.x版本是未编译版本(官方很调皮,所以没办法,咱只好帮他们编译一下了),所以咱们先下载一个Cygwin,用它来对Redis进行编译. Cygwin下载地址: https://cygwin.com/setup-x86_64.exe 下面是安装Cywin的一些注意事项说明: 1.前面可以自己默认或者自由选择,到达下图所示内容以后,添加阿里云镜像.不然可能会下载失败. 阿里云镜像地址: http://mirrors.aliyun.com/cygwin/ 2.…
下面是跳跃表的基本原理,REDIS的实现大致相同 跳跃表的一个特点是,插入NODE是通过随机的方式来决定level的,比较奇特 下面是skipList的一个介绍,转载来的,源地址:http://kenby.iteye.com/blog/1187303,为防止源地址丢失,故拷贝一份放在这里,望作者原谅. ———————————————转载开始————————————————— 为什么选择跳表 目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等. 想象一下,给…
一 类型检查和多态    类型检查,即有的命令是只针对特定类型的,如果类型不对,就会报错,此处的类型,是指的键类型,即robj.type.下面为有类型检查的命令: 对于某一种类型,redis下底层的实现(编码类型 robj.encoding)可以是不同的,比如字符串键可以是ziplist或者linklist,那么可以想象,redis需要支持对命令的多态,无论编码类型是什么,都能得到正确的结果,  二 内存回收: robj.refcount用于内存回收,创建新的robj时,refcount为1,对…
三 字典 字典是Hash对象的底层实现,比如用HSET创建一个HASH的对象,底层可能就是用一个字典实现的键值对. 字典的实现主要设计下面三个结构: /* * 哈希表节点 */ typedef struct dictEntry { // 键 void *key; // 值 union { void *val; uint64_t u64; int64_t s64; } v; // 指向下个哈希表节点,形成链表 struct dictEntry *next; } dictEntry; /* * 哈希…
本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值对(key-value)中的值(value),键的数据类型主要是字符串. 1. 简单动态字符串: redis没有使用C的字符串,而是自己定义了数据结构来实现字符串,主要实现在sds.h和sds.c里,主要结构是下面的sdshdr. struct sdshdr { // buf 中已占用空间的长度 int le…