![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis
木棉上的光
公众号:不止于Java
Github:https://github.com/cyxpdc?tab=repositories
邮箱:1142439493@qq.com
展开
-
《Redis设计与实现》第十一章总结:AOF
3 AOF持久化RDB通过保存键值对,AOF通过保存服务器所执行的写命令来记录数据库状态保存格式:以Redis的命令请求协议格式,自动添加SELECT命令例子:SET、SADD、RPUSH3.1 AOF持久化的实现可以分为三个步骤:命令追加、文件写入、文件同步3.1.1 命令追加打开AOF,则服务器将被执行的写命令以协议格式追加到服务器状态的aof_buf缓冲区的末尾3.1.2...原创 2019-07-08 11:00:33 · 899 阅读 · 0 评论 -
《Redis设计与实现》第七章总结:压缩列表
6.压缩列表(ziplist)列表键底层实现之一:当一个列表键只包含少量列表项,且每个列表项要么是小整数值,要么是长度比较短的字符串时,就使用压缩列表哈希键底层实现之一:当一个哈希键只包含少量键值对,且每个键值对的键、值要么是小整数值,要么是长度比较短的字符串时,就使用压缩列表目的:节约内存使用 OBJECT ENCODING 键 可查看所用的底层数据结构6.1压缩列表的构成由一系...原创 2019-06-30 17:39:02 · 183 阅读 · 0 评论 -
《Redis设计与实现》第十三章总结一:客户端概述及其属性
5 客户端结构:redis.h/redisClient,保存了客户端的状态信息以及数据结构redisServer的clients属性为链表,保存了所有与服务器连接的客户端的状态结构:5.1 客户端属性分为两类:通用、特定功能,CLIENT list可以列出目前所有连接到服务器的客户端接下来介绍通用属性5.1.1 socket描述符int fd;//记录了客户端正在使用的sock...原创 2019-07-11 11:38:22 · 140 阅读 · 0 评论 -
《Redis设计与实现》第十三章总结二:客户端创建与关闭
继《Redis设计与实现》第十三章总结一:客户端概述及其属性5.2 客户端的创建与关闭5.2.1 创建普通客户端通过网络连接,则为普通客户端,使用connect函数进行连接例子,已有c1、c2,新添加c35.2.2 关闭普通客户端关闭原因:5.2.3 Lua脚本的伪客户端服务器初始化时创建负责执行Lua脚本中包含的Redis命令的伪客户端,关联属性伪redisClient lu...原创 2019-07-11 11:40:10 · 152 阅读 · 0 评论 -
《Redis设计与实现》第十九章总结:事务
19 事务通过MULTI(开始事务)、EXEC(事务提交)、WATCH等命令来实现事务功能,可以将多个命令请求打包,一次性、按顺序执行,且不断被中断例子:19.1 事务的实现一个事务从开始到结束会经历三个阶段:1.事务开始2.命令入队3.事务执行19.1.1 第一阶段:事务开始MULTI命令标志着事务的开始,将客户端从非事务状态切换为事务状态,通过在客户端状态(redisCli...原创 2019-07-18 10:04:47 · 210 阅读 · 0 评论 -
《Redis设计与实现》第十章总结一:RDB原理
2 RDB持久化服务器的数据库状态:服务器中的非空数据库以及它们的键值对例子:包含三个非空数据库的Redis服务器,这三个数据库以及它们的键值对就是该服务器的数据库状态:RDB:在某个时间点上将数据库状态保存到一个RDB文件上,也可以将RDB文件还原为数据库状态注:因为AOF文件的更新频率通常比RDB高,所以服务器如果开启了AOF持久化功能,则优先使用AOF文件来还原数据库状态2.1 ...原创 2019-07-06 21:47:31 · 262 阅读 · 0 评论 -
《Redis设计与实现》第十章总结二:RDB文件结构
继《Redis设计与实现》第十章总结一:RDB原理2.3 RDB文件结构完整的RDB文件结构:全大写代表常量,全小写代表变量和数据2.3.1 各部分概述REDIS作用:RDB文件标识符。通过这五个字符,程序可以在载入文件时,快速检查所载入的文件是否为RDB文件长度:5字节,保存REDIS这五个字符db_version作用:RDB文件的版本号。如0006代表第六版,为此次...原创 2019-07-06 21:52:38 · 422 阅读 · 0 评论 -
《Redis设计与实现》第二十章总结一:Lua脚本之总述
20 Lua脚本作用:通过在服务器嵌入Lua环境,客户端可以使用Lua脚本,直接在服务器端原子性地执行多个Redis命令EVAL:可以直接对输入的脚本进行求值EVALSHA:可以根据脚本的SHA1校验和来对脚本进行求职;要求校验和对应的脚本至少被EVAL执行过一次或曾被SCRIPT LOAD 命令载入过20.1 创建并修改Lua环境过程:8步接下来逐一介绍这些步骤20.1.1...原创 2019-07-18 15:43:13 · 282 阅读 · 0 评论 -
《Redis设计与实现》第二十章总结二:Lua脚本之命令实现
继《Redis设计与实现》第二十章总结一:Lua脚本之总述20.3 EVAL命令的实现EVAL命令的执行分为三个步骤:接下来详细介绍三个步骤,以EVAL “return ‘hello world’” 0为例20.3.1 定义脚本函数为传入的脚本定义一个与这个脚本相对应的Lua函数函数名字由f_前缀加上脚本的SHA1校验和组成,函数体则是脚本本身例子:使用函数来保存脚本的好处:...原创 2019-07-18 15:44:15 · 189 阅读 · 0 评论 -
《Redis设计与实现》第十七章总结一:集群之节点和槽
17 集群Redis集群是Redis提供的分布式数据库方案,通过分片(sharding)来进行数据共享,并提供复制和故障转移功能集群可以有一或多个节点17.1 集群节点客户端使用CLUSTER MEET < ip > < port >命令连接各个节点客户端发送此命令发送的事情:例子:如有三个节点127.0.0.1:7000、127.0.0.1:7001、、12...原创 2019-07-16 19:03:18 · 526 阅读 · 0 评论 -
《Redis设计与实现》第十七章总结二:集群之运转
17.3 在集群中执行命令16384个槽全部进行了指派之后,集群进入上线状态,此时客户端就可以向集群中的节点发送数据命令了当客户端向节点发送与数据库键有关的命令时:17.3.1 计算键属于哪个槽计算给定键key属于哪个槽的算法:CLUSTER KEYSLOT 可以查看给定键属于哪个槽,其实现为:17.3.2 判断槽是否由当前节点负责处理clusterState.slots中的项...原创 2019-07-16 19:13:58 · 250 阅读 · 0 评论 -
《Redis设计与实现》第十七章总结三:集群之善后
继《Redis设计与实现》第十七章总结二:集群之运转17.6 复制与故障处理集群中节点分为主节点和从节点,主节点为之前讲解的处理槽的节点,从节点则用于复制某个主节点,确保在被复制的主节点下线时,能代替下线节点继续处理命令请求,达到高可用的目的每个主节点可以有多个从节点,当某个从节点被选中为新的主节点时,其他从节点会从原来的复制节点改为复制新的主节点;原先的主节点重新上线后,会成为新的主节点的...原创 2019-07-16 19:16:20 · 218 阅读 · 0 评论 -
《Redis设计与实现》第二十一章总结一:排序的选项实现一
21 排序SORT命令可以对列表键、集合键或有序集合键的值进行排序核心思想:按照某个属性,对数组进行排序21.1 SORT < key >命令的实现SORT命令的最简单形式:SORT < key >,可以对一个包含数字值的键key进行排序以RPUSH numbers 3 1 2;SORT numbers为例讲解实现原理:redisSortObject结构:...原创 2019-07-19 16:38:10 · 196 阅读 · 0 评论 -
《Redis设计与实现》第二十一章总结二:排序的选项实现二
继《Redis设计与实现》第二十一章总结一:排序的选项实现一21.6 LIMIT选项的实现LIMIT < offser > < count >:返回其中一部分已排序的元素而不是全部元素:以集合键为例讲解实现原理:21.7 GET选项的实现默认情况下,SORT返回被排序键本身的元素:加上GET选项,可以在对键进行排序之后,根据被排序的元素以及GET选项指定...原创 2019-07-19 16:38:56 · 174 阅读 · 0 评论 -
《Redis设计与实现》第十八章总结:发布与订阅
18 发布与订阅此功能由PUBLISH(向某频道发送)、SUBSCRIBE(订阅频道)、PSUBSCRIBE等命令组成SUBSCRIBE和PUBLISH:SUBSCRIBE和PUBLISH例子:A、B、C三个客户端订阅了news.it频道:SUBSCRIBE “news.it”某个客户端执行命令:PUBLISH “news.it” “hello”则A、B、C都将收到“hello”这条...原创 2019-07-17 15:24:52 · 214 阅读 · 0 评论 -
《Redis设计与实现》第二十二章总结:二进制位数组
22 二进制位数组22.1 位数组的表示使用SDS来保存位数组例子:一字节长的位数组每个字节使用一行来表示,所以改造如下:位是逆序保存的,10110010代表保存的位数组位01001101,即从左到右是低位到高位;其作用是可以简化SETBIT命令的实现22.2 GETBIT命令的实现GETBIT <bitarray> <offset>用于返回位数组b...原创 2019-07-21 16:05:54 · 295 阅读 · 0 评论 -
《Redis设计与实现》第二十三章总结:慢查询日志
23 慢查询日志此功能用于记录执行时间超过给定时长的命令请求,用来监视和优化查询速度相关选项:使用先进先出的方式保存多条慢查询日志,当数量超过slowlog-max-len时,如果再添加新的日志,则将最旧的日志删除日志格式:23.1 慢查询记录的保存redisServer包含了几个和慢查询日志功能相关的属性:slowlog_entry_id:slowLogEntry:2...原创 2019-07-23 09:29:49 · 151 阅读 · 0 评论 -
《Redis设计与实现》第六章总结:整数集合
5.整数集合(intset)集合键的底层实现之一:当一个集合只包含整数值元素,且数量不多时,如5个5.1 整数集合的实现用于保存整数值的集合抽象数据结构,且保证集合中不会出现重复元素,类型可以为int16_t、int32_t、itn64_t,且按照从小到大排序intset.h/intset:可以看到,其底层实现为数组而contents数组实际上保存的值不是int8_t,而是取决于en...原创 2019-06-30 15:33:29 · 177 阅读 · 0 评论 -
《Redis设计与实现》第十六章总结二:Sentinel与服务器的交互
继《Redis设计与实现》第十六章总结一:Sentinel状态封装16.4 向主从服务器分别发送信息Sentinel默认以每两秒一次的频率,通过命令连接向所有被监视的主服务器和从服务器发送以下格式的命令:此命令向服务器的_sentinel _:hello频道发送一条消息,消息的内容由多个参数组成:以 _s开头的参数记录的是Sentinel本身的信息,参数意义如下图:以m_开头的参数记...原创 2019-07-14 18:47:00 · 244 阅读 · 0 评论 -
《Redis设计与实现》第八章总结一:对象
7.对象基于六种数据结构(SDS、双端链表、字典、跳表、整数集合、压缩列表)创建了一个对象系统,这个对象系统包含字符串对象,列表对象,哈希对象,集合对象和有序集合对象;每种对象都用到了至少一种数据结构使用对象的好处:1.可以在执行命令之前,根据对象的类型来判断是否可以执行该命令(类型字段作用)2.可以针对不同的使用场景,为对象设置多种不同的数据结构实现,优化对象在不同场景下的使用效率(...原创 2019-07-02 17:24:06 · 209 阅读 · 0 评论 -
《Redis设计与实现》第八章总结二:五种对象简述
继《Redis设计与实现》第八章总结一:对象7.2 字符串对象7.2.1 底层所使用的编码方式int、raw、embstrint:对应的数据结构为long类型的整数例子:set number 10086raw:对应的数据结构为简单动态字符串例子:set story “Long,long ago there lived a king …”embstr:对应的数据结构为emb...原创 2019-07-02 17:31:23 · 202 阅读 · 0 评论 -
《Redis设计与实现》第八章总结三:对象的一些必要操作
继《Redis设计与实现》第八章总结二:五种对象简述7.7 类型检查与命令多态7.7.1 出现的原因Redis中操作键的命令分两种:一种可以操作任何类型的键,一种只能操作特定类型的键操作任何类型键命令:DEL、EXPIRE、RENAME、TYPE、OBJECT操作特定类型键命令:7.7.2 类型检查的实现执行一个类型特定命令之前,Redis会先检查输入键的类型是否正确,然后再决定是...原创 2019-07-02 17:36:00 · 176 阅读 · 0 评论 -
《Redis设计与实现》第二章总结:简单动态字符串
1.简单动态字符串1.1关于C字符串Redis中的C字符串作为字符串字面量只用在一些无须对字符串值进行修改的地方,比如打印日志1.2 关于默认字符串表示SDS:1.2.1 表示可以被修改的字符串值例子如下图:1.2.2 用作缓冲区如AOF模块中的AOF缓冲区、客户端状态中的输入缓冲区1.2.3 SDS定义如上图为定义和两个示例,每个sds.h/sdshdr结构表示一个SDS值...原创 2019-06-27 19:40:35 · 379 阅读 · 0 评论 -
《Redis设计与实现》第三章总结:链表
2.链表C语言没有实现链表,因此Redis自己实现了一套列表(list)键的底层实现之一就是链表,当一个列表键包含了较多元素,或元素都是比较长的字符串,则会使用链表作为列表键的底层实现,如integers列表键,链表中的每个节点都保存了一个整数值发布与订阅、慢查询、监视器等也用到了链表2.1 实现链表节点(adlist.h/listNode)表示如图:由list(adlist.h/l...原创 2019-06-28 11:30:07 · 265 阅读 · 0 评论 -
《Redis设计与实现》第十四章总结一:服务器运行流程
6 服务器以命令SET KEY VALUE为例进行讲解6.1 命令请求的执行过程从客户端发送此命令到获取回复OK期间,客户端+服务端所执行的4个步骤:6.1.1 步骤1:发送命令请求流程:如命令SET KEY VALUE,转换为协议:#### 6.1.2 步骤2:读取命令请求1.读取socket中协议格式的命令请求,保存到客户端状态的输入缓冲区里面:2.对输入缓冲区中的命令...原创 2019-07-12 23:51:35 · 171 阅读 · 0 评论 -
《Redis设计与实现》第十四章总结二:serverCron函数解析
继《Redis设计与实现》第十四章总结一:服务器运行流程6.2 serverCron函数默认每隔100毫秒执行一次接下来对此函数执行的操作进行介绍,并介绍redisServer中和此函数相关的属性6.2.1 更新服务器时间缓存redisServer的unixtime、mstime:被用作当前时间的缓存,因为每次获取系统当前时间都需要执行一次系统调用,使用缓存可以减少系统调用的执行次数:...原创 2019-07-12 23:55:51 · 697 阅读 · 0 评论 -
《Redis设计与实现》第十四章总结三:服务器的初始化过程
继《Redis设计与实现》第十四章总结二:serverCron函数解析6.3 初始化服务器6.3.1 第一步:初始化服务器状态结构创建redisServer,并为属性设置默认值实现:redis.c/initServerConfig,其完成的主要工作为:步骤特点:6.3.2 第二步:载入配置选项,更新server状态根据配置的值来决定属性值:6.3.3 第三步:初始化服务器数据...原创 2019-07-12 23:57:55 · 170 阅读 · 0 评论 -
《Redis设计与实现》第四章总结:字典
3.字典用于保存键值对的抽象数据结构,即Java的mapC语言没有实现字典,因此Redis自己实现了一套Redis的数据库就是使用字典来作为底层实现的,crud操作也是构建在对字典的操作之上的例子:哈希键的底层实现之一也是字典,当一个哈希键包含的键值对比较多,或键值对中的元素都是比较长的字符串时,就是使用字典例子:website包含10086个键值对,键为数据库名,值为对应的主页网址...原创 2019-06-28 16:01:37 · 224 阅读 · 0 评论 -
《Redis设计与实现》第十五章总结一:新旧复制功能
三:多机数据库的实现目的:清楚Redis的Sentinel、复制(replication)、集群(cluster)的三个多机功能15 复制概念:通过执行SLAVEOF命令或设置slaveof选项,可以让一个服务器去复制另一个服务器主服务器:被复制的服务器从服务器:复制的服务器作用:进行复制中的主从服务器数据库状态一致(保存相同的数据);主服务器上执行的更新命令,从服务器会获得相同的结果...原创 2019-07-13 13:56:04 · 336 阅读 · 0 评论 -
《Redis设计与实现》第十五章总结二:复制的实现和心跳检测
继《Redis设计与实现》第十五章总结一:新旧复制功能15.6 复制的实现SLAVEOF 是一个异步命令以SLAVEOF 127.0.0.1 6379为例进行新复制版本的讲解15.6.1 步骤1:设置主服务器的地址和端口从服务器将客户端给定的主服务器的ip和端口保存到redisServer的char *masterhost和int masterport属性保存完毕之后,从服务器向客户端...原创 2019-07-13 13:58:40 · 373 阅读 · 0 评论 -
《Redis设计与实现》第九章总结一:数据库相关操作实现
二:单机数据库的实现目的:清楚Redis如何实现单机数据库1 数据库1.1 服务器保存数据库的方法redis.h/redisServer结构的db数组中,db数组的元素为redis.h/redisDb结构,每个redisDb结构代表一个数据库:服务器的初始化:程序会根据redisServer的dbnum属性来决定应该创建多少个数据库,dbnum属性的值由服务器配置的database选项...原创 2019-07-04 17:08:24 · 188 阅读 · 0 评论 -
《Redis设计与实现》第九章总结二:过期键相关操作
继《Redis设计与实现》第九章总结一:数据库相关操作实现1.6 服务器保存键的生存时间和过期时间的实现方法1.6.1 概述客户端使用EXPIRE或PEXPIRE命令可以以秒或毫秒精度为数据库的某个键设置生存时间(TTL);经过指定时间后,服务器会自动删除生存时间为0的键EXPIREAT或PEXPIREAT命令则以秒或毫秒精度为数据库的某个键设置过期时间(expire time),SET...原创 2019-07-04 17:13:49 · 223 阅读 · 0 评论 -
《Redis设计与实现》第十二章总结:事件
4 事件Redis服务器是一个事件驱动程序,需要处理两类事件,分别是文件事件和时间事件:4.1 文件事件文件事件处理器:基于Reactor模式的网络事件处理器4.1.1 文件事件处理器的构成socket、I/O多路复用程序、文件事件分派器、事件处理器:IO多路复用程序通过队列向文件事件分派器传送套接字,当上一个socket处理完毕之后,才能传送下一个socket;每一个处理器都是...原创 2019-07-10 11:38:44 · 215 阅读 · 0 评论 -
《Redis设计与实现》第五章总结:跳跃表
4.跳跃表有序集合键的底层实现之一:如果一个有序集合包含的元素数量比较多,或者有序集合中元素是比较长的字符串时,就使用跳表在集群节点中用作内部数据结构跳表在Redis中只有这两个用途4.1 跳表总览redis.h/zskiplistNode和redis.h/zskiplist两个结构定义,zskiplistNode表示跳表节点,zskiplist用于保存跳表节点的相关信息,如节点数量,头...原创 2019-06-29 17:22:49 · 387 阅读 · 0 评论 -
《Redis设计与实现》第十六章总结一:Sentinel状态封装
16 Sentinel(哨兵)作用:是Redis高可用解决方案。由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器并进行代替,处理命令请求;若下线服务器重新上线,则成为新的主服务器的从服务器完整的上下线例子:从上到下、从左到右16....原创 2019-07-14 18:39:25 · 267 阅读 · 0 评论 -
《Redis设计与实现》第二十四章总结:监视器
24 监视器客户端执行MONITOR命令可以将自己变为一个监视器,实时地接收并打印出服务器当前处理的命令请求的相关信息流程:24.1 成为监视器伪代码:例子:状态1:客户端10086发送MONITOR命令:24.2 向监视器发送命令信息服务器每次处理命令信息之前,会调用replicationFeedMonitors函数,将被处理的命令请求发送给所有监视器伪代码:例子...原创 2019-07-23 09:39:27 · 151 阅读 · 0 评论