codis升级redis3.11到redis6.0.10背景

当前codis最新版本为3.2对应的redis的版本为3.2.11,针对以往的redis在使用过程中当内存碎片率过高时只能重启节点,无法动态释放故调研升级到redis6版本。

codis调研

从codis的架构可以知道,codis中的jodis-client(通过zk)或者redis-client直连的方式来访问codis-proxy,codis-proxy通过计算对应的key的slot来转发到对应的codis-group中去,这样完成一个完整的请求访问。

当前有三种方式来使用redis中的数据:

  1. 通过codis提供的封装过zk的jodis客户端,来访问这样通过key就能直接获取内容而无需做其他修改,该客户端将proxy的服务发现等操作都已经封装完成,使用方便快捷。
  2. 通过proxy来访问redis实例信息,但是直连proxy带来的风险是无法再proxy层做负载均衡和服务发现,对后期运维不太友好。
  3. 直连redis实例,如果直连redis实例相当于把所有slot的操作系统都放在了业务端来实现基本没有使用上codis的分布式可扩展的天然优势,虽然codis-server提供计算slot的命令但是该方案的意义不大。
开发的思路整理

当前主要是为了升级redis3,针对官方的版本有过升级版本的redis4分支,通过该patch可以看出所有的开发的代码与修复的内容。

首先对比查看该patch与当前codis3.2稳定版本的patch对比,发现修改的内容并不算多但是为啥没有并入主分支原因不得而知。

redis改造的核心
slot信息的添加维护

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YYwMujfx-1616745704451)(/Users/wuzi/Desktop/屏幕快照 2021-03-17 下午3.51.07.png)]

redis的内存的存储的逻辑如上所述,基本上就是在初始化的时候就初始化16个DB结构来存储对应的数据。那对应的codis为了将每个Key都加上slot信息,就采用了如下的结果来存储。

codis为了实现slot信息的维护修改为了如下结构;

为每一个DB都新增加一个slot数组,每个slot数组保持对应slot的数据,这样就快速的完成了slot信息的维护管理,并且不需要过多的修改redis其他的源码流程;但是该方案的一个问题就是会加大内存的使用。为了保证slot数组的信息的同步只需要再添加和删除key和value的过程中,将对应的标记删除掉就行,即在源码中的dbAdd等函数和dbSyncDelete等函数中;

void dbAdd(redisDb *db, robj *key, robj *val) {sds copy = sdsdup(key->ptr);int retval = dictAdd(db->dict, copy, val);do {uint32_t crc;int hastag;int slot = slots_num(key->ptr, &crc, &hastag);dictAdd(db->hash_slots[slot], copy, (void *)(long)crc);if (hastag) {zslInsert(db->tagged_keys, (double)crc, sdsdup(key->ptr));}} while (0);serverAssertWithInfo(NULL,key,retval == DICT_OK);if (val->type == OBJ_LIST ||val->type == OBJ_ZSET ||val->type == OBJ_STREAM)signalKeyAsReady(db, key);if (server.cluster_enabled) slotToKeyAdd(key->ptr);
}...int dbSyncDelete(redisDb *db, robj *key) {/* Deleting an entry from the expires dict will not free the sds of* the key, because it is shared with the main dictionary. */if (dictSize(db->expires) > 0) dictDelete(db->expires,key->ptr);do {uint32_t crc;int hastag;int slot = slots_num(key->ptr, &crc, &hastag);if (dictDelete(db->hash_slots[slot], key->ptr) == DICT_OK) {if (hastag) {zslDelete(db->tagged_keys, (double)crc, key->ptr, NULL);}}} while (0);if (dictDelete(db->dict,key->ptr) == DICT_OK) {if (server.cluster_enabled) slotToKeyDel(key->ptr);return 1;} else {return 0;}
}
slot信息的迁移

在codis中,有关slot节点在各个组中的迁移主要是通过扩展redis的命令来实现的最主要的命令就是slotsmgrtslot-async和slotsrestore-async来实现的,该方案的主要逻辑如下;

