![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis设计与实现
文章平均质量分 79
《Redis设计与实现》对Redis的大多数单机功能以及所有多机功能的实现原理进行了介绍,展示了这些功能的核心数据结构以及关键的算法思想。通过阅读本书,读者可以快速、有效地了解Redis的内部构造以及运作机制,这些知识可以帮助读者更好、更高效地使用Redis。
优惠券已抵扣
余额抵扣
还需支付
¥40.00
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
jxgy01
这个作者很懒,什么都没留下…
展开
-
《Redis设计与实现》前言
前言 时间回到2011年4月,当时我正在编写一个用户关系模块,这个模块需要实现一个“共同关注”功能,用于计算出两个用户关注了哪些相同的用户。 举个例子,假设huangz关注了peter、tom、jack三个用户,而john关注了peter、tom、bob、david四个用户,那么当huangz访问john的页面时,共同关注功能就会计算并打印出类似“你跟john都关注了peter和tom”这样的...原创 2021-07-07 16:41:37 · 99 阅读 · 0 评论 -
《Redis设计与实现》致谢
致谢 我要感谢hoterran和iammutex这两位良师益友,他们对我的帮助和支持贯穿整本书从概念萌芽到正式出版的整个阶段,也感谢他们抽出宝贵的时间为本书审稿。 我要感谢吴怡编辑鼓励我创作并出版这本新版《Redis设计与实现》,以及她在写作过程中对我的悉心指导。 我要感谢TimYang在百忙之中抽空为本书审稿,并耐心地给出了详细的意见。 我要感谢Redis之父Salvatore Sanf...原创 2021-07-07 16:41:35 · 94 阅读 · 0 评论 -
《Redis设计与实现》第1章 引言
第1章 引言 本书对Redis的大多数单机功能以及所有多机功能的实现原理进行了介绍,力图展示这些功能的核心数据结构以及关键的算法思想。 通过阅读本书,读者可以快速、有效地了解Redis的内部构造以及运作机制,这些知识可以帮助读者更好地、也更高效地使用Redis。 为了让本书的内容保持简单并且容易读懂,本书会尽量以高层次的角度来对Redis的实现原理进行描述,如果读者只是对Redis的实现原理...原创 2021-07-07 16:41:33 · 91 阅读 · 0 评论 -
《Redis设计与实现》第一部分 数据结构与对象
第一部分 数据结构与对象 第2章 简单动态字符串 第3章 链表 第4章 字典 第5章 跳跃表 第6章 整数集合 第7章 压缩列表 第8章 对象原创 2021-07-07 16:41:26 · 89 阅读 · 0 评论 -
《Redis设计与实现》第2章 简单动态字符串
第2章 简单动态字符串 Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。 在Redis里面,C字符串只会作为字符串字面量(string literal)用在一些无须对字符串值进行修改的地方,比如打印日志: ...原创 2021-07-07 16:41:25 · 76 阅读 · 0 评论 -
《Redis设计与实现》第3章 链表
第3章 链表 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用的C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现。 链表在Redis中的应用非常广泛,比如列表键的底层实现之一就是链表。当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较...原创 2021-07-07 16:41:17 · 75 阅读 · 0 评论 -
《Redis设计与实现》第4章 字典
第4章 字典 字典,又称为符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构。 在字典中,一个键(key)可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就称为键值对。 字典中的每个键都是独一无二的,程序可以在字典中根据键查找与之关联的值,或者通过键来...原创 2021-07-07 16:41:12 · 88 阅读 · 0 评论 -
《Redis设计与实现》第5章 跳跃表
第5章 跳跃表 跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。 跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。 在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树要来得更为简单,所以有不少程序都使用跳跃表来代替平衡树。 Redis使用跳跃表作...原创 2021-07-07 16:41:03 · 81 阅读 · 0 评论 -
《Redis设计与实现》第6章 整数集合
第6章 整数集合 整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。 举个例子,如果我们创建一个只包含五个元素的集合键,并且集合中的所有元素都是整数值,那么这个集合键的底层实现就会是整数集合: redis> SADD numbers 1 3 5 7 9 (integer) 5...原创 2021-07-07 16:40:59 · 87 阅读 · 0 评论 -
《Redis设计与实现》第7章 压缩列表
第7章 压缩列表 压缩列表(ziplist)是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。 例如,执行以下命令将创建一个压缩列表实现的列表键: redis> RPUSH lst 1 3 5 10086 "hello" "world" (integer)...原创 2021-07-07 16:40:52 · 74 阅读 · 0 评论 -
《Redis设计与实现》第8章 对象
第8章 对象 在前面的数个章节里,我们陆续介绍了Redis用到的所有主要数据结构,比如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合等等。 Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构。 通过这五...原创 2021-07-07 16:40:46 · 69 阅读 · 0 评论 -
《Redis设计与实现》第二部分 单机数据库的实现
第二部分 单机数据库的实现 第9章 数据库 第10章 RDB持久化 第11章 AOF持久化 第12章 事件 第13章 客户端 第14章 服务器原创 2021-07-07 16:40:30 · 84 阅读 · 0 评论 -
《Redis设计与实现》第9章 数据库
第9章 数据库 本章将对Redis服务器的数据库实现进行详细介绍,说明服务器保存数据库的方法,客户端切换数据库的方法,数据库保存键值对的方法,以及针对数据库的添加、删除、查看、更新操作的实现方法等。除此之外,本章还会说明服务器保存键的过期时间的方法,以及服务器自动删除过期键的方法。最后,本章还会说明Redis 2.8新引入的数据库通知功能的实现方法。...原创 2021-07-07 16:40:30 · 74 阅读 · 0 评论 -
《Redis设计与实现》第10章 RDB持久化
第10章 RDB持久化 Redis是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及它们的键值对统称为数据库状态。 举个例子,图10-1展示了一个包含三个非空数据库的Redis服务器,这三个数据库以及数据库中的键值对就是该服务器的数据库状态。 图10-1 数据库状态示例 因为Redi...原创 2021-07-07 16:40:17 · 68 阅读 · 0 评论 -
《Redis设计与实现》第11章 AOF持久化
第11章 AOF持久化 除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的,如图11-1所示。 图11-1 AOF持久化 举个例子,如果我们对空白的数据库执行以下写命令,那么数据库中将包含三个键值对: ...原创 2021-07-07 16:40:07 · 67 阅读 · 0 评论 -
《Redis设计与实现》第12章 事件
第12章 事件 Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: ·文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端(或者其他服务器)的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。 ·时间事件(time event):Redi...原创 2021-07-07 16:40:02 · 66 阅读 · 0 评论 -
《Redis设计与实现》第13章 客户端
第13章 客户端 Redis服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复。 通过使用由I/O多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。 对于每个与服务器进行连接的客户端,服务器都为这些客户端建...原创 2021-07-07 16:39:56 · 74 阅读 · 0 评论 -
《Redis设计与实现》第14章 服务器
第14章 服务器 Redis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。 本章的第一节将以服务器执行SET命令的过程作为例子,展示服务器处理命令请求的整个过程,说明在执行命令的过程中,服务器和客户端进行了什么交互,服务器中的各个不同组件又是如何协作的,等等。 本章的第二节将对serverCron...原创 2021-07-07 16:39:52 · 60 阅读 · 0 评论 -
《Redis设计与实现》第三部分 多机数据库的实现
第三部分 多机数据库的实现 第15章 复制 第16章 Sentinel 第17章 集群原创 2021-07-07 16:39:47 · 57 阅读 · 0 评论 -
《Redis设计与实现》第15章 复制
第15章 复制 在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),如图15-1所示。 图15-1 主服务器和从服务器 假设现在有两个Redis服务器,地址分别为127.0.0.1:6379和1...原创 2021-07-07 16:39:46 · 58 阅读 · 0 评论 -
《Redis设计与实现》第16章 Sentinel
第16章 Sentinel Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替...原创 2021-07-07 16:39:37 · 77 阅读 · 0 评论 -
《Redis设计与实现》第17章 集群
第17章 集群 Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。 本节将对集群的节点、槽指派、命令执行、重新分片、转向、故障转移、消息等各个方面进行介绍。...原创 2021-07-07 16:39:27 · 129 阅读 · 0 评论 -
《Redis设计与实现》第四部分 独立功能的实现
第四部分 独立功能的实现 第18章 发布与订阅 第19章 事务 第20章 Lua脚本 第21章 排序 第22章 二进制位数组 第23章 慢查询日志 第24章 监视器...原创 2021-07-07 16:39:18 · 60 阅读 · 0 评论 -
《Redis设计与实现》第18章 发布与订阅
第18章 发布与订阅 Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。 通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者(subscriber):每当有其他客户端向被订阅的频道发送消息(message)时,频道的所有订阅者都会收到这条消息。 举个例子,假设A、B、C三个客户端都执行了命令: SUBS...原创 2021-07-07 16:39:18 · 82 阅读 · 0 评论 -
《Redis设计与实现》第19章 事务
第19章 事务 Redis通过MULTI、EXEC、WATCH等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。 以下是一个事务执行的过程,该事务首先以一个MULTI命令为开始,接着将多...原创 2021-07-07 16:39:13 · 59 阅读 · 0 评论 -
《Redis设计与实现》第20章 Lua脚本
第20章 Lua脚本 Redis从2.6版本开始引入对Lua脚本的支持,通过在服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务器端原子地执行多个Redis命令。 其中,使用EVAL命令可以直接对输入的脚本进行求值: redis> EVAL "return 'hello world'" 0 "hello world" 而使用EVALSHA命令则可以根...原创 2021-07-07 16:39:09 · 70 阅读 · 0 评论 -
《Redis设计与实现》第21章 排序
第21章 排序 Redis的SORT命令可以对列表键、集合键或者有序集合键的值进行排序。 以下代码展示了SORT命令对列表键进行排序的例子: redis> RPUSH numbers 5 3 1 4 2 (integer) 5 # 按插入顺序排列的列表元素 redis> LRANGE numbers 0 -1 1) "5" 2) "3" 3) "1" 4)...原创 2021-07-07 16:39:01 · 71 阅读 · 0 评论 -
《Redis设计与实现》第22章 二进制位数组
第22章 二进制位数组 Redis提供了SETBIT、GETBIT、BITCOUNT、BITOP四个命令用于处理二进制位数组(bit array,又称“位数组”)。 其中,SETBIT命令用于为位数组指定偏移量上的二进制位设置值,位数组的偏移量从0开始计数,而二进制位的值则可以是0或者1: redis> SETBIT bit 0 1 # 0000 0001 (integer...原创 2021-07-07 16:38:54 · 115 阅读 · 0 评论 -
《Redis设计与实现》第23章 慢查询日志
第23章 慢查询日志 Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监视和优化查询速度。 服务器配置有两个和慢查询日志相关的选项: ·slowlog-log-slower-than选项指定执行时间超过多少微秒(1秒等于1 000 000微秒)的命令请求会被记录到日志上。 举个例子,如果这个选项的值为100,那么执行时间超过100微秒的命令...原创 2021-07-07 16:38:50 · 77 阅读 · 0 评论 -
《Redis设计与实现》第24章 监视器
第24章 监视器 通过执行MONITOR命令,客户端可以将自己变为一个监视器,实时地接收并打印出服务器当前处理的命令请求的相关信息: redis> MONITOR OK 1378822099.421623 [0 127.0.0.1:56604] "PING" 1378822105.089572 [0 127.0.0.1:56604] "SET" "msg" "hello wo...原创 2021-07-07 16:38:48 · 56 阅读 · 0 评论