![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
深入浅出Redis
文章平均质量分 76
木唯韵
这个作者很懒,什么都没留下…
展开
-
Redis总结
在bgsave 的时候,Redis主进程会fork一个子进程,利用操作系统的写时复制技术,这个子进程在拷贝父进程的时候理论上是很快的,因为并不需要全拷贝,比如主进程虽然占了10G内存,但子进程拷贝他可能只要200毫秒,我认为也就阻塞了200毫秒(此耗时基本跟主进程占用的内存是成正比的),这个具体的时间可以通过统计项info stats 里的last_fork_usec查看。实际操作过程是,fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。原创 2023-03-15 20:53:18 · 204 阅读 · 1 评论 -
深入浅出Redis之发布与订阅
除了订阅频道之外,客户端还可以通过执行PSUBSCRIBE命令订阅一个或多个模式,从而成为这些模式的订阅者:每当有其他客户端向某个频道发送消息时,消息不仅会被发送给这个频道的所有订阅者,它还会被发送给所有与这个频道相匹配的模式的订阅者。通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者( subscriber ):每当有其他客户端向被订阅的频道发送消息( message)时,频道的所有订阅者都会收到这条消息。将消息发送给频道订阅者。将消息发送个模式订阅者。原创 2023-03-15 20:50:33 · 140 阅读 · 0 评论 -
深入浅出Redis之Sentinel
Sentinel(哨岗、哨兵)是Redis的高可用性( high availability )解决方案:由一个或多个Sentinel实例( instance )组成的Sentinel系统( system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。如果Sentinel正在监视的是主服务器,那么这些参数记录的就是主服务器的信息;原创 2023-03-15 20:45:32 · 269 阅读 · 0 评论 -
深入浅出Redis之复制
在同步操作执行完毕之后,主从服务器两者的数据库将达到一致状态,但这种一致并不是一成不变的,每当主服务器执行客户端发送的写命令时,主服务器的数据库就有可能会被修改,并导致主从服务器状态不再一致。在复制操作刚开始的时候,从服务器会成为主服务器的客户端,并通过向主服务器发送命令请求来执行复制步骤,而在复制操作的后期,主从服务器会互相成为对方的客户端。主服务器会将自己执行的写命令,也即是造成主从服务器不一致的那条写命令,发送给从服务器执行,当从服务器执行了相同的写命令之后,主从服务器将再次回到一致状态。原创 2023-03-15 20:41:08 · 97 阅读 · 0 评论 -
深入浅出Redis之服务器
如果有信号到达,那么表示新的RDB文件已经生成完毕(对于BGSAVE命令来说),或者AOF文件已经重写完毕(对于BGREWRITEAOF命令来说),服务器需要进行相应命令的后续操作,比如用新的RDB文件替换现有的RDB文件,或者用重写后的AOF 文件替换现有的AOF文件。Redis服务器的命令请求来自Redis 客户端,当用户在客户端中键入一个命令请求时,客户端会将这个命令请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器,如图14-1所示。3)初始化服务器数据结构;原创 2023-03-15 20:41:01 · 517 阅读 · 0 评论 -
深入浅出Redis之客户端
如果输出缓冲区的大小超过了软性限制所设置的大小,但还没超过硬性限制,那么服务器将使用客户端状态结构的obuf_soft_limit_reached_time 属性记录下客户端到达软性限制的起始时间;举个例子,假设当前有c1和 c2两个普通客户端正在连接服务器,那么当一个新的普通客户端c3连接到服务器之后,服务器会将c3所对应的客户端状态添加到clients链表的末尾,如图13-12所示,其中用虚线包围的就是服务器为c3新创建的客户端状态。原创 2023-03-15 20:38:34 · 124 阅读 · 0 评论 -
深入浅出Redis之事件
服务器不会中途中断事件处理,也不会对事件进行抢占,因此,不管是文件事件的处理器,还是时间事件的处理器,它们都会尽可地减少程序的阻塞时间,并在有需要时主动让出执行权,从而降低造成事件饥饿的可能性。:当一个时间事件到达之后,服务器会根据事件处理器返回的值,对时间事件的 when属性进行更新,让这个事件在一段时间之后再次到达,并以这种方式一直更新并运行下去。随着文件事件的不断执行,时间会逐渐向时间事件所设置的到达时间逼近,并最终来到到达时间,这时服务器就可以开始处理到达的时间事件了。原创 2023-03-13 10:30:41 · 212 阅读 · 0 评论 -
深入浅出Redis之AOF持久化
当子进程完成创建新AOF文件的工作之后,服务器会将重写缓冲区中的所有内容追加到新AOF文件的末尾,使得新旧两个AOF文件所保存的数据库状态一致。最后,服务器用新的AOF文件替换旧的AOF文件,以此来完成AOF 文件重写操作。,所以随着服务器运行时间的流逝,AOF 文件中的内容会越来越多,文件的体积也会越来越大,如果不加以控制的话,体积过大的AOF文件很可能对Redis服务器、甚至整个宿主计算机造成影响,并且AOF 文件的体积越大,使用AOF文件来进行数据还原所需的时间就越多。原创 2023-03-13 10:30:51 · 59 阅读 · 0 评论 -
深入浅出Redis之持久化
例如,如果服务器的0号数据库和3号数据库非空,那么服务器将创建一个如图10-12所示的RDB文件,图中的database 0代表0号数据库中的所有键值对数据,而database 3则代表3号数据库中的所有键值对数据。如果服务器的数据库状态为非空(有至少一个数据库非空),那么这个部分也为非空,根据数据库所保存键值对的数量、类型和内容不同,这个部分的长度也会有所不同。,它的值是一个字符串表示的整数,这个整数记录了RDB文件的版本号,比如"0006"就代表RDB文件的版本为第六版。原创 2023-03-13 10:29:19 · 82 阅读 · 0 评论 -
深入千尺Redis之数据库
实现,每当Redis的服务器周期性操作redis.c/serverCron函数执行时,activeExpirecycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires 字典中随机检查一部分键的过期时间,并删除其中的过期键。:在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分CPU时间,在内存不紧张但是CPU时间非常紧张的情况下,将CPU时间用在删除和当前任务无关的过期键上,无疑。定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。原创 2023-03-13 10:25:47 · 44 阅读 · 0 评论 -
深入浅出Redis之对象
ziplist编码的压缩列表对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员(member ),而第二个元素则保存元素的分值( score )。Redis 共有字符串、列表、哈希、集合、有序集合五种类型的对象,每种类型的对象至少都有两种或以上的编码方式,不同的编码可以在不同的使用场景上优化对象的使用效率。encoding属性记录了对象所使用的编码,也即是说这个对象使用了什么数据结构作为对象的底层实现,这个属性的值可以是表8-3列出的常量的其中一个。原创 2023-03-13 10:25:59 · 51 阅读 · 0 评论 -
深入浅出Redis之对象
ziplist编码的压缩列表对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员(member ),而第二个元素则保存元素的分值( score )。Redis 共有字符串、列表、哈希、集合、有序集合五种类型的对象,每种类型的对象至少都有两种或以上的编码方式,不同的编码可以在不同的使用场景上优化对象的使用效率。encoding属性记录了对象所使用的编码,也即是说这个对象使用了什么数据结构作为对象的底层实现,这个属性的值可以是表8-3列出的常量的其中一个。原创 2023-03-13 10:24:03 · 84 阅读 · 0 评论 -
深入浅出Redis之整数集合
要让一个数组可以同时保存int16_t、int32_t、int64_t三种类型的值,最简单的做法就是直接使用int64_t类型的数组作为整数集合的底层实现。不过这样一来,即使添加到整数集合里面的都是int16_t类型或者int32_t类型的值,数组都需要使用int64 t类型的空间去保存它们,从而出现。整数集合的底层实现为数组,这个数组以有序、无重复的方式保存集合元素,在有需要时,程序会根据新添加元素的类型,改变这个数组的类型。可以保存类型为int16_t、 int32_t或者int64_t的整数值。原创 2023-03-13 10:21:25 · 89 阅读 · 0 评论 -
深入浅出Redis之跳跃表
Redis 的跳跃表实现由zskiplist和zskiplistNode两个结构组成,其中zskiplist用于保存跳跃表信息(比如表头节点、表尾节点、长度),而zskiplistNode则用于表示跳跃表节点。但通过使用一个zskiplist结构来持有这些节点,程序可以更方便地对整个跳跃表进行处理,比如快速访问跳跃表的表头节点和表尾节点,或者快速地获取跳跃表节点的数量(也即是跳跃表的长度)等信息,如图5-9所示。在同一个跳跃表中,多个节点可以包含相同的分值,但每个节点的成员对象必须是唯一的。原创 2023-03-13 10:19:44 · 61 阅读 · 0 评论 -
深入浅出Redis之字典
Redis 的哈希表使用链地址法( separate chaining)来解决键冲突,每个哈希表节点都有一个next指针,多个哈希表节点可以用next 指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表连接起来,这就解决了键冲突的问题。举个例子,假设程序要将键值对k2和v2添加到图4-6所示的哈希表里面,并且计算得出k2的索引值为2,那么键k1和k2将产生冲突,而解决冲突的办法就是使用next指针将键k2和k1所在的节点连接起来,如图4-7所示。原创 2023-03-13 10:18:01 · 48 阅读 · 0 评论 -
深入浅出Redis之简单动态字符串
的惯例,保存空字符的1字节空间不计算在SDS的len属性里面,并且为空字符分配额外的1字节空间,以及添加空字符到字符串末尾等操作,都是由SDS自动完成的作,所以这个空字符对于SDS的使用者来说是完全透明的。虽然SDS的API都是二进制安全的,但它们一样遵循C字符串以空字符结尾的惯例:这些API总会将SDS保存的数据的末尾设置为空字符,并且总会在为buf数组分配空间时多分配一个字节来容纳这个空字符,这是为了让。使用长度为N+1的字符数组来表示长度为N的字符串,并且字符数组的最后一个元素总是空字符‘\0’。原创 2023-03-10 10:56:43 · 45 阅读 · 0 评论 -
深入浅出Redis之表
在InnoDB存储引擎表中,每张表都有个主键(Primary Key),如果在创建表时。当表中有多个非空唯一索引时,InnoDB存储引擎将选择建表时。索引组织表(index organized table)是否有非空的唯一索引(Unique NOT NULL)InnoDB存储引擎自动创建一个6字节大小的指针。第一个定义的非空唯一索引为主键。表都是根据主键顺序组织存放的。在InnoDB存储引擎中,,如果有,则该列即为主键。,而不是建表时列的顺序。,这种存储方式的表称为。如果不符合上述条件,原创 2023-03-10 10:48:40 · 300 阅读 · 0 评论