#mermaid-svg-CCeHZM1R6QzGZl9e .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .label text{fill:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .node rect,#mermaid-svg-CCeHZM1R6QzGZl9e .node circle,#mermaid-svg-CCeHZM1R6QzGZl9e .node ellipse,#mermaid-svg-CCeHZM1R6QzGZl9e .node polygon,#mermaid-svg-CCeHZM1R6QzGZl9e .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-CCeHZM1R6QzGZl9e .node .label{text-align:center;fill:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .node.clickable{cursor:pointer}#mermaid-svg-CCeHZM1R6QzGZl9e .arrowheadPath{fill:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-CCeHZM1R6QzGZl9e .flowchart-link{stroke:#333;fill:none}#mermaid-svg-CCeHZM1R6QzGZl9e .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-CCeHZM1R6QzGZl9e .edgeLabel rect{opacity:0.9}#mermaid-svg-CCeHZM1R6QzGZl9e .edgeLabel span{color:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-CCeHZM1R6QzGZl9e .cluster text{fill:#333}#mermaid-svg-CCeHZM1R6QzGZl9e div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-CCeHZM1R6QzGZl9e .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-CCeHZM1R6QzGZl9e text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-CCeHZM1R6QzGZl9e .actor-line{stroke:grey}#mermaid-svg-CCeHZM1R6QzGZl9e .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-CCeHZM1R6QzGZl9e #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .sequenceNumber{fill:#fff}#mermaid-svg-CCeHZM1R6QzGZl9e #sequencenumber{fill:#333}#mermaid-svg-CCeHZM1R6QzGZl9e #crosshead path{fill:#333;stroke:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .messageText{fill:#333;stroke:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-CCeHZM1R6QzGZl9e .labelText,#mermaid-svg-CCeHZM1R6QzGZl9e .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-CCeHZM1R6QzGZl9e .loopText,#mermaid-svg-CCeHZM1R6QzGZl9e .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-CCeHZM1R6QzGZl9e .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-CCeHZM1R6QzGZl9e .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-CCeHZM1R6QzGZl9e .noteText,#mermaid-svg-CCeHZM1R6QzGZl9e .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-CCeHZM1R6QzGZl9e .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-CCeHZM1R6QzGZl9e .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-CCeHZM1R6QzGZl9e .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-CCeHZM1R6QzGZl9e .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CCeHZM1R6QzGZl9e .section{stroke:none;opacity:0.2}#mermaid-svg-CCeHZM1R6QzGZl9e .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-CCeHZM1R6QzGZl9e .section2{fill:#fff400}#mermaid-svg-CCeHZM1R6QzGZl9e .section1,#mermaid-svg-CCeHZM1R6QzGZl9e .section3{fill:#fff;opacity:0.2}#mermaid-svg-CCeHZM1R6QzGZl9e .sectionTitle0{fill:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .sectionTitle1{fill:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .sectionTitle2{fill:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .sectionTitle3{fill:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CCeHZM1R6QzGZl9e .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-CCeHZM1R6QzGZl9e .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CCeHZM1R6QzGZl9e .grid path{stroke-width:0}#mermaid-svg-CCeHZM1R6QzGZl9e .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-CCeHZM1R6QzGZl9e .task{stroke-width:2}#mermaid-svg-CCeHZM1R6QzGZl9e .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CCeHZM1R6QzGZl9e .taskText:not([font-size]){font-size:11px}#mermaid-svg-CCeHZM1R6QzGZl9e .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CCeHZM1R6QzGZl9e .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-CCeHZM1R6QzGZl9e .task.clickable{cursor:pointer}#mermaid-svg-CCeHZM1R6QzGZl9e .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-CCeHZM1R6QzGZl9e .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-CCeHZM1R6QzGZl9e .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-CCeHZM1R6QzGZl9e .taskText0,#mermaid-svg-CCeHZM1R6QzGZl9e .taskText1,#mermaid-svg-CCeHZM1R6QzGZl9e .taskText2,#mermaid-svg-CCeHZM1R6QzGZl9e .taskText3{fill:#fff}#mermaid-svg-CCeHZM1R6QzGZl9e .task0,#mermaid-svg-CCeHZM1R6QzGZl9e .task1,#mermaid-svg-CCeHZM1R6QzGZl9e .task2,#mermaid-svg-CCeHZM1R6QzGZl9e .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-CCeHZM1R6QzGZl9e .taskTextOutside0,#mermaid-svg-CCeHZM1R6QzGZl9e .taskTextOutside2{fill:#000}#mermaid-svg-CCeHZM1R6QzGZl9e .taskTextOutside1,#mermaid-svg-CCeHZM1R6QzGZl9e .taskTextOutside3{fill:#000}#mermaid-svg-CCeHZM1R6QzGZl9e .active0,#mermaid-svg-CCeHZM1R6QzGZl9e .active1,#mermaid-svg-CCeHZM1R6QzGZl9e .active2,#mermaid-svg-CCeHZM1R6QzGZl9e .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-CCeHZM1R6QzGZl9e .activeText0,#mermaid-svg-CCeHZM1R6QzGZl9e .activeText1,#mermaid-svg-CCeHZM1R6QzGZl9e .activeText2,#mermaid-svg-CCeHZM1R6QzGZl9e .activeText3{fill:#000 !important}#mermaid-svg-CCeHZM1R6QzGZl9e .done0,#mermaid-svg-CCeHZM1R6QzGZl9e .done1,#mermaid-svg-CCeHZM1R6QzGZl9e .done2,#mermaid-svg-CCeHZM1R6QzGZl9e .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-CCeHZM1R6QzGZl9e .doneText0,#mermaid-svg-CCeHZM1R6QzGZl9e .doneText1,#mermaid-svg-CCeHZM1R6QzGZl9e .doneText2,#mermaid-svg-CCeHZM1R6QzGZl9e .doneText3{fill:#000 !important}#mermaid-svg-CCeHZM1R6QzGZl9e .crit0,#mermaid-svg-CCeHZM1R6QzGZl9e .crit1,#mermaid-svg-CCeHZM1R6QzGZl9e .crit2,#mermaid-svg-CCeHZM1R6QzGZl9e .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-CCeHZM1R6QzGZl9e .activeCrit0,#mermaid-svg-CCeHZM1R6QzGZl9e .activeCrit1,#mermaid-svg-CCeHZM1R6QzGZl9e .activeCrit2,#mermaid-svg-CCeHZM1R6QzGZl9e .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-CCeHZM1R6QzGZl9e .doneCrit0,#mermaid-svg-CCeHZM1R6QzGZl9e .doneCrit1,#mermaid-svg-CCeHZM1R6QzGZl9e .doneCrit2,#mermaid-svg-CCeHZM1R6QzGZl9e .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-CCeHZM1R6QzGZl9e .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-CCeHZM1R6QzGZl9e .milestoneText{font-style:italic}#mermaid-svg-CCeHZM1R6QzGZl9e .doneCritText0,#mermaid-svg-CCeHZM1R6QzGZl9e .doneCritText1,#mermaid-svg-CCeHZM1R6QzGZl9e .doneCritText2,#mermaid-svg-CCeHZM1R6QzGZl9e .doneCritText3{fill:#000 !important}#mermaid-svg-CCeHZM1R6QzGZl9e .activeCritText0,#mermaid-svg-CCeHZM1R6QzGZl9e .activeCritText1,#mermaid-svg-CCeHZM1R6QzGZl9e .activeCritText2,#mermaid-svg-CCeHZM1R6QzGZl9e .activeCritText3{fill:#000 !important}#mermaid-svg-CCeHZM1R6QzGZl9e .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CCeHZM1R6QzGZl9e g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-CCeHZM1R6QzGZl9e g.classGroup text .title{font-weight:bolder}#mermaid-svg-CCeHZM1R6QzGZl9e g.clickable{cursor:pointer}#mermaid-svg-CCeHZM1R6QzGZl9e g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-CCeHZM1R6QzGZl9e g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-CCeHZM1R6QzGZl9e .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-CCeHZM1R6QzGZl9e .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-CCeHZM1R6QzGZl9e .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-CCeHZM1R6QzGZl9e .dashed-line{stroke-dasharray:3}#mermaid-svg-CCeHZM1R6QzGZl9e #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CCeHZM1R6QzGZl9e #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CCeHZM1R6QzGZl9e #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-CCeHZM1R6QzGZl9e #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-CCeHZM1R6QzGZl9e #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CCeHZM1R6QzGZl9e #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CCeHZM1R6QzGZl9e #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CCeHZM1R6QzGZl9e #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CCeHZM1R6QzGZl9e .commit-id,#mermaid-svg-CCeHZM1R6QzGZl9e .commit-msg,#mermaid-svg-CCeHZM1R6QzGZl9e .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CCeHZM1R6QzGZl9e .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CCeHZM1R6QzGZl9e .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CCeHZM1R6QzGZl9e g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CCeHZM1R6QzGZl9e g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-CCeHZM1R6QzGZl9e g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-CCeHZM1R6QzGZl9e g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-CCeHZM1R6QzGZl9e g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-CCeHZM1R6QzGZl9e g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-CCeHZM1R6QzGZl9e .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-CCeHZM1R6QzGZl9e .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-CCeHZM1R6QzGZl9e .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-CCeHZM1R6QzGZl9e .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-CCeHZM1R6QzGZl9e .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-CCeHZM1R6QzGZl9e .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-CCeHZM1R6QzGZl9e .edgeLabel text{fill:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CCeHZM1R6QzGZl9e .node circle.state-start{fill:black;stroke:black}#mermaid-svg-CCeHZM1R6QzGZl9e .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-CCeHZM1R6QzGZl9e #statediagram-barbEnd{fill:#9370db}#mermaid-svg-CCeHZM1R6QzGZl9e .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-CCeHZM1R6QzGZl9e .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-CCeHZM1R6QzGZl9e .statediagram-state .divider{stroke:#9370db}#mermaid-svg-CCeHZM1R6QzGZl9e .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-CCeHZM1R6QzGZl9e .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-CCeHZM1R6QzGZl9e .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-CCeHZM1R6QzGZl9e .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-CCeHZM1R6QzGZl9e .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-CCeHZM1R6QzGZl9e .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-CCeHZM1R6QzGZl9e .note-edge{stroke-dasharray:5}#mermaid-svg-CCeHZM1R6QzGZl9e .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-CCeHZM1R6QzGZl9e .error-icon{fill:#522}#mermaid-svg-CCeHZM1R6QzGZl9e .error-text{fill:#522;stroke:#522}#mermaid-svg-CCeHZM1R6QzGZl9e .edge-thickness-normal{stroke-width:2px}#mermaid-svg-CCeHZM1R6QzGZl9e .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-CCeHZM1R6QzGZl9e .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-CCeHZM1R6QzGZl9e .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-CCeHZM1R6QzGZl9e .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-CCeHZM1R6QzGZl9e .marker{fill:#333}#mermaid-svg-CCeHZM1R6QzGZl9e .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-CCeHZM1R6QzGZl9e {color: rgba(0, 0, 0, 0.75);font: ;}dashboardcodis_server_acodis_server_b迁移slots操作通过slotsmgrtslot-async命令来连接codis_server_b通过slotsrestore-async将对应的数据结构发生给adashboardcodis_server_acodis_server_b

