redis设计与实现读书笔记——集群

特斯拉 Model 3解析(八)全面拆解特斯拉自动驾驶大脑:AP控制器硬核技术解析 算力极限:双FSD = 144 TOPS,专为AI推理优化。存储架构:LPDDR4 + NAND + NOR,保证高速/可靠启动。通信架构:以太网传视频,CAN传控制,TSN保障实时性。感知输入:多路摄像头 + 高速SerDes,满足全景感知。电源设计:功率模块+被动元件海洋,稳定性优先。功能安全:双芯片冗余 + GPS + 紧急呼叫,容错率极高。🎯 在我看来,特斯拉AP控制器就是一台“车载超算”,它在电源设计、存储架构和功能安全上远超一般新势力方案。 阅读详情

节点

  • 启动节点

一个节点就是运行在集群模式下的redis服务器,redis服务器在启动时会根据cluster-enabled配置选项是否位yes来决定是否开启服务器的集群模式。

  • 集群数据结构
//一个节点的当前状态
struct clusterNode{
    //创建节点的时间
    mstime_t ctime;
    //节点的名字,由40个16进制字符组成
    char name[REDIS_CLUSTER_NAMELEN];
    //节点标识
    int flags;
    //节点当前的配置纪元,用于实现故障转移
    uint64_t configEpoch;
    //节点的ip地址
    char ip[REDIS_IP_STR_LEN];
    //节点的端口号
    int port;
    //保存连接节点所需的有关信息
    clusterLink *link;
    //……
};
//连接节点有关信息
typedef struct clusterLink{
    //创建的时间
    mstime_t ctime;
    //TCP套接字描述符
    int fd;
    //输出缓冲区,保存着等待发送给其他节点的消息
    sds sndbuf;
    //输入缓冲区,保存着从其他节点收到的消息
    sds rcvbuf;
    //与这个节点相关联的节点,如果没有的话就为NULL
    struct clusterNode *node;
}clusterLink;
//当前节点视角下集群目前所处的状态
typedef struct clusterState{
    //指向当前节点的指针
    clusterNode *myself;
    //集群当前的配置纪元,用于实现故障转移
    uint64_t currentEpoch;
    //集群当前的状态:上线还是下线
    int state;
    //集群中至少处理着一个槽的节点的数量
    int size;
    //集群节点名单:键为节点的名字,值为节点对应的clusterNode指针
    dict *nodes;
    //……
};
  • CLUSTER MEET命令的实现

连接工作节点:CLUSTER MEET <ip> <port>

收到命令的节点A和节点B进行握手,以此来确认彼此的存在,并为将来的进一步通信打好基础:

  1. 节点A为节点B创建一个clusterNode结构,并将该结构添加到自己的clusterState.nodes字典中。
  2. 节点A根据ip和port发送meet消息给节点B。
  3. 如果一切顺利,节点B收到meet消息,为节点A创建一个clusterNode结构,并将该结构添加到自己的clusterState.nodes字典中。
  4. 如果一切顺利,节点B向节点A发送PONG消息
  5. 如果一切顺利,节点A向节点B返回PING消息
  6. 如果一切顺利,至此,握手完成

指派槽

当数据库中的16384个槽都有节点再处理时,集群处于上线状态;否则,集群处于下线状态。

  • 记录节点的指派槽信息
//一个节点的当前状态
struct clusterNode{
    //……
    //记录处理那些槽
    //如果slots数组在索引i上的二进制位的值为1,那么表示节点负责处理槽i;否则表示节点不负责处理槽i
    unsigned char slots[16384/8];
    //记录自己负责处理的槽的数量
    int numslots;

    //……
};
  • 传播节点的指派槽信息

一个节点除了会将自己负责处理的槽记录在clusterNode结构的slots属性和numslots属性之外,它还会将自己的slots数组通过消息发送给集群中其他的节点,以此来告知其他节点自己目前负责处理哪些槽。当节点A通过消息从节点B那里接收到节点B的slots数组时,节点A会在自己的clusterState.nodes字典中查找接电脑B对应的clusterNode结构,并对结构中的slots数组进行保存或者更新。

  • 记录集群所有槽的指派信息
