typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[]; } intset; 整数集合的实现结构如上,主要用来用作集合对象的实现,其中encoding type包含INT16,INT32,INT64三种选择,所有的整数都在contents[]里按照从小到大有序存储. 整数集合有一个升级的概念,主要目的是为了保证数组里的每个整数的类型一…
本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值对(key-value)中的值(value),键的数据类型主要是字符串. 1. 简单动态字符串: redis没有使用C的字符串,而是自己定义了数据结构来实现字符串,主要实现在sds.h和sds.c里,主要结构是下面的sdshdr. struct sdshdr { // buf 中已占用空间的长度 int le…
- 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis的键值对中,键必然是用字符串对象实现的,所以我们一般说的列表键,指的是字符串键+列表值. - 但是redis并没用这些数据结构直接实现redis的键值数据库,而是基于这些数据结构有一个对象系统,这个系统包括:字符串对象,列表对象,哈希对象,集合对象和有序集合对象,每一种对象都可能用到一到多种基本的数…
下面是跳跃表的基本原理,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; /* * 哈希…
压缩列表是为了节省内存而设计的,是列表键和哈希键的底层实现之一. 压缩列表的逻辑如下,…
二 链表 1.链表节点使用ListNode结构,是一个双向的链表,同时,还实现了一个控制所有ListNode的结构list: typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value; } listNode; typedef struct list { // 表头节点 listNode *head; // 表尾节点 listNode *ta…
整数集合 Redis 中当一个集合(set)中只包含整数,并且元素不多时,底层使用整数集合实现,否则使用字典实现. 那么: 为什么会出现整数集合呢?都使用字典存储不行吗? 整数集合在 Redis 中的结构是怎样的呢? 引入整数集合之后,会不会出现什么弊端?Redis 又是如何去解决的呢? 为什么会出现整数集合呢?都使用字典存储不行吗? 说起无序集合(set),很自然的就想起哈希表,而哈希表表现也很好,提供了查询为 O(1) 的时间复杂度.但任何事物有优点,就必然会伴随着一些缺点,哈希表的缺点就是…
1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name(key)和liushijie(key)就存储在SDS中. SDS数据结构如下: struct sdshdr { // 所保存字符串的长度 int len; // 未使用字节长度 int free; // 字节数组,保存字符串 char buf[]; }; SDS遵循C字符串以'\0'空字符串结尾的惯例,所…