通过在codis_server_a中创建一个client连接到codis_server_b,然后通过该client一直将数据通过命令发送给codis_server_b然后通过恢复数据来达到slot在各个server直接的迁移功能。

#mermaid-svg-khjQYZALxhYMNhFR .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-khjQYZALxhYMNhFR .label text{fill:#333}#mermaid-svg-khjQYZALxhYMNhFR .node rect,#mermaid-svg-khjQYZALxhYMNhFR .node circle,#mermaid-svg-khjQYZALxhYMNhFR .node ellipse,#mermaid-svg-khjQYZALxhYMNhFR .node polygon,#mermaid-svg-khjQYZALxhYMNhFR .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-khjQYZALxhYMNhFR .node .label{text-align:center;fill:#333}#mermaid-svg-khjQYZALxhYMNhFR .node.clickable{cursor:pointer}#mermaid-svg-khjQYZALxhYMNhFR .arrowheadPath{fill:#333}#mermaid-svg-khjQYZALxhYMNhFR .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-khjQYZALxhYMNhFR .flowchart-link{stroke:#333;fill:none}#mermaid-svg-khjQYZALxhYMNhFR .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-khjQYZALxhYMNhFR .edgeLabel rect{opacity:0.9}#mermaid-svg-khjQYZALxhYMNhFR .edgeLabel span{color:#333}#mermaid-svg-khjQYZALxhYMNhFR .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-khjQYZALxhYMNhFR .cluster text{fill:#333}#mermaid-svg-khjQYZALxhYMNhFR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-khjQYZALxhYMNhFR .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-khjQYZALxhYMNhFR text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-khjQYZALxhYMNhFR .actor-line{stroke:grey}#mermaid-svg-khjQYZALxhYMNhFR .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-khjQYZALxhYMNhFR .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-khjQYZALxhYMNhFR #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-khjQYZALxhYMNhFR .sequenceNumber{fill:#fff}#mermaid-svg-khjQYZALxhYMNhFR #sequencenumber{fill:#333}#mermaid-svg-khjQYZALxhYMNhFR #crosshead path{fill:#333;stroke:#333}#mermaid-svg-khjQYZALxhYMNhFR .messageText{fill:#333;stroke:#333}#mermaid-svg-khjQYZALxhYMNhFR .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-khjQYZALxhYMNhFR .labelText,#mermaid-svg-khjQYZALxhYMNhFR .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-khjQYZALxhYMNhFR .loopText,#mermaid-svg-khjQYZALxhYMNhFR .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-khjQYZALxhYMNhFR .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-khjQYZALxhYMNhFR .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-khjQYZALxhYMNhFR .noteText,#mermaid-svg-khjQYZALxhYMNhFR .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-khjQYZALxhYMNhFR .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-khjQYZALxhYMNhFR .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-khjQYZALxhYMNhFR .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-khjQYZALxhYMNhFR .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-khjQYZALxhYMNhFR .section{stroke:none;opacity:0.2}#mermaid-svg-khjQYZALxhYMNhFR .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-khjQYZALxhYMNhFR .section2{fill:#fff400}#mermaid-svg-khjQYZALxhYMNhFR .section1,#mermaid-svg-khjQYZALxhYMNhFR .section3{fill:#fff;opacity:0.2}#mermaid-svg-khjQYZALxhYMNhFR .sectionTitle0{fill:#333}#mermaid-svg-khjQYZALxhYMNhFR .sectionTitle1{fill:#333}#mermaid-svg-khjQYZALxhYMNhFR .sectionTitle2{fill:#333}#mermaid-svg-khjQYZALxhYMNhFR .sectionTitle3{fill:#333}#mermaid-svg-khjQYZALxhYMNhFR .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-khjQYZALxhYMNhFR .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-khjQYZALxhYMNhFR .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-khjQYZALxhYMNhFR .grid path{stroke-width:0}#mermaid-svg-khjQYZALxhYMNhFR .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-khjQYZALxhYMNhFR .task{stroke-width:2}#mermaid-svg-khjQYZALxhYMNhFR .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-khjQYZALxhYMNhFR .taskText:not([font-size]){font-size:11px}#mermaid-svg-khjQYZALxhYMNhFR .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-khjQYZALxhYMNhFR .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-khjQYZALxhYMNhFR .task.clickable{cursor:pointer}#mermaid-svg-khjQYZALxhYMNhFR .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-khjQYZALxhYMNhFR .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-khjQYZALxhYMNhFR .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-khjQYZALxhYMNhFR .taskText0,#mermaid-svg-khjQYZALxhYMNhFR .taskText1,#mermaid-svg-khjQYZALxhYMNhFR .taskText2,#mermaid-svg-khjQYZALxhYMNhFR .taskText3{fill:#fff}#mermaid-svg-khjQYZALxhYMNhFR .task0,#mermaid-svg-khjQYZALxhYMNhFR .task1,#mermaid-svg-khjQYZALxhYMNhFR .task2,#mermaid-svg-khjQYZALxhYMNhFR .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-khjQYZALxhYMNhFR .taskTextOutside0,#mermaid-svg-khjQYZALxhYMNhFR .taskTextOutside2{fill:#000}#mermaid-svg-khjQYZALxhYMNhFR .taskTextOutside1,#mermaid-svg-khjQYZALxhYMNhFR .taskTextOutside3{fill:#000}#mermaid-svg-khjQYZALxhYMNhFR .active0,#mermaid-svg-khjQYZALxhYMNhFR .active1,#mermaid-svg-khjQYZALxhYMNhFR .active2,#mermaid-svg-khjQYZALxhYMNhFR .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-khjQYZALxhYMNhFR .activeText0,#mermaid-svg-khjQYZALxhYMNhFR .activeText1,#mermaid-svg-khjQYZALxhYMNhFR .activeText2,#mermaid-svg-khjQYZALxhYMNhFR .activeText3{fill:#000 !important}#mermaid-svg-khjQYZALxhYMNhFR .done0,#mermaid-svg-khjQYZALxhYMNhFR .done1,#mermaid-svg-khjQYZALxhYMNhFR .done2,#mermaid-svg-khjQYZALxhYMNhFR .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-khjQYZALxhYMNhFR .doneText0,#mermaid-svg-khjQYZALxhYMNhFR .doneText1,#mermaid-svg-khjQYZALxhYMNhFR .doneText2,#mermaid-svg-khjQYZALxhYMNhFR .doneText3{fill:#000 !important}#mermaid-svg-khjQYZALxhYMNhFR .crit0,#mermaid-svg-khjQYZALxhYMNhFR .crit1,#mermaid-svg-khjQYZALxhYMNhFR .crit2,#mermaid-svg-khjQYZALxhYMNhFR .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-khjQYZALxhYMNhFR .activeCrit0,#mermaid-svg-khjQYZALxhYMNhFR .activeCrit1,#mermaid-svg-khjQYZALxhYMNhFR .activeCrit2,#mermaid-svg-khjQYZALxhYMNhFR .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-khjQYZALxhYMNhFR .doneCrit0,#mermaid-svg-khjQYZALxhYMNhFR .doneCrit1,#mermaid-svg-khjQYZALxhYMNhFR .doneCrit2,#mermaid-svg-khjQYZALxhYMNhFR .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-khjQYZALxhYMNhFR .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-khjQYZALxhYMNhFR .milestoneText{font-style:italic}#mermaid-svg-khjQYZALxhYMNhFR .doneCritText0,#mermaid-svg-khjQYZALxhYMNhFR .doneCritText1,#mermaid-svg-khjQYZALxhYMNhFR .doneCritText2,#mermaid-svg-khjQYZALxhYMNhFR .doneCritText3{fill:#000 !important}#mermaid-svg-khjQYZALxhYMNhFR .activeCritText0,#mermaid-svg-khjQYZALxhYMNhFR .activeCritText1,#mermaid-svg-khjQYZALxhYMNhFR .activeCritText2,#mermaid-svg-khjQYZALxhYMNhFR .activeCritText3{fill:#000 !important}#mermaid-svg-khjQYZALxhYMNhFR .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-khjQYZALxhYMNhFR g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-khjQYZALxhYMNhFR g.classGroup text .title{font-weight:bolder}#mermaid-svg-khjQYZALxhYMNhFR g.clickable{cursor:pointer}#mermaid-svg-khjQYZALxhYMNhFR g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-khjQYZALxhYMNhFR g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-khjQYZALxhYMNhFR .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-khjQYZALxhYMNhFR .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-khjQYZALxhYMNhFR .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-khjQYZALxhYMNhFR .dashed-line{stroke-dasharray:3}#mermaid-svg-khjQYZALxhYMNhFR #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-khjQYZALxhYMNhFR #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-khjQYZALxhYMNhFR #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-khjQYZALxhYMNhFR #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-khjQYZALxhYMNhFR #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-khjQYZALxhYMNhFR #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-khjQYZALxhYMNhFR #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-khjQYZALxhYMNhFR #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-khjQYZALxhYMNhFR .commit-id,#mermaid-svg-khjQYZALxhYMNhFR .commit-msg,#mermaid-svg-khjQYZALxhYMNhFR .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-khjQYZALxhYMNhFR .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-khjQYZALxhYMNhFR .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-khjQYZALxhYMNhFR g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-khjQYZALxhYMNhFR g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-khjQYZALxhYMNhFR g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-khjQYZALxhYMNhFR g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-khjQYZALxhYMNhFR g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-khjQYZALxhYMNhFR g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-khjQYZALxhYMNhFR .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-khjQYZALxhYMNhFR .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-khjQYZALxhYMNhFR .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-khjQYZALxhYMNhFR .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-khjQYZALxhYMNhFR .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-khjQYZALxhYMNhFR .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-khjQYZALxhYMNhFR .edgeLabel text{fill:#333}#mermaid-svg-khjQYZALxhYMNhFR .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-khjQYZALxhYMNhFR .node circle.state-start{fill:black;stroke:black}#mermaid-svg-khjQYZALxhYMNhFR .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-khjQYZALxhYMNhFR #statediagram-barbEnd{fill:#9370db}#mermaid-svg-khjQYZALxhYMNhFR .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-khjQYZALxhYMNhFR .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-khjQYZALxhYMNhFR .statediagram-state .divider{stroke:#9370db}#mermaid-svg-khjQYZALxhYMNhFR .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-khjQYZALxhYMNhFR .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-khjQYZALxhYMNhFR .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-khjQYZALxhYMNhFR .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-khjQYZALxhYMNhFR .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-khjQYZALxhYMNhFR .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-khjQYZALxhYMNhFR .note-edge{stroke-dasharray:5}#mermaid-svg-khjQYZALxhYMNhFR .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-khjQYZALxhYMNhFR .error-icon{fill:#522}#mermaid-svg-khjQYZALxhYMNhFR .error-text{fill:#522;stroke:#522}#mermaid-svg-khjQYZALxhYMNhFR .edge-thickness-normal{stroke-width:2px}#mermaid-svg-khjQYZALxhYMNhFR .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-khjQYZALxhYMNhFR .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-khjQYZALxhYMNhFR .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-khjQYZALxhYMNhFR .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-khjQYZALxhYMNhFR .marker{fill:#333}#mermaid-svg-khjQYZALxhYMNhFR .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-khjQYZALxhYMNhFR {color: rgba(0, 0, 0, 0.75);font: ;}clientcodis_proxycodis_server_a通过zk或者直连proxy连接到codis_proxy计算slot的值然后根据分配信息连接a响应数据返回返回客户端clientcodis_proxycodis_server_a

