Redis
木棉上的光
公众号:不止于Java
Github:https://github.com/cyxpdc?tab=repositories
邮箱:1142439493@qq.com
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
《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 · 623 阅读 · 0 评论 -
《Redis设计与实现》第七章总结:压缩列表
6.压缩列表(ziplist) 列表键底层实现之一:当一个列表键只包含少量列表项,且每个列表项要么是小整数值,要么是长度比较短的字符串时,就使用压缩列表 哈希键底层实现之一:当一个哈希键只包含少量键值对,且每个键值对的键、值要么是小整数值,要么是长度比较短的字符串时,就使用压缩列表 目的:节约内存 使用 OBJECT ENCODING 键 可查看所用的底层数据结构 6.1压缩列表的构成 由一系...原创 2019-06-30 17:39:02 · 259 阅读 · 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 · 237 阅读 · 0 评论 -
《Redis设计与实现》第十三章总结二:客户端创建与关闭
继《Redis设计与实现》第十三章总结一:客户端概述及其属性 5.2 客户端的创建与关闭 5.2.1 创建普通客户端 通过网络连接,则为普通客户端,使用connect函数进行连接 例子,已有c1、c2,新添加c3 5.2.2 关闭普通客户端 关闭原因: 5.2.3 Lua脚本的伪客户端 服务器初始化时创建负责执行Lua脚本中包含的Redis命令的伪客户端,关联属性伪redisClient lu...原创 2019-07-11 11:40:10 · 204 阅读 · 0 评论 -
《Redis设计与实现》第十九章总结:事务
19 事务 通过MULTI(开始事务)、EXEC(事务提交)、WATCH等命令来实现事务功能,可以将多个命令请求打包,一次性、按顺序执行,且不断被中断 例子: 19.1 事务的实现 一个事务从开始到结束会经历三个阶段: 1.事务开始 2.命令入队 3.事务执行 19.1.1 第一阶段:事务开始 MULTI命令标志着事务的开始,将客户端从非事务状态切换为事务状态,通过在客户端状态(redisCli...原创 2019-07-18 10:04:47 · 306 阅读 · 0 评论 -
《Redis设计与实现》第十章总结一:RDB原理
2 RDB持久化 服务器的数据库状态:服务器中的非空数据库以及它们的键值对 例子:包含三个非空数据库的Redis服务器,这三个数据库以及它们的键值对就是该服务器的数据库状态: RDB:在某个时间点上将数据库状态保存到一个RDB文件上,也可以将RDB文件还原为数据库状态 注:因为AOF文件的更新频率通常比RDB高,所以服务器如果开启了AOF持久化功能,则优先使用AOF文件来还原数据库状态 2.1 ...原创 2019-07-06 21:47:31 · 345 阅读 · 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 · 574 阅读 · 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 · 406 阅读 · 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 · 311 阅读 · 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 · 235 阅读 · 0 评论 -
《Redis设计与实现》第十七章总结二:集群之运转
17.3 在集群中执行命令 16384个槽全部进行了指派之后,集群进入上线状态,此时客户端就可以向集群中的节点发送数据命令了 当客户端向节点发送与数据库键有关的命令时: 17.3.1 计算键属于哪个槽 计算给定键key属于哪个槽的算法: CLUSTER KEYSLOT 可以查看给定键属于哪个槽,其实现为: 17.3.2 判断槽是否由当前节点负责处理 clusterState.slots中的项...原创 2019-07-16 19:13:58 · 330 阅读 · 0 评论 -
《Redis设计与实现》第十七章总结三:集群之善后
继《Redis设计与实现》第十七章总结二:集群之运转 17.6 复制与故障处理 集群中节点分为主节点和从节点,主节点为之前讲解的处理槽的节点,从节点则用于复制某个主节点,确保在被复制的主节点下线时,能代替下线节点继续处理命令请求,达到高可用的目的 每个主节点可以有多个从节点,当某个从节点被选中为新的主节点时,其他从节点会从原来的复制节点改为复制新的主节点;原先的主节点重新上线后,会成为新的主节点的...原创 2019-07-16 19:16:20 · 309 阅读 · 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 · 267 阅读 · 0 评论 -
《Redis设计与实现》第二十一章总结二:排序的选项实现二
继《Redis设计与实现》第二十一章总结一:排序的选项实现一 21.6 LIMIT选项的实现 LIMIT < offser > < count >:返回其中一部分已排序的元素而不是全部元素: 以集合键为例讲解实现原理: 21.7 GET选项的实现 默认情况下,SORT返回被排序键本身的元素: 加上GET选项,可以在对键进行排序之后,根据被排序的元素以及GET选项指定...原创 2019-07-19 16:38:56 · 258 阅读 · 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 · 284 阅读 · 0 评论 -
《Redis设计与实现》第二十二章总结:二进制位数组
22 二进制位数组 22.1 位数组的表示 使用SDS来保存位数组 例子:一字节长的位数组 每个字节使用一行来表示,所以改造如下: 位是逆序保存的,10110010代表保存的位数组位01001101,即从左到右是低位到高位; 其作用是可以简化SETBIT命令的实现 22.2 GETBIT命令的实现 GETBIT <bitarray> <offset> 用于返回位数组b...原创 2019-07-21 16:05:54 · 384 阅读 · 0 评论 -
《Redis设计与实现》第二十三章总结:慢查询日志
23 慢查询日志 此功能用于记录执行时间超过给定时长的命令请求,用来监视和优化查询速度 相关选项: 使用先进先出的方式保存多条慢查询日志,当数量超过slowlog-max-len时,如果再添加新的日志,则将最旧的日志删除 日志格式: 23.1 慢查询记录的保存 redisServer包含了几个和慢查询日志功能相关的属性: slowlog_entry_id: slowLogEntry: 2...原创 2019-07-23 09:29:49 · 227 阅读 · 0 评论 -
《Redis设计与实现》第二十四章总结:监视器
24 监视器 客户端执行MONITOR命令可以将自己变为一个监视器,实时地接收并打印出服务器当前处理的命令请求的相关信息 流程: 24.1 成为监视器 伪代码: 例子: 状态1: 客户端10086发送MONITOR命令: 24.2 向监视器发送命令信息 服务器每次处理命令信息之前,会调用replicationFeedMonitors函数,将被处理的命令请求发送给所有监视器 伪代码: 例子...原创 2019-07-23 09:39:27 · 210 阅读 · 0 评论 -
《Redis设计与实现》第四章总结:字典
3.字典 用于保存键值对的抽象数据结构,即Java的map C语言没有实现字典,因此Redis自己实现了一套 Redis的数据库就是使用字典来作为底层实现的,crud操作也是构建在对字典的操作之上的 例子: 哈希键的底层实现之一也是字典,当一个哈希键包含的键值对比较多,或键值对中的元素都是比较长的字符串时,就是使用字典 例子:website包含10086个键值对,键为数据库名,值为对应的主页网址...原创 2019-06-28 16:01:37 · 291 阅读 · 0 评论 -
《Redis设计与实现》第八章总结一:对象
7.对象 基于六种数据结构(SDS、双端链表、字典、跳表、整数集合、压缩列表)创建了一个对象系统,这个对象系统包含字符串对象,列表对象,哈希对象,集合对象和有序集合对象;每种对象都用到了至少一种数据结构 使用对象的好处: 1.可以在执行命令之前,根据对象的类型来判断是否可以执行该命令(类型字段作用) 2.可以针对不同的使用场景,为对象设置多种不同的数据结构实现,优化对象在不同场景下的使用效率(...原创 2019-07-02 17:24:06 · 281 阅读 · 0 评论 -
《Redis设计与实现》第八章总结二:五种对象简述
继《Redis设计与实现》第八章总结一:对象 7.2 字符串对象 7.2.1 底层所使用的编码方式 int、raw、embstr int:对应的数据结构为long类型的整数 例子:set number 10086 raw:对应的数据结构为简单动态字符串 例子:set story “Long,long ago there lived a king …” embstr:对应的数据结构为emb...原创 2019-07-02 17:31:23 · 269 阅读 · 0 评论 -
《Redis设计与实现》第八章总结三:对象的一些必要操作
继《Redis设计与实现》第八章总结二:五种对象简述 7.7 类型检查与命令多态 7.7.1 出现的原因 Redis中操作键的命令分两种:一种可以操作任何类型的键,一种只能操作特定类型的键 操作任何类型键命令:DEL、EXPIRE、RENAME、TYPE、OBJECT 操作特定类型键命令: 7.7.2 类型检查的实现 执行一个类型特定命令之前,Redis会先检查输入键的类型是否正确,然后再决定是...原创 2019-07-02 17:36:00 · 244 阅读 · 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 · 466 阅读 · 0 评论 -
《Redis设计与实现》第三章总结:链表
2.链表 C语言没有实现链表,因此Redis自己实现了一套 列表(list)键的底层实现之一就是链表,当一个列表键包含了较多元素,或元素都是比较长的字符串,则会使用链表作为列表键的底层实现,如integers列表键,链表中的每个节点都保存了一个整数值 发布与订阅、慢查询、监视器等也用到了链表 2.1 实现 链表节点(adlist.h/listNode)表示如图: 由list(adlist.h/l...原创 2019-06-28 11:30:07 · 336 阅读 · 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 · 249 阅读 · 0 评论 -
《Redis设计与实现》第十四章总结二:serverCron函数解析
继《Redis设计与实现》第十四章总结一:服务器运行流程 6.2 serverCron函数 默认每隔100毫秒执行一次 接下来对此函数执行的操作进行介绍,并介绍redisServer中和此函数相关的属性 6.2.1 更新服务器时间缓存 redisServer的unixtime、mstime:被用作当前时间的缓存,因为每次获取系统当前时间都需要执行一次系统调用,使用缓存可以减少系统调用的执行次数: ...原创 2019-07-12 23:55:51 · 833 阅读 · 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 · 232 阅读 · 0 评论 -
《Redis设计与实现》第十一章总结:AOF
3 AOF持久化 RDB通过保存键值对,AOF通过保存服务器所执行的写命令来记录数据库状态 保存格式:以Redis的命令请求协议格式,自动添加SELECT命令 例子:SET、SADD、RPUSH 3.1 AOF持久化的实现 可以分为三个步骤:命令追加、文件写入、文件同步 3.1.1 命令追加 打开AOF,则服务器将被执行的写命令以协议格式追加到服务器状态的aof_buf缓冲区的末尾 3.1.2...原创 2019-07-08 11:00:33 · 1019 阅读 · 0 评论 -
《Redis设计与实现》第十五章总结一:新旧复制功能
三:多机数据库的实现 目的:清楚Redis的Sentinel、复制(replication)、集群(cluster)的三个多机功能 15 复制 概念:通过执行SLAVEOF命令或设置slaveof选项,可以让一个服务器去复制另一个服务器 主服务器:被复制的服务器 从服务器:复制的服务器 作用:进行复制中的主从服务器数据库状态一致(保存相同的数据);主服务器上执行的更新命令,从服务器会获得相同的结果...原创 2019-07-13 13:56:04 · 429 阅读 · 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 · 474 阅读 · 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 · 256 阅读 · 0 评论 -
《Redis设计与实现》第九章总结二:过期键相关操作
继《Redis设计与实现》第九章总结一:数据库相关操作实现 1.6 服务器保存键的生存时间和过期时间的实现方法 1.6.1 概述 客户端使用EXPIRE或PEXPIRE命令可以以秒或毫秒精度为数据库的某个键设置生存时间(TTL); 经过指定时间后,服务器会自动删除生存时间为0的键 EXPIREAT或PEXPIREAT命令则以秒或毫秒精度为数据库的某个键设置过期时间(expire time),SET...原创 2019-07-04 17:13:49 · 308 阅读 · 0 评论 -
《Redis设计与实现》第十二章总结:事件
4 事件 Redis服务器是一个事件驱动程序,需要处理两类事件,分别是文件事件和时间事件: 4.1 文件事件 文件事件处理器:基于Reactor模式的网络事件处理器 4.1.1 文件事件处理器的构成 socket、I/O多路复用程序、文件事件分派器、事件处理器: IO多路复用程序通过队列向文件事件分派器传送套接字,当上一个socket处理完毕之后,才能传送下一个socket;每一个处理器都是...原创 2019-07-10 11:38:44 · 310 阅读 · 0 评论 -
《Redis设计与实现》第五章总结:跳跃表
4.跳跃表 有序集合键的底层实现之一:如果一个有序集合包含的元素数量比较多,或者有序集合中元素是比较长的字符串时,就使用跳表 在集群节点中用作内部数据结构 跳表在Redis中只有这两个用途 4.1 跳表总览 redis.h/zskiplistNode和redis.h/zskiplist两个结构定义,zskiplistNode表示跳表节点,zskiplist用于保存跳表节点的相关信息,如节点数量,头...原创 2019-06-29 17:22:49 · 490 阅读 · 0 评论 -
《Redis设计与实现》第十六章总结一:Sentinel状态封装
16 Sentinel(哨兵) 作用: 是Redis高可用解决方案。由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器并进行代替,处理命令请求;若下线服务器重新上线,则成为新的主服务器的从服务器 完整的上下线例子:从上到下、从左到右 16....原创 2019-07-14 18:39:25 · 356 阅读 · 0 评论 -
《Redis设计与实现》第十六章总结二:Sentinel与服务器的交互
继《Redis设计与实现》第十六章总结一:Sentinel状态封装 16.4 向主从服务器分别发送信息 Sentinel默认以每两秒一次的频率,通过命令连接向所有被监视的主服务器和从服务器发送以下格式的命令: 此命令向服务器的_sentinel _:hello频道发送一条消息,消息的内容由多个参数组成: 以 _s开头的参数记录的是Sentinel本身的信息,参数意义如下图: 以m_开头的参数记...原创 2019-07-14 18:47:00 · 326 阅读 · 0 评论
分享