//当前节点视角下集群目前所处的状态
typedef struct clusterState{
    //……
    
    //slots[i]指针如果指向NULL,说明槽i尚未被指派给任何节点;slots[i]指针如果指向一个clusterNode        
    //结构,说明槽i已经被指派给了这个clusterNode结构所戴白哦的机构;
    clusterNode *slot[16384];

    //……
};
  • CLUSTER ADDSLOTS命令的实现

指派槽命令:CLUSTER ADDSLOTS <slot> [slot ...]

#遍历所有输出槽
for i in all_input_slots;

    #如果有任意一个槽已经被指派给了某个节点,那么向客户端返回错误,并终止命令执行
    if clusterState.slots[i] != NULL
        reply_error()
        return

#如果通过检查,再一次遍历所有槽,将这些槽指派给当前节点
for i in all_input_slots;

    #设置clusterState.slots数组,将slots[i]的指针指向代表当前节点的clusterNode结构
    clusterState.slots[i] = clusterState.myself

    #访问当前节点的clusterNode结构的slots数组,将数组在索引i上的二进制位设置位1
    setSlotBit(clusterState.myself.slots,i)

#发送消息告知集群中的其他节点,自己目前正在负责处理那些槽

在集群中执行命令

  • 计算键属于哪个槽
  • 判断槽是否由当前节点负责处理

当节点计算出键所属的槽i之后,节点就会检查自己在clusterState.slots数组中的项i,判断键所在的槽是否由自己负责:

  1. 如果clusterState.slots[i]等于clusterState.myself,那么说明槽i由当前节点负责,节点可以执行客户端发送的命令;
  2. 否则,节点会根据clusterState.slots[i]所指向的clusterNode结构所记录的节点IP和端口号,向客户端返回MOVED错误并指引客户端转向正在处理槽i的节点。
  • MOVED错误

格式:MOVED <slot> <ip>:<port>

重新分片

Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点移动到目标节点。

redis-trib对集群的单个槽slot进行重新分片的步骤如下:

  1. redis-trib对目标节点发送CLUSTER SETSLOT <slot> IMPORTING <source_id> 命令,让目标节点准备好从源节点导入槽slot的键值对
  2. redis-trib对源节点发送CLUSTER SETSLOT <slot> MIGRATING <source_id> 命令,让源节点准备好将属于槽slot的键值对迁移至目标节点
  3. redis-trib对源节点发送CLUSTER GETKEYSINSLOT<slot> <count> 命令,获得最多count个属于槽slot的键值对的键名。
  4. 对于步骤三获得的每个键名,redis-trib都向源节点发送一个MIGRATE <target_ip> <target_port> <key_name> 0 <timeout>命令,将被选中的键原子的从源节点迁移至目标节点
  5. 重复步骤3和4,直到源节点保存的所有属于槽slot的键值对都被迁移到目标节点为止。
  6. redis-trib向集群中的任意一个节点发送CLUSTER SETSLOT <slot> NODE <target_id>命令,将槽slot指派给目标节点的信息发送给整个集群。

ASK错误

在进行重新分片期间,源节点向目标节点迁移一个槽的过程中,可能会出现这样一种情况:属于被迁移槽的一部分键值对保存在源节点里面,而另一部分键值对保存在目标节点里面。

  • CLUSTER SETSLOT IMPORTING命令的实现

格式:CLUSTER SETSLOT <slot> IMPORTING <source_id>

clusterState结构的importing_slots_from数组记录了当前节点正在从其他节点导入的槽。

typedef struct clusterState{
    //……

    //如果importing_slots_from[i]的值不为NULL,而是指向一个clusterNode结构,表示当前节点正在从
    //clusterNode所代表的节点导入槽i
    clusterNode *importing_slots_from[16384];

    //……
}clusterState;
  • CLUSTER SETSLOT MIGRATING命令的实现

clusterState结构的migrating_slots_to数组记录了当前节点正在迁移至其他节点的槽。

typedef struct clusterState{
    //……

    //如果migrating_slots_to[i]的值不为NULL,而是指向一个clusterNode结构,表示当前节点正在将
    //槽i迁移至clusterNode所代表的节点
    clusterNode *migrating_slots_to[16384];

    //……
}clusterState;
  • ASK错误

返回该错误后,客户端根据ASK错误提供的IP地址和端口号,转向正在导入槽的目标节点,然后首先向目标节点发送一个ASKING命令,之后再重新发送原本想要执行的命令。

  • ASKING命令

