redis
文章平均质量分 72
蜀沐
这个作者很懒,什么都没留下…
展开
-
Redis 源码学习之快速列表 quicklist
应用Redis中是采用sdlist和ziplist来实现quicklist的,其中sdlist充当map中控器的作用,ziplist充当占用连续内存空间数组的作用。quicklist本身是一个双向无环链表,它的每一个节点都是一个ziplist。为什么这么设计呢?双向链表在插入节点上复杂度很低,但它的内存开销很大,每个节点的地址不连续,容易产生内存碎片。ziplist是存储在一段连续的内存上,存储效率高,但是它不利于修改操作,插入和删除数都很麻烦,复杂度高,而且其需要频繁的申请释放内存,特别是zipl原创 2021-09-13 16:11:49 · 200 阅读 · 0 评论 -
Redis 源码学习之 字符串 t_string
字符串概述字符串是Redis中最为常见的数据存储类型,其底层实现是简单动态字符串sds,因此,该字符串类型是二进制安全的,这就意味着它可以接受任何格式的数据。另外,Redis规定,字符串类型最多可以容纳的数据长度为512M提供了检测函数,来检测字符串键的大小/* * 检查给定字符串长度 len 是否超过限制值 512 MB * * 超过返回 REDIS_ERR ,未超过返回 REDIS_OK * * T = O(1) */static int checkStringLength(clie原创 2021-09-11 22:00:13 · 190 阅读 · 0 评论 -
Redis 源码学习之 对象
对象使用使用对象一个好处是:我们可以针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率对象系统还实现了基于引用计数技术的内存回收机制Redis 通过引用计数技术实现对象共享机制Redis 的对象带有访问时间记录信息Redis 使用对象来表示数据库中的键和值RedisObject数据结构typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsign原创 2021-09-10 22:42:57 · 201 阅读 · 0 评论 -
Redis 源码学习之压缩列表
应用压缩列表(ziplist)是由 一系列特殊编码的内存块构成的列表,其是Redis的列表建和哈希键的底层实现之一ziplist可以用来存放字符串或者整数,其存储数据的特点是:比较小的整数或比较短的字符串。Redis的列表建,哈希键,有序集合的底层实现都用到了ziplist压缩列表是为了节约内存而开发的Ziplist 是为了尽可能地节约内存而设计的特殊编码双端链表Ziplist 允许在列表的两端进行 O(1) 复杂度的 push 和 pop 操作数据结构Redis的ziplist结构由三大原创 2021-09-10 22:02:22 · 170 阅读 · 2 评论 -
Redis源码学习之 整数集合
intset应用Redis在这种小数据量的条件下,会使用内存映射来代替内部数据结构。这就使得整数集合(intset)和压缩(ziplist)这两类节省内存的数据结构应运而生了整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis 就会使用整数集合作为集合键的底层实现整数集合的底层实现为数组,这个数组有序、无重复的方式保存集合元素,在有需要时,程序会根据新添元素的类型,改变这个数组的类型整数集合只支持升级操作,不支持降级操作intset的数据结构如原创 2021-09-10 20:58:59 · 83 阅读 · 0 评论 -
Redis 源码学习之跳跃表
跳跃表的应用跳跃表的性质;(1) 由很多层结构组成;(2)每一层都是一个有序的链表,排列顺序为由高层到底层,都至少包含两个链表节点,分别是前面的head节点和后面的nil节点;(4) 最底层的链表包含了所有的元素;(5) 如果一个元素出现在某一层的链表中,那么在该层之下的链表也全都会出现(上一层的元素是当前层的元素的子集);(6) 链表中的每个节点都包含两个指针,一个指向同一层的下一个链表节点,另一个指向下一层的同一个链表节点;跳跃表是一种有序的数据结构,它通过在每个节点中维持多个指向其他节原创 2021-09-10 17:57:05 · 76 阅读 · 0 评论 -
redis 源码学习 之 字典dict
字典应用Redis的数据库就是使用字典作为底层实现的,对数据库的增、删、查、改都是建立在对字典的操作上。此外,字典还是Redis中哈希键的底层实现,当一个哈希键包含的键值对比较多,或者键值对中的元素都是比较长的字符串时,Redis就会使用字典作为哈希键的底层实现Redis中的字典采用哈希表作为底层实现dict数据结构实现了一个内存哈希表, 它支持插入、删除、替换、查找和获取随机元素等操作。哈希表会自动在表的大小的二次方之间进行调整。 键的冲突通过链表来解决1、哈希表节点(dictEntry)字典原创 2021-09-09 11:24:41 · 161 阅读 · 0 评论 -
redis 源码学习之双端链表sdlist
sdlist主要作用主要用在实现列表键、事务模块保存输入命令和服务器模块,订阅模块保存多个客户端等sdlist的数据结构Redis为双端链表的每一个节点定义了如下的结构体// 链表节点定义typedef struct listNode { struct listNode *prev; // 指向前一个节点 struct listNode *next; // 指向后一个节点 void *value; // 节点值} listNode;双端链表的迭代器的定义:单向迭原创 2021-09-08 21:45:07 · 115 阅读 · 0 评论 -
redis 源码学习之动态字符串
字符串数据结构总结Redis没有使用C语言的字符串结构,而是自己设计了一个简单的动态字符串结构sds。它的特点是:可动态扩展内存、二进制安全和与传统的C语言字符串类型兼容sds数据结构定义Redis 专门设计了 SDS 数据结构,在字符数组的基础上,增加了字符数组长度和分配空间大小等元数据typedef char *sds;struct sds{int free; //保存未使用的长度空间int len; //保存已经分配的长度空间,不包括’\0’,}struct sdshdr{原创 2021-09-08 20:42:48 · 94 阅读 · 0 评论 -
redis源码学习之分配内存
1、redis 总体概况Redis在内存分配方面,仅仅是对系统的malloc/free做了一层简单的封装,然后加上了异常处理功能和内存统计功能。其实现主要在zmalloc.c和zmalloc.h文件中2、功能函数void *zmalloc(size_t size); // 调用zmalloc函数,申请size大小的空间void *zcalloc(size_t size); // 调用系统函数calloc申请内存空间void *zrealloc(void *ptr, size_t size); //原创 2021-09-08 15:20:11 · 318 阅读 · 0 评论