
Redis
文章平均质量分 93
普通的石头人
爱上一场认真的消遣
展开
-
Redis与实现之SDS和链表
一、简单动态字符串1.1 SDS定义简单动态字符串(simple dunamic string,SDS)被用作Redis的默认字符串表示。从图中可以看出,sds的属性有三个:len、free和buf数组。这里len字段是用来保存sds字符串中所包含字符数目的,free字段则是用来保存buf数组中空余的部分的长度的,而buf数组则是实际用来保存字符串的。比如该结构保存了“Redis”这个字符串,sds和c字符串一样,需要在字符串结尾加上一个“\0”表示该字符串的结束。这里这个sds对象的len属性保了原创 2020-11-04 23:00:35 · 213 阅读 · 0 评论 -
Redis设计与实现之字典
字典1.1 定义字典,又称为符号表(Symbol table)、关联表(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构。在字典里面,一个键(key)可以和一个值(value)进行关联(将键映射为值)字典中的每个键都是独一无二的,程序可以在字典中根据键查找与之关联的值,或者通过键更新值,又或者根据键来删除整个键值对。Redis所使用的C语言里面没有内置这种数据结构,所以Redis构建了自己的字典实现。字典在Redis中的应用原创 2020-11-08 23:34:28 · 163 阅读 · 0 评论 -
Redis设计与实现之跳跃表
一、定义跳跃表(skiplist)是一种有序的数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的跳跃表支持平均O(logN), 最坏O(n) 复杂度的节点查找, 还可以通过顺序性操作来批量处理节点。Redis使用跳跃表作为有序集合键的底层实现之一,若一个有序集合包含的元素数量比较多,或者有序集合中的成员是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现。和链表、字典等数据结构被广泛地应用在Redis内部不同,Redis只在两个地方用到了跳跃表,原创 2020-11-15 23:07:10 · 184 阅读 · 0 评论 -
Redis设计与实现之整数集合
一、定义整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。举个例子,我们下面创建一个只包含五个元素的集合键,并且集合中所有元素都是整数值,那么这个集合键的底层实现就是整数集合。127.0.0.1:6379> SADD numbers 1 3 5 7 9(integer) 5127.0.0.1:6379> OBJECT ENCODING numbers"intset"127.0.0原创 2020-12-09 15:54:59 · 188 阅读 · 0 评论 -
Redis设计与实现之压缩列表
一、定义压缩列表是哈希键以及列表键的底层实现之一。当一个列表键只包含少量的列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。例如:执行以下命令将创建一个压缩列表实现的列表键:127.0.0.1:6379> RPUSH 1st 1 3 5 10086 "hi" "Zhang"(integer) 6127.0.0.1:6379> OBJECT ENCODING 1st"ziplist"127.0.0.1:6379&g原创 2020-12-11 11:53:19 · 299 阅读 · 0 评论 -
Redis设计与实现之对象
一、定义Redis用到的主要数据结构,包括简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合等等。Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统结构包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到至少一种我们前面所介绍的数据结构。通过这五种不同类型的对象,Redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。使用对象的另一个好处是,我们可以针对不同的使用场景,为对象原创 2020-12-16 11:58:55 · 195 阅读 · 0 评论 -
Redis设计与实现之数据库
本章将对Redis服务器的数据库实现进行详细介绍,说明服务器保存数据库的方法,数据库保存键值对的方法,以及针对数据库的增删改查的实现方法,服务器保存键的过期时间的方法,以及服务器自动删除过期键的方法,以及Redis2.8新引入的数据库通知功能的实现方法。1.1 服务器中的数据库Redis服务器将所有数据库都保存在服务器状态server.h/redisServer结构的db数组中,db数组的每个项都是一个server.h/redisDb结构,每个redisDb结构代表一个数据库:struct redis原创 2020-12-17 15:17:17 · 372 阅读 · 0 评论 -
Redis设计与实现之RDB持久化
Redis是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及它们的键值对统称为数据库状态。如下图展示一个包含三个非空数据库的Redis服务器,这三个数据库以及数据库中的键值对就是该服务器的数据库状态。因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。为了解决这个问题,Redis原创 2020-12-22 22:11:58 · 731 阅读 · 0 评论 -
Redis设计与实现之事件
Redis 服务器是一个事件驱动程序,服务器需要处理一下两类事件:文件事件(file event):Redis服务器通过套接字与客户端(或者其他Reids服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端(或者其他Reids服务器)的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列的网络通信操作。时间事件(time event):Redis 服务器中的一些操作(比如 serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。原创 2021-01-20 15:18:18 · 303 阅读 · 0 评论 -
Redis设计与实现之AOF持久化
除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。如下图所示:举个例子,如果我们对空白的数据库执行以下写命令,那么数据库中将包含三个键值对。redis>SET msg "hello"OKredis>SADD fruits "apple" "banana" "cherry"OKredis>RPUSH原创 2021-01-18 18:45:38 · 411 阅读 · 0 评论