ASKING命令要做的就是开打发送该命令的客户端的REDIS_ASKING标识。如果该客户端的REDIS_ASKING标识未打开,直接发送请求,由于槽的迁移过程还未完成,请求的键还属于源节点,此时直接请求目标节点,目标节点会返回一个MOVED错误。

  • ASK错误和MOVED错误的区别
  1. MOVED错误代表槽的负责全已经从一个结点转移到了另一个节点
  2. ASK错误只是两个节点在迁移槽的过程中使用的一种临时措施

复制与故障转移

  • 设置从节点

向一个节点发送命令:CLUSTER REPLICATE <node_id>

  1. 接收到这个命令的节点首先会再自己的clusterState.node字典中找到node_id所对应的clusterNode,并将自己的clusterState.myself.slaveof指针指向这个结构,以此来记录这个节点正在复制的主节点。
  2. 然后节点会修改自己在clusterState.myself.flags中的属性,关闭原本的REDIS_NODE_MASTER标识,打开REDIS_NODE_SLAVE标识,表示这个节点已经由原来的主节点变为从节点。
  3. 最后,节点会调用复制代码,并根据clusterState.myself.slaveof指向的clusterNode结构所保存的IP地址和端口号,对主节点进行复制。
  • 故障检测

集群中的每个节点都会定期地向集群中的其他节点发送PING消息,以此来检测对方是否在线,如果接收PING消息地节点没有在规定的时间内向发送PING消息的节点返回PONG消息,那么发送PING消息的节点就会将接收PING消息的节点标记位疑似下线。

当一个主节点A通过消息得知B认为主节点C进入了疑似下线状态时,主节点A会在自己的clusterState.nodes字典中找到主节点C所对应的clusterNode结构,并将主节点B的下线报告添加到clusterNode结构的fail_reports链表里面。

//一个节点的当前状态
struct clusterNode{
    //……
    
    //一个链表,记录了所有其他节点对该节点的下线报告
    list *fail_reports;

    //……
};

如果在一个集群里面,半数以上负责处理槽的主节点都将某个主节点 x报告未疑似下线,那么这个主节点x将被标记未已下线,将主节点x标记未已下线的节点会向集群广播一条关于主节点x的FAIL消息,所有收到这条FAIL消息的节点都会立即将主节点x标记为已下线。

  • 故障转移
  1. 复制下线主节点的所有从节点中,会有一个被选中。
  2. 被选中的从节点将执行slaveof no one命令,成为新的主节点
  3. 新的主节点撤销下线主节点对指派槽的管理,并将这些槽全部指派给自己
  4. 新的主节点向集群广播一条PONG消息,告诉集群中的其他节点自己成为了新的主节点。
  5. 新的主节点开始接收和自己负责处理的槽有关的命令请求,故障转移完成。
  • 选举新的主节点
  1. 当从节点发现自己复制的主节点进入已下线状态,就会向集群广播一条消息,要求所有收到这条消息并且具有投票权的主节点向这个从节点投票
  2. 集群中的主节点接收到这条广播消息,如果该主节点没有把票投给过其他从节点,则将票投给当前这个从节点
  3. 每个从节点统计收到的票数,如果票数大于等于 n/2+1,则当前节点成为新的主节点

消息

集群中节点发送的消息主要由5种:

  1. MEET消息:当发送者接到客户端发送的CLUSTER MEET命令时,发送者会向接收者发送MEET消息,请求接收者加入发送者当前所处的集群中。
  2. PING消息:集群里的每个节点默认每隔一秒钟就会从已知节点列表中随机选出五个节点,然后对这五个节点中最长时间没有发送过PING消息的节点发送PING消息,以此来检测选中的节点是否在线
  3. PONG消息:当接收者收到发送者发来的MEET消息或者PING消息时,为了向发送者确认这条MEET消息或者PING消息已到达,接收者会向发送者返回一条PONG消息
  4. FAIL消息:当一个主节点A判断另一个主节点B已经进入FAIL状态时,节点A会向集群广播一条关于B的FAIL消息,所有收到这条消息的节点都会立即将节点B标记为已下线。
  5. PUBLISH消息:当节点接收到一个PUBLISH命令时,节点会执行这个命令,并向集群广播一条PUBLISH消息,所有接收到这条PUBLISH消息的节点都会执行相同的PUBLISH消息。
  • 消息头