总结

当前的codis3.2基本上处于维护的状态并无新功能迭代开发的计划,一方面在kv领域也出现了更多好的分布式的技术方案如tidb和redis本身支持实现的分布式方案,并且codis在适用场景上面越来越不容易满足当今多样化的需求,升级redis3到redis6这个方案个人感觉还是只是一个过度方案,并没有在新场景下提供解决方案。由于本人才疏学浅,如有错误请批评指正。

codis3.2升级redis3.11到redis6.0.10调研相关推荐

  1. 一台服务器上使用docker安装redis6.0.10一主两从以及哨兵模式

    查看redis官网,发现新版稳定为:redis6.0.10 先决条件: 服务器使用我的阿里云服务器:CentOS 7.6 64位 安装docker环境:https://blog.csdn.net/we ...

  2. Linux安装Redis6.0.10步骤

    Linux安装Redis6.0.10步骤 1. 将安装包放到/opt目录下 2. 解压包文件 3. 查看文件 4. 进入解压后的文件夹 5. 安装gcc和c++环境 6. 查看gcc版本 7. 升级g ...

  3. oracle10 升级为11,Oracle10.2.0.4升级至Oracle11.2.0.3错误手记一则

    今天在做一个库的升级,本以为和由10.2.0.1升级至10.2.0.4那样,于是直接就做了,没有去做由10g升级至11g之前的准备工作. 于是直接就使用11g的软件把10g的启动到upgrade状态, ...

  4. StackFlow 之升级JDK.11(JDK.9/JDK.10)

    前言 JDK版本升级中的漫长的坑- 最近因项目需求需要对JDK版本升级,之前使用的JDK1.8大版本,这个版本使用起来还是很得心应手的.但升级过程中遇到了相当多的问题,其中有一些JDK自己本身存在的B ...

  5. CentOs7.8安装Redis6.0.9版本(主要是阿里云机器安装)详细步骤

    Redis单机版 一.首先进入Redis官网下载redis 官网下载链接:https://redis.io/download 二.安装Redis 1.切换到Linux下的/usr/local/目录下 ...

  6. OGG 的最新版本Version 11.2.1.0.25 BLR 19358139– 1 September 2014

    Version 11.2.1.0.25 BLR 19358139  fix了如下的bug: 19358139 - GoldenGate parsing multiple times. Cache th ...

  7. Windows 11 即将问世 | Windows 10 和 Windows 11 该如何抉择

    全新 Windows 11 将于 10 月 5 日上市,微软宣布了运行新操作系统所需的最低配置要求.了解这一点后,你就可以查看你的 Windows10 系统是否能够完成升级 Windows 11 即将 ...

  8. Spark Streaming 2.0 读取Kafka 0.10 小例子

    环境版本: Scala 2.11.8; Kafka 0.10.0.1; Spark 2.0.0 如需Scala 2.10.5; Spark 1.6.0; Kafka 0.10.0.1版本请看这篇:Fl ...

  9. oracle 10.2 64位,Oracle 10.2.0.5 x64升级到11.2.0.3 x64

    说明:11g数据库现在新部署的数量也很多的,对于10g数据库,现在整理一下10g到11g的升级过程.10.2.0.2以上版本才能升级到11.2.0.3版本. 升级说明:10.2.0.5(64)-> ...

