摘要: Sentinel sentinel是redis高可用性的解决方案,一个或多个sentinel实例组成sentinel系统,它可以监视任意多个主服务器以及这些主服务器下的从服务器,当被监视的主服务器进入下线状态时(下线时长超过上限时),自动将下线服务器属下的某个从服务器升级为新的主服务器,如果原来下线 阅读全文
posted @ 2019-09-15 19:50 勇闯8 阅读(443) 评论(0) 推荐(0) 编辑
摘要: 复制 假设现在有两个redis服务器,地址分别为127.0.0.1:6379和127.0.0.1:12345,如果我们向服务器127.0.0.1:12345发送以下命令: slaveof 127.0.0.1 6379 那么前者就是后者的主服务器,后者是前者的从服务器。进行复制中的主从服务器双方的数据 阅读全文
posted @ 2019-09-15 19:28 勇闯8 阅读(411) 评论(0) 推荐(0) 编辑
摘要: 服务器 命令的完整执行过程 以set key value为例,说明命令的完整执行过程。 发送命令请求 当用户在客户端中键入一个命令请求时,客户端会将这个命令请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器: 读取命令请求 连接套接字会因为客户端的写入而变得可读,服务 阅读全文
posted @ 2019-09-15 19:17 勇闯8 阅读(462) 评论(0) 推荐(0) 编辑
摘要: 客户端 对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redisClient结构,这个结构代表客户端状态,redis服务器状态结构的clients属性记录了所有与服务器连接的客户端的状态结构,它是一个链表,如一个服务器与三个客户端连接: 客户端状态包含的属性可以分为两类:一类是比 阅读全文
posted @ 2019-09-15 19:01 勇闯8 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 事件 redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:文件事件和时间事件。 文件事件是服务器对套接字操作的抽象,是服务器和客户端通信产生的操作;时间事件是服务器需要在给定的时间点执行的操作。 文件事件 文件事件处理器有四个组成部分,分别是套接字、I/O多路复用程序、文件事件分派器以及 阅读全文
posted @ 2019-09-15 18:52 勇闯8 阅读(534) 评论(0) 推荐(0) 编辑
摘要: RDB持久化 redis中的内容可以通过RDB持久化保存在磁盘中,RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成该文件对应的redis数据库。RDB持久化可以通过命令手动执行,也可以根据配置定期执行。 RDB文件的创建与载入 save命令和bgsave命令都可以生成RDB文件,前者会造 阅读全文
posted @ 2019-09-15 14:35 勇闯8 阅读(472) 评论(0) 推荐(0) 编辑
摘要: 服务器中的数据库 redis的数据都保存在服务器的redisServer结构中,它其中有一个redisDb类型的属性*db,它保存着服务器中所有的数据库,初始化服务器时,程序会根据redisServer结构中的int类型属性dbnum来决定创建多少个数据库,它的默认值是16,所以db会指向一个大小为 阅读全文
posted @ 2019-09-15 14:21 勇闯8 阅读(711) 评论(0) 推荐(0) 编辑
摘要: 对象 redis中所有数据都是以对象的形式存在的,而不是直接使用之前提到过的各种数据结构,使用对象的好处主要有几点: 1、可以很方便的判断对象的类型,进而判断是否可以执行给定的命令。 2、一个类型可以使用不同的底层结构,切换起来很灵活,优化对象在不同场景下的使用效率。 3、基于对象系统,引入了内存回 阅读全文
posted @ 2019-09-15 13:54 勇闯8 阅读(926) 评论(0) 推荐(0) 编辑
摘要: 底层:基数树radix tree 它是一个有序字典树,支持快速定位、插入和删除。它和trie树很类似,如果某个节点只有一个子节点那么可以采用压缩形式,路径代表一个字符串。 在redis中,它被用来存储stream消息队列,消息队列中的每一个消息ID都是时间戳加序号,有了基数树就能根据ID快速定位到具 阅读全文
posted @ 2019-09-15 13:22 勇闯8 阅读(760) 评论(0) 推荐(0) 编辑
摘要: 底层:跳跃链表skiplist 跳表 每个node的结构:含键和值,还有一个由多个node组成的list,就是本node在不同层指向下一个node的指针。 每次初始化时初始化最初的节点,也就是最左边的节点,它的高度就是跳表最大高度,初始每个位置指针指向null。 插入元素时首先判断该元素在集合中是否 阅读全文
posted @ 2019-09-15 13:03 勇闯8 阅读(401) 评论(0) 推荐(0) 编辑
摘要: 底层:快速列表quicklist 在redis早期版本中,list底层使用的是ziplist和linkedlist(元素少时ziplist,多时linkedlist),后来因为链表指针的空间占用大换成了现在的quicklist,quicklist就是两者的混合体,它将linkedlist按段拆分,每 阅读全文
posted @ 2019-09-15 10:43 勇闯8 阅读(667) 评论(0) 推荐(0) 编辑
摘要: 底层:压缩列表ziplist、intset、紧凑列表listpack ziplist和它的级联更新 ziplist是hash类型和list类型在底层的实现之一。当list中只包含少量元素,且元素要么是小整数要么是短字符串时,此时list底层就采用ziplist的方式存储。当hash只保存少量键值对, 阅读全文
posted @ 2019-09-15 10:38 勇闯8 阅读(1730) 评论(0) 推荐(1) 编辑
摘要: 底层:链表和字典 链表 redis中的list类型有时会采用链表的形式存储。 链表的每一个节点定义如下: typedef struct listNode{ //前置节点 struct listNode *prev; //后置节点 struct listNode *next; //节点的值 void 阅读全文
posted @ 2019-09-15 09:28 勇闯8 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 底层:字符串 在redis中除了少数用来打印日志信息的字符串,其他字符串都是以SDS的形式存储的,SDS的全称是simple dynamic string。 SDS的定义 SDS的定义如下: struct sdshdr{ //SDS保存的字符串的长度 int len; //buf数组中未使用的字节数 阅读全文
posted @ 2019-09-15 09:21 勇闯8 阅读(333) 评论(0) 推荐(0) 编辑