typedef struct{
    //消息的长度(包括这个消息头的长度和消息正文的长度)
    unit32_t totlen;

    //消息的类型
    uint16_t type;

    //消息正文包含的节点信息数量,只在发送MEET、PING、PONG这小中Gossip协议消息时使用
    uint16_t count;
    
    //发送者所处的配置纪元
    uint64_t currentEpoch;
    
    //如果发送者是一个主节点,那么这里记录的是发送者的配置纪元
    //如果发送者是一个从节点,那么这里记录的是发送者正在复制的主节点的配置纪元
    uint64_t configEpoch;

    //发送者的名字(ID)
    char sender[REDIS_CLUSTER_NAMELEN];

    //发送者目前的指派槽信息
    unsigned char myslots[REDIS_CLUSTER_SLOTS/8];

    //如果发送者是一个从节点,那么这里记录的是发送者正在复制的主节点的名字
    //如果发送者是一个主节点,那么这里记录的是REDIS_NONE_NULL_NAME
    char slaveof[REDIS_CLUSTER_NAMELEN];

    //发送者的端口号
    uint16_t port;

    //发送者的标识值
    uint16_t flags;

    //发送者所处集群的状态
    unsigned char state;

    //消息的正文
    union clusterMsgData data;
}clusterMsg;
union clusterMsgData{
    //MEET、PING、PONG消息的正文
    struct{
        //每条MEET、PING、PONG消息都包括两个clusterMsgDataGossip结构
        clusterMsgDataGossip gossip[1];
    }ping;

    //FAIL消息的正文
    struct{
        clusterMsgDataFail about;
    }fail;

    //PUBLISH消息的正文
    struct{
        clusterMsgDataPublish msg;
    }publish;

    //其他消息的正文……

};

 

  • MEET、PING、PONG消息的实现

通过消息头的type判断是三种消息中的哪一种。每次发送MEET、PING、PONG消息时,发送者都会从自己的已知节点中随机选出两个节点(可以是主节点或者从节点),并将这两个被选中节点的信息分别保存到两个clusterMsgDataGossip中。接收者收到消息,会取出这两个clusterMsgDataGossip,并根据其中的信息对自己的clusterState.nodes进行更新。

总结:两个数据结构clusterState和clusterNode

//一个节点的当前状态
struct clusterNode{
    //创建节点的时间
    mstime_t ctime;

    //节点的名字,由40个16进制字符组成
    char name[REDIS_CLUSTER_NAMELEN];

    //节点标识
    int flags;

    //节点当前的配置纪元,用于实现故障转移
    uint64_t configEpoch;

    //节点的ip地址
    char ip[REDIS_IP_STR_LEN];

    //节点的端口号
    int port;

    //保存连接节点所需的有关信息
    clusterLink *link;

    //记录处理哪些槽
    //如果slots数组在索引i上的二进制位的值为1,那么表示节点负责处理槽i;否则表示节点不负责处理i
    unsigned char slots[16384/8];

    //记录自己负责处理的槽的数量
    int numslots;

    //一个链表,记录了所有其他节点对该节点的下线报告
    list *fail_reports;

    //……
};

 

//当前节点视角下集群目前所处的状态
typedef struct clusterState{

   //指向当前节点的指针
   clusterNode *myself;

   //集群当前的配置纪元,用于实现故障转移
   uint64_t currentEpoch;

   //集群当前的状态:上线还是下线
   int state;

   //集群中至少处理着一个槽的节点的数量
   int size;

   //集群节点名单:键为节点的名字,值为节点对应的clusterNode指针
   dict *nodes;

   //slots[i]指针如果指向NULL,说明槽i尚未被指派给任何节点;slots[i]指针如果指向clusterNode        
   //结构,说明槽i已经被指派给了这个clusterNode结构所指的机构;
   clusterNode *slot[16384];

   //如果importing_slots_from[i]的值不为NULL,而是指向一个clusterNode结构,表示当前节点正在从
   //clusterNode所代表的节点导入槽i
   clusterNode *importing_slots_from[16384];


   //如果migrating_slots_to[i]的值不为NULL,而是指向一个clusterNode结构,表示当前节点正在将
   //槽i迁移至clusterNode所代表的节点
   clusterNode *migrating_slots_to[16384];

   //……
};

 

 

 

 