最新文章

  1. 简单认识Hexo的目录结构
  2. Object+C语法快速入门
  3. redis的watch命令没有ABA的问题
  4. Vue.js not detected
  5. LeetCode 1678. 设计 Goal 解析器
  6. BugkuCTF-WEB题网站被黑
  7. python另一个程序正在使用此文件_另一个程序正在使用此文件,进程无法访问
  8. fatal error: alsa/asoundlib.h: 没有那个文件或目录
  9. 大数组,找某数字的左,右边界
  10. javasocket编程面试题,小白也能看明白
  11. 魔兽国服修改服务器地址,魔兽国服退役服务器上架暴雪官方商店
  12. linux 获取eth0(指定网卡)网卡的IP地址(或MAC地址)
  13. maven 为html赋版本号,maven-replacer-plugin 静态资源版本号解决方案(css/js等)
  14. 02C++对C的增强
  15. 爱情故事:追忆似水流年 回味永恒的爱恋
  16. ICV:中国智能驾驶领跑全球,2026年L2级汽车销量将占全球44%
  17. RIPS user guide for fresh
  18. 数字网络监控系统解决方案1
  19. PyQT5 (四十三) 在 QTableWidget 表格中设置单元格的字体和颜色 的案例
  20. 黑盒测试方法五(场景法)

热门文章

  1. 盘一盘 2021 年程序员们喜欢的网站数据
  2. AI 语言模型真的是越大越好吗?这个模型优于 Gopher
  3. 这是一个好问题:既然机器可以学习,它们能忘掉吗?
  4. 从AI、加密货币到火星任务,一种更强大、更稳定的存储设备
  5. 四款5G版iPhone 12齐发,苹果股价却应声而跌
  6. AWS 中国宁夏和北京区正式上线 Amazon SageMaker,中国用户终于能用到新工具和功能!
  7. 通俗易懂:图卷积神经网络入门详解
  8. 《深度学习500问》,川大优秀毕业生的诚意之作
  9. 500多页的机器学习入门笔记,下载超5万次,背后都有什么故事?
  10. 公开课 | 微信高级研究员解析深度学习在NLP中的发展和应用