01 2023 档案
摘要:https://mirrors.aliyun.com/centos-vault/centos/8.5.2111/isos/x86_64/CentOS-8.5.2111-x86_64-dvd1.iso?spm=a2c6h.25603864.0.0.7163ffb0SfxsjN
阅读全文
摘要:监视器 通过执行MONITOR命令,客户端可以将自己变为一个监视器,实时地接收并打印出服务器当前处理的命令请求的相关信息。 每当一个客户端向服务器发送一条命令请求时,服务器除了会处理这条命令请求之外,还会将关于这条命令请求的信息发送给所有监视器。 如果客户端c10086向服务器发送MONITOR命令
阅读全文
摘要:慢查询日志 Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监视和优化查询速度。 服务器配置有两个和慢查询日志相关的选项: slowlog-log-slower-than选项指定执行时间超过多少微秒(1秒等于1 000 000微秒)的命令请求会被记录
阅读全文
摘要:二进制位数组 Redis提供了SETBIT、GETBIT、BITCOUNT、BITOP四个命令用于处理二进制位数组。 SETBIT命令用于为位数组指定偏移量上的二进制位设置值,GETBIT命令则用于获取位数组指定偏移量上的二进制位的值,BITCOUNT命令用于统计位数组里面值为1的二进制位的数量,B
阅读全文
摘要:排序 Redis的SORT命令可以对列表键、集合键或者有序集合键的值进行排序。 如果按照选项来划分的话,一个SORT命令的执行过程可以分为以下几步: 1)排序:在这一步,命令会使用ALPHA、ASC或DESC、BY这几个选项,对输入键进行排序,并得到一个排序结果集。 2)限制排序结果集的长度:在这一
阅读全文
摘要:事务 事务的实现 Redis通过MULTI、EXEC、WATCH等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处
阅读全文
摘要:发布与订阅 Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。 通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者(subscriber):每当有其他客户端向被订阅的频道发送消息(message)时,频道的所有订阅者都
阅读全文
摘要:集群 Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。 Redis服务器在启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务器的集群模式。 CLUSTER MEET <ip> <port> 命令
阅读全文
摘要:Sentinel Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下
阅读全文
摘要:复制 在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave)。 Redis的复制功能分为同步(sync)和命令传播
阅读全文
摘要:服务器 命令请求的执行过程 客户端发送命令请求 当客户端与服务器之间的连接套接字因为客户端的写入而变得可读时,服务器将调用命令请求处理器来执行以下操作: 读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区里面。 对输入缓冲区中的命令请求进行分析,提取出命令请求中包含的命令参数,以及命
阅读全文
摘要:客户端 通过使用由I/O多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。 对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redis.h/redisClient结构(客户端状态),这个结构保存了客户端当前的状态信息
阅读全文
摘要:事件 Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端(或者其他服务器)的通信会产生相应的文件事件,而服务器则通过监听并处
阅读全文
摘要:AOF(append only file) AOF 持久化功能的实现可以分为命令追加(append)、文件写入、文件同步(sync)三个步骤。 命令追加:当 AOF 持久化功能处于打开状态时, 服务器在执行完一个写命令之后, 会以协议格式将被执行的写命令追加到服务器状态的 aof_buf 缓冲区的末
阅读全文
摘要:RDB持久化 SAVE命令和BGSAVE命令可以用于生成RDB文件,创建RDB文件实际由rdb.c/rdbSave函数完成: SAVE 命令由服务器进程直接执行保存操作,所以该命令会阻塞服务器。 BGSAVE 命令由子进程执行保存操作,所以该命令是异步的,不会阻塞服务器。 RDB文件的载入工作是在服
阅读全文
摘要:数据库的切换 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库。 在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库。d
阅读全文
摘要:对象 Redis并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型。 typedef struct redisObject { // 类型 unsigned type:4; // 编码
阅读全文
摘要:压缩列表 当一个列表键只包含少量列表项, 并且每个列表项要么就是小整数值, 要么就是长度比较短的字符串, 那么 Redis 就会使用压缩列表(ziplist)来做列表键的底层实现。 当一个哈希键只包含少量键值对, 并且每个键值对的键和值要么就是小整数值, 要么就是长度比较短的字符串, 那么 Redi
阅读全文
摘要:整数集合 整数集合(intset)是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现。 虽然 intset 结构将 contents 属性声明为 int8_t 类型的数组, 但实际上 contents 数组并不保存
阅读全文
摘要:跳表 Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员 ( member ) 是比较长的字符串时,Redis 就会使用跳跃表来作为有序集合键的底层实现。 位于图片最左边的是 zskiplist 结构, 该结构包含以下属性: heade
阅读全文
摘要:字典 字典是数据库和哈希键的底层实现。 拉链的链表头部插入,以解决冲突。 rehash流程: 为字典的 ht[1] 哈希表分配空间, 这个哈希表的空间大小取决于要执行的操作, 以及 ht[0] 当前包含的键值对数量 (也即是ht[0].used 属性的值): 如果执行的是扩展操作, 那么 ht[1]
阅读全文
摘要:链表 Redis使用的C没有内置链表结构,Redis自己实现了链表 双端:链表节点带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度都是O(1)。 无环:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点。 带表头指针和表尾指针:通过list
阅读全文
摘要:string string是redis最基本的类型,一个key对应一个value。 采用SDS表示字符串,而非C中的简单字符串,SDS本质是结构体,含有free、len、buf三个字段。 SDS长度增长时空间预分配,增长后长度小于1M时,分配的free和len相等,即增长后的buf大小为增长后的le
阅读全文