【PostgreSQL】Windows11下的PostgreSQL数据库安装tds_fdw扩展及使用(图文记录详细步骤) 【详解】【PostgreSQL】Windows11下的PostgreSQL数据库安装tds_fdw扩展及使用 阅读详情

相关推荐

成本会计(第九版)王忠孝课后习题答案解析

在掌握了基础知识之后,我们还需要培养自己的实际操作能力。此外,在学习过程中,遇到困难时,要及时向老师、同学请教,不要害怕暴露自己的不足。三人行,必有我师,每个人都有值得学习的地方。首先,我们需要认真阅读教材,把基础知识掌握牢固。在这里,我建议大家使用《成本会计(第九版)》的配套练习册,这样可以帮助我们检查学习效果。同时,网上的一些优质课程和论坛也是不错的学习资源,例如网易云课堂、中国大学MOOC等。别担心,这里我给大家推荐一些实用的学习资料和方法,帮助你更好地掌握这门课程。出版社: 大连理工大学出版社。

weixin_58833001的博客 1888

《Redis设计与实现》第十七章 集群

Redis集群是Redis提供的分布式数据库方案,集群通过sharding分片来进行数据共享,并提供复制和故障转移功能。 对集群的节点、slot、命令执行、重新分片、转向、故障转移、消息等各方面介绍。 17.1 节点 一个Redis集群通常由多个节点node组成,在刚开始的时候,每个节点都是相互独立的,他们都出于一个只包含自己的集群当。 17.1.1 启动节点 一节节点就是一个reis服务器。...

Za七杂⑧ 359

腾讯会议视频过期了怎么办?亲测可用:用这个免费插件抢救你的会议录制与回放

本文提供了三种亲测有效的腾讯会议视频过期恢复方案,包括浏览器缓存提取、专业工具组合及预防性措施。特别推荐使用免费插件抢救过期会议录制与回放,帮助职场人解决重要视频资料丢失的难题。

weixin_33686714的博客 264

《Redis设计与实现》阅读笔记12-集群

16 集群 集群由多个节点(redis服务器)组成。多个节点之间通过握手进行连接,从而构造了集群。 CLUSTER MEET &amp;amp;amp;amp;amp;amp;lt;ip&amp;amp;amp;amp;amp;amp;gt; &amp;amp;amp;amp;amp;amp;lt;port&amp;amp;amp;amp;amp;amp;gt; 客户端向一个节点发送这条命令,可以使得接收命令的节点与命令中对应ip地址和端口的服务器节点进行握手,使得

maniacxx的博客 329

【Unity】YooAsset与HybridCLR:高效资源管理与代码热更的黄金组合

本文深入探讨了Unity开发中YooAsset与HybridCLR的组合应用,为需要长期运营的项目提供了完整的资源与代码热更新解决方案。YooAsset作为高效的资源管理框架,简化了AssetBundle的打包、加载与热更流程;而HybridCLR则攻克了IL2CPP模式下C#代码无法热更的难题。两者结合,实现了从资源到逻辑的平滑在线更新,极大提升了开发迭代与线上维护的效率。

weixin_29006701的博客 281

深入C6678启动流程:从BootRom参数表到多核镜像部署的完整解析

本文深入解析TMS320C6678 DSP的启动流程,从BootRom参数表到多核镜像部署的全过程。详细介绍了七种启动模式的工程选择、多核镜像构建技巧以及二级引导策略,帮助开发者掌握C6678的启动机制与调试方法,提升嵌入式系统开发效率。

weixin_30505225的博客 612

《Redis设计与实现》——读书笔记之Redis集群

目录1、节点1.1 启动节点1.2 集群数据结构1.3 CLUSTER MEET命令的实现2、槽指派2.1、记录节点的槽指派信息2.2、传播节点的槽指派的信息2.3 记录集群所有槽的指派信息2.4 cluster addslots3、在集群中执行命令3.1 计算键属于哪个槽3.2 判断槽是否由当前节点处理3.3 MOVED 错误3.4 、节点数据库的实现4、重新分片4.1重新分片原理5、ASK错误...

weixin_41927235的博客 408

clumsy一款模拟弱网的工具

利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果。

klb5555的专栏 2551

Redis设计与实现——Redis集群

集群相关概念节点槽指派键与槽的关联重新分片ASK错误 相关概念 集群:由一个或多个节点组成的,是Redis提供的分布式数据库方案。集群通过分片来进行数据共享,并提供复制和故障转移功能。 节点:一个集群模式下的Redis服务器。 槽:整个集群数据库分为16384个槽 节点 节点通过握手和响应握手来组成一个集群 通过CLUSTER NODES 可以查看集群节点信息。 节点启动 Redis服务器在启动时根据 cluster-enable来决定是否开启集群模式。 相较于普通的服务器,节点会将集群模式下需要的数据

qq_45013531的博客 557

Android16 3576 u盘固件升级功能添加

1.在u-boot/drivers/power/pmic/rk8xx.c。这里是读取power键的寄存器判断长短按。

tzj1058756809的博客 575

组合预测 | Python实现LSTM-XGBoost长短期记忆网络组合极限梯度提升树股票价格预测

组合预测 | Python实现LSTM-XGBoost长短期记忆网络和极限梯度提升树股票价格预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 2353

读书笔记:《Redis设计与实现》之集群

集群中的每个节点都会向其他节点发送ping消息,用来检测对方是否在线,如果没有接受到PONG响应,那么就认为节点是下线状态(down),如果节点长时间没有接受到其他节点发送的ping消息,那么节点会认为自己是下线状态(down)进行重新分片期间,会出现一种情况,即源节点在执行向目标节点迁移键值对的操作时,当发现目标节点已经不再处理这个槽,那么节点就会返回ASK错误给发请求的redis-trib,同时返回新的目标节点ID。节点的故障转移(failover)是在故障发生时自动完成的,不需要人工干预。

fronge的博客 1507

PCB仿真软件:Altium Designer_(18).PCB设计中的热管理

在PCB设计中,热管理是一个至关重要的环节。随着电子设备的集成度越来越高,功耗和发热量也随之增加,不合理的热设计可能导致电路板过热,从而影响电路的性能和可靠性。热管理不仅能够提高电路板的使用寿命,还能确保电路在各种环境条件下的稳定工作。本节将详细介绍如何在Altium Designer中进行有效的热管理,包括热分析、热设计和热仿真等关键步骤。

kkchenjj的博客 1986

《Redis设计与实现》读书笔记——复制、Sentinel、集群

1、复制    用SLAVEOF命令让一个服务器(从)去复制另一个服务器(主)。例如127.0.0.1:12345&gt; SLAVEOF 127.0.0.1 6379,127.0.0.1:12345将成为127.0.0.1:6379的从服务器。    (1)旧版复制功能实现,分为同步和命令传播两个操作。当执行SLAVEOF时,首先执行同步操作,【1】从服务器向主服务器发送SYNC命令【2】主服务...

weixin_39420024的博客 439

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Redis设计与实现读书笔记---复制/Sentinel/集群

复制 复制模式:用户通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器区复制另一个服务器。 旧版复制功能 Redis的复制功能分为同步(sync)和命令传播(command propagate); 同步操作用于将从服务器的数据状态更新至主服务器当前所在的数据库状态; 命令传播操作则用于在主服务器的数据库状态被修改,导致主从服务器状态不一致的情况时,通过命令传递,将主从服务器的数据库状态从新回到一致状态; 同步 从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命令来完成; 从服务器

生蛋的公鸡的博客 206

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《Redis设计与实现》读书笔记-第三部分:多机数据库的实现-3:集群

1.节点 一个redis集群通常由多个节点组成,在刚开始的时候,每个节点都是相互独立的,它们都处于一个只包含自己的集群中,要建立一个真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群。连接各个节点可以通过CLUSTER MEET命令完成 1.1启动节点 一个节点就是一个运行在集群模式下的redis服务器,Redis服务器在启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务器的集群模式: 节点 ,即运行在集群模式下的Redis服务器....

PnJgHT的博客 195

实现动态表头_《Redis设计与实现》读书笔记

《Redis设计与实现》读书笔记​www.woojean.com关系数据库并不直接支持交集计算操作,要计算两个集合的交集,除了需要对两个数据表执行合并(join)操作之外,还需要对合并的结果执行去重复(distinct)操作,最终导致交集操作的实现变得异常复杂。《Redis设计与实现》读书笔记关系数据库并不直接支持交集计算操作,要计算两个集合的交集,除了需要对两个数据表执行合并(join)操作之外...

weixin_35339622的博客 243

Redis设计与实现读书笔记

Redis、读书笔记、Redis源码分析、Redis原理分析

一个有信仰的技术人 1338

《redis设计与实现》 读书笔记

读书笔记 一、前言 什么是redis: Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。简而言之redis就是放在远程网络上的一个key-value数据结构。 redis的使用场景: Redis可以用来做cache,也可以用来做持久化db,甚至用来做队列。队列就是存储临时性数据,而cache主要存储那些用...

kangbin825的专栏 2746

《Redis 设计与实现》读书概要

《Redis 设计与实现》读书笔记

u011447403的专栏 1498

redis设计与实现 pdf_《Redis设计与实现》读书笔记

《Redis设计与实现》读书笔记​www.woojean.com关系数据库并不直接支持交集计算操作,要计算两个集合的交集,除了需要对两个数据表执行合并(join)操作之外,还需要对合并的结果执行去重复(distinct)操作,最终导致交集操作的实现变得异常复杂。《Redis设计与实现》读书笔记关系数据库并不直接支持交集计算操作,要计算两个集合的交集,除了需要对两个数据表执行合并(join)操作之外...

weixin_39939276的博客 356

《Redis设计与实现》读书笔记

文章目录1. 基本对象2. 底层数据结构3. 对象3.1. 字符串对象3.1.1. int3.1.2. embstr3.1.3. raw3.2. 列表对象3.3. 哈希对象3.4. 集合对象3.5. 有序集合对象3.6. 对象共享4. SDS (simple dynamic string)5. linkedlist6. hashtable7. intset7.1. 升级8. 压缩列表(ziplis...

艰苦奋斗 895

【读书笔记】redis核心技术与实战(一)

从极客时间的redis核心技术实战说起,整理相关的读书笔记。归纳redis的知识点。 文章目录开篇词 这样学Redis,才能技高一筹01 | 基本架构:一个键值数据库包含什么? 开篇词 这样学Redis,才能技高一筹 redis遇到的坑可能主要存在与四个方面: CPU使用上的坑,例如数据结构的复杂度、跨 CPU 核的访问; 内存使用上的“坑”,例如主从同步和 AOF 的内存竞争; 存储持久化上的“坑”,例如在 SSD 上做快照的性能抖动; 网络通信上的“坑”,例如多实例时的异常网络丢包。 为了学习r.

遍地跑小鸡的博客 3203

《redis设计与实现》书籍读书笔记

仅供参考

arthasking123的博客 237

【读书笔记】《Redis设计与实现》

数据结构 Redis支持键可以为String、list、hash、set、zset,5.0版本后还支持Pub/Sub 、Stream、GEO、bitmap、hyperloglogs。 dictEntry节点组成的链表没有指向链表表尾的指针,所以为了速度考虑,程序总是将新节点添加到链表表头位置(头插法时间复杂度O(1),排在其他节点的前面。 当以下条件中的任意一个被满足时,程序会自动开始对哈希表做执行扩展操作:服务器目前没有做BGSAVE/BGREWRITEAOF命令,并且哈希表的负载因子大于等于;服务器目

在路上的德尔菲的博客 274

Redis设计与实现——读书笔记

数据结构与对象 SDS(Simple Dynamic String) struct sdshdr { int len;//已使用字节数 int free;//未使用字节数 char buf[];//字节数组 } 特点: 1、空间预分配策略,减少内存重分配次数(内存分配涉及系统调用)。 2、获取长度O(1),通过属性记录字符串长度。 3、杜绝缓冲区一次,通过API对SDS进行修改时,会先检查...

void 395

《redis设计与实现》-读书笔记

文章目录常见数据结构SDS链表字典哈希算法rehash与渐进式rehashrehash步骤:rehash条件渐进式rehash跳跃表整数集合集合升级压缩列表快速列表为什么使用快速列表?ziplist切割大小压缩深度对象内存回收对象共享数据库RDB持久化创建与载入AOF持久化AOF重写事件复制旧版主从复制实现新版主从复制实现主从复制实现心跳检测哨兵模式(Sentinel)发布和订阅Stream事务事务实现ACID性质排序慢日志监视器 常见数据结构 动态字符串SDS 链表 字典 跳跃表 整数集合 压缩列表 快

如是说的博客 1640
上一篇: redis设计与实现读书笔记——sentinel
下一篇: redis设计与实现读书笔记——发布与订阅
CCCCC_SSSSS
博客等级 码龄10年 3粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值