【Redis】| 总结/Edison Zhou 1Redis集群方案一:Codis
<article data-content="[{" type":"block","id":"tjna-1649732218319","name":"paragraph","data":{},"nodes":[{"type":"text","id":"8ufx-1649732218317","leaves":[{"text":"在redis中存在一些“读取-修改-写回”的操作流程(","marks":[]},{"text":"read-modify-write,="" rmw","marks":[{"type":"bold"}]},{"text":"),并发的rmw操作可能会导致数据错误,因此redis提供了两种保证并发访问正确性的方法:","marks":[]}]}],"state":{}},{"type":"block","id":"hcso-1649732493872","name":"list-item","data":{"listid":"1lzp-1649732495442","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"dwnb-1649732493870","leaves":[{"text":"加锁","marks":[{"type":"bold"}]}]}],"state":{"index":1}},{"type":"block","id":"lvmg-1649732518991","name":"list-item","data":{"listid":"1lzp-1649732495442","listtype":"unordered","listlevel":2},"nodes":[{"type":"text","id":"eq0d-1649732518990","leaves":[{"text":"优点:简单易行,适合于多个客户端加锁的场景。","marks":[]}]}],"state":{"index":1}},{"type":"block","id":"lpvi-1649744608911","name":"list-item","data":{"listid":"1lzp-1649732495442","listtype":"unordered","listlevel":2},"nodes":[{"type":"text","id":"etud-1649744608910","leaves":[{"text":"缺点:一来加锁过多会降低系统的并发访问性能,二来redis客户端加锁时需要用到分布式锁,分布式锁实现复杂。","marks":[]}]}],"state":{"index":2}},{"type":"block","id":"mou6-1649732497834","name":"list-item","data":{"listid":"1lzp-1649732495442","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"4v7o-1649732497832","leaves":[{"text":"原子操作","marks":[{"type":"bold"}]}]}],"state":{"index":2}},{"type":"block","id":"zojr-1649732883779","name":"list-item","data":{"listid":"1lzp-1649732495442","listtype":"unordered","listlevel":2},"nodes":[{"type":"text","id":"y0c2-1649732883777","leaves":[{"text":"优点:","marks":[]},{"text":"执行过程保持原子性的操作,而且原子操作执行时并不需要再加锁,实现了","marks":[{"type":"fontsize","value":14}]},{"text":"无锁操作","marks":[{"type":"fontsize","value":14},{"type":"bold"}]},{"text":"。","marks":[{"type":"fontsize","value":14}]}]}],"state":{"index":1}},{"type":"block","id":"qpcd-1649745357333","name":"list-item","data":{"listid":"1lzp-1649732495442","listtype":"unordered","listlevel":2},"nodes":[{"type":"text","id":"7nqn-1649745357331","leaves":[{"text":"缺点:如果将过多的操作都放入原子操作中,也会降低redis的并发性能。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}}]"=""> Codis整体架构 <article data-content="[{" type":"block","id":"d1cu-1649906303140","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"z6vf-1649906303141","leaves":[{"text":"codis集群的整体架构和关键组件如下所示:中心思想是","marks":[]},{"text":"基于代理(proxy)","marks":[{"type":"bold"}]},{"text":"设计实现","marks":[]}]}],"state":{}},{"type":"block","id":"fuba-1649906318791","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 15762="" webresource71daf84e294d18b9bf1cfa41617e7fd3","width":513,"height":325,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresource71daf84e294d18b9bf1cfa41617e7fd3","initialsize":{"width":513,"height":323},"loading":false}},{"type":"block","id":"gurl-1649907095910","name":"paragraph","data":{},"nodes":[{"type":"text","id":"llig-1649907095911","leaves":[{"text":"codis集群保证高可靠性的架构:","marks":[]},{"text":"配置了="" server="" group="" 的="" codis="" 集群架构,在="" 集群中,通过部署="" 和哨兵集群,实现="" 的主从切换,提升集群可靠性。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}},{"type":"block","id":"fbw7-1649907114754","name":"image","data":{"version":1,"url":"https:="" 15772="" webresourcee0ff841981af3e08688cfa67a21ce1fd","width":516,"height":343,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresourcee0ff841981af3e08688cfa67a21ce1fd","initialsize":{"width":516,"height":343},"loading":false}},{"type":"block","id":"khai-1649907218277","name":"quote","data":{},"nodes":[{"type":"block","id":"xz5h-1649907202936","name":"paragraph","data":{},"nodes":[{"type":"text","id":"ilrr-1649907202937","leaves":[{"text":"note:","marks":[{"type":"bold"}]},{"text":"对于="" dashboard="" 和="" fe="" 来说,它们主要提供配置管理和管理员手工操作,负载压力不大,所以,它们的可靠性可以不用额外进行保证了。","marks":[]}]}]}],"state":{}}]"=""> Codis集群的整体架构和关键组件如下所示,其中心思想是基于代理(Proxy)设计实现。 Codis集群保证高可靠性的架构:配置了 server group 的 Codis 集群架构,在 Codis 集群中,通过部署 server group 和哨兵集群,实现 codis server 的主从切换,提升集群可靠性。 NOTE:对于 codis dashboard 和 codis fe 来说,它们主要提供配置管理和管理员手工操作,负载压力不大,所以,它们的可靠性可以不用额外进行保证了。 </article> Codis处理流程 <article data-content="[{" type":"block","id":"d1cu-1649906303140","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"z6vf-1649906303141","leaves":[{"text":"codis集群的整体架构和关键组件如下所示:中心思想是","marks":[]},{"text":"基于代理(proxy)","marks":[{"type":"bold"}]},{"text":"设计实现","marks":[]}]}],"state":{}},{"type":"block","id":"fuba-1649906318791","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 15762="" webresource71daf84e294d18b9bf1cfa41617e7fd3","width":513,"height":325,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresource71daf84e294d18b9bf1cfa41617e7fd3","initialsize":{"width":513,"height":323},"loading":false}},{"type":"block","id":"gurl-1649907095910","name":"paragraph","data":{},"nodes":[{"type":"text","id":"llig-1649907095911","leaves":[{"text":"codis集群保证高可靠性的架构:","marks":[]},{"text":"配置了="" server="" group="" 的="" codis="" 集群架构,在="" 集群中,通过部署="" 和哨兵集群,实现="" 的主从切换,提升集群可靠性。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}},{"type":"block","id":"fbw7-1649907114754","name":"image","data":{"version":1,"url":"https:="" 15772="" webresourcee0ff841981af3e08688cfa67a21ce1fd","width":516,"height":343,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresourcee0ff841981af3e08688cfa67a21ce1fd","initialsize":{"width":516,"height":343},"loading":false}},{"type":"block","id":"khai-1649907218277","name":"quote","data":{},"nodes":[{"type":"block","id":"xz5h-1649907202936","name":"paragraph","data":{},"nodes":[{"type":"text","id":"ilrr-1649907202937","leaves":[{"text":"note:","marks":[{"type":"bold"}]},{"text":"对于="" dashboard="" 和="" fe="" 来说,它们主要提供配置管理和管理员手工操作,负载压力不大,所以,它们的可靠性可以不用额外进行保证了。","marks":[]}]}]}],"state":{}}]"=""><article data-content="[{" type":"block","id":"rlwi-1649906356457","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"xjjo-1649906356458","leaves":[{"text":"一个请求的整体处理如下图所示:","marks":[]}]}],"state":{}}]"=""> 一个请求的整体处理如下图所示: </article><article data-content="[{" type":"block","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 15766="" webresource5cad05ff083168afabf46021a6788534","width":493,"height":341,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresource5cad05ff083168afabf46021a6788534","initialsize":{"width":493,"height":342},"loading":false}}]"=""> </article></article> 数据映射分布 <article data-content="[{" type":"block","id":"d1cu-1649906303140","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"z6vf-1649906303141","leaves":[{"text":"codis集群的整体架构和关键组件如下所示:中心思想是","marks":[]},{"text":"基于代理(proxy)","marks":[{"type":"bold"}]},{"text":"设计实现","marks":[]}]}],"state":{}},{"type":"block","id":"fuba-1649906318791","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 15762="" webresource71daf84e294d18b9bf1cfa41617e7fd3","width":513,"height":325,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresource71daf84e294d18b9bf1cfa41617e7fd3","initialsize":{"width":513,"height":323},"loading":false}},{"type":"block","id":"gurl-1649907095910","name":"paragraph","data":{},"nodes":[{"type":"text","id":"llig-1649907095911","leaves":[{"text":"codis集群保证高可靠性的架构:","marks":[]},{"text":"配置了="" server="" group="" 的="" codis="" 集群架构,在="" 集群中,通过部署="" 和哨兵集群,实现="" 的主从切换,提升集群可靠性。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}},{"type":"block","id":"fbw7-1649907114754","name":"image","data":{"version":1,"url":"https:="" 15772="" webresourcee0ff841981af3e08688cfa67a21ce1fd","width":516,"height":343,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresourcee0ff841981af3e08688cfa67a21ce1fd","initialsize":{"width":516,"height":343},"loading":false}},{"type":"block","id":"khai-1649907218277","name":"quote","data":{},"nodes":[{"type":"block","id":"xz5h-1649907202936","name":"paragraph","data":{},"nodes":[{"type":"text","id":"ilrr-1649907202937","leaves":[{"text":"note:","marks":[{"type":"bold"}]},{"text":"对于="" dashboard="" 和="" fe="" 来说,它们主要提供配置管理和管理员手工操作,负载压力不大,所以,它们的可靠性可以不用额外进行保证了。","marks":[]}]}]}],"state":{}}]"=""><article data-content="[{" type":"block","id":"rlwi-1649906356457","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"xjjo-1649906356458","leaves":[{"text":"一个请求的整体处理如下图所示:","marks":[]}]}],"state":{}}]"=""><article data-content="[{" type":"block","id":"w148-1649907578004","name":"paragraph","data":{},"nodes":[{"type":"text","id":"mrr6-1649907578005","leaves":[{"text":"在数据分布的实现方法上,codis="" 和="" redis="" cluster="" 很相似,都采用了="" key="" 映射到="" slot、slot="" 再分配到实例上的机制。但是,codis是通过codis="" dashboard分配修改的,并保存在zookeeper集群中。而在redis="" cluster中,数据路由表是通过每个实例间的通信传递的,最后在每个实例上保存一份。","marks":[]}]}],"state":{}}]"=""><article data-content="[{" type":"block","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 15785="" webresource894e727b9807e7f72d90cb40e486c7e5","width":499,"height":240,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresource894e727b9807e7f72d90cb40e486c7e5","initialsize":{"width":499,"height":240},"loading":false}}]"=""> </article> 在数据分布的实现方法上,Codis 和 Redis Cluster 很相似,都采用了 key 映射到 Slot、Slot 再分配到实例上的机制。但是,Codis是通过Codis Dashboard分配修改的,并保存在ZooKeeper集群中。而在Redis Cluster中,数据路由表是通过每个实例间的通信传递的,最后在每个实例上保存一份。 </article></article></article></article><article data-content="[{" type":"block","id":"uwmw-1649672350607","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"ka8i-1649672350608","leaves":[{"text":"在应用服务端有时会存在一个事务性操作,需要几个操作都保证事务的原子性。当redis延迟增加,就会拖累应用服务端整个事务的执行。","marks":[]}]}],"state":{}}]"=""><article data-content="[{" type":"block","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 15322="" webresource3a974f12690d162f05a5e38fc33445a6","width":417,"height":197,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresource3a974f12690d162f05a5e38fc33445a6","initialsize":{"width":417,"height":197},"loading":false}}]"=""><article data-content="[{" type":"block","id":"9efd-1649732853416","name":"paragraph","data":{},"nodes":[{"type":"text","id":"yvop-1649732853414","leaves":[{"text":"注意事项:如果","marks":[]},{"text":"只是读操作,即使客户端有多个线程并发执行这两个操作,也不会改变任何值,所以并不需要保证原子性,就不建议把它们放到="" lua="" 脚本中了。如果将过多的操作都放入lua脚本中进行原子操作,也会降低redis的并发性能。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}}]"="">
</article></article></article> 2Redis集群方案二:Redis Cluster <article data-content="[{" type":"block","id":"u8kx-1649672351286","name":"heading","data":{"level":"h2"},"nodes":[{"type":"text","id":"cmdw-1649672351287","leaves":[{"text":"(1)查看redis的响应延迟","marks":[{"type":"bold"},{"type":"fontsize","value":22}]}]}]},{"type":"block","id":"s3zs-1649672874631","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"f7xy-1649672874632","leaves":[{"text":"在某时刻,如果redis实例的响应延迟很高,如果持续时间不长,那可能叫延迟“毛刺”。但如果持续时间较长,那就可以认定redis变慢了。","marks":[]}]}],"state":{}},{"type":"block","id":"0lgt-1649672965051","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"szgi-1649672965042","leaves":[{"text":"这种方法是看="" redis="" 延迟的绝对值,但需要根据不同软硬件环境来综合看待。","marks":[]}]}],"state":{}}]"=""> <article data-content="[{" type":"block","id":"wi1m-1649905025863","name":"paragraph","data":{},"nodes":[{"type":"text","id":"ybsg-1649905025864","leaves":[{"text":"redis="" 3.0之后官方提供的切片集群方案,","marks":[]},{"text":"中心思想是","marks":[{"type":"fontsize","value":14}]},{"text":"去中心化","marks":[{"type":"fontsize","value":14},{"type":"bold"}]},{"text":"设计实现。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}}]"="">Redis 3.0之后官方提供的切片集群方案,中心思想是去中心化设计实现。 </article><article data-content="[{" type":"block","id":"pn0u-1649844808104","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"a99l-1649844808106","leaves":[{"text":"秒杀场景分成秒杀前、秒杀中和秒杀后三个阶段。redis主要参与秒杀中这个阶段中的两个重要环节:","marks":[]},{"text":"需要查验和扣减商品库存。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}},{"type":"block","id":"iewg-1649844980000","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"f5jm-1649844979998","leaves":[{"text":"一来库存查验会面临大量的高并发请求,二来库存扣减又需要和库存查验一起执行,以保证原子性。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}}]"=""><article data-content="[{" type":"block","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 15794="" webresource515f04a0364245b94ac34c55baa314ae","width":309,"height":404,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresource515f04a0364245b94ac34c55baa314ae","initialsize":{"width":309,"height":401},"loading":false}}]"=""></article></article><article data-content="[{" type":"block","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 15726="" webresourceabe84950d31381ffb1e38616aa90f9b0","width":411,"height":300,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresourceabe84950d31381ffb1e38616aa90f9b0","initialsize":{"width":411,"height":299},"loading":false}}]"=""><article data-content="[{" type":"block","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 15798="" webresource7d3f36a6e91c3ca25d6d4759c80a7b3f","width":334,"height":279,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresource7d3f36a6e91c3ca25d6d4759c80a7b3f","initialsize":{"width":334,"height":279},"loading":false}}]"=""></article></article><article data-content="[{" type":"block","id":"rt5b-1649672977984","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"squw-1649672977985","leaves":[{"text":"基线性能是指","marks":[]},{"text":"一个系统在低压力、无干扰下的基本性能,这个性能由当前的软硬件配置决定。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}},{"type":"block","id":"cg1g-1649673025386","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"wbg9-1649673025384","leaves":[{"text":"redis-cli="" 命令提供了–intrinsic-latency="" 选项,可以用来监测和统计测试期间内的最大延迟,","marks":[]},{"text":"这个延迟可以作为="" redis="" 的基线性能","marks":[{"type":"bold"}]},{"text":"。例如,下面的命令结果打印了120s内的最大延迟,可以看出119us。","marks":[]}]}],"state":{}}]"="">数据映射分布 <article data-content="[{" type":"block","id":"edqg-1649907920351","name":"paragraph","data":{},"nodes":[{"type":"text","id":"qswg-1649907920352","leaves":[{"text":"需要注意的是:","marks":[]},{"text":"如果是手动分配哈希槽,需要手动把="" 16384="" 个槽都分配完,否则="" redis="" 集群无法正常工作。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}}]"=""><article data-content="[{" type":"block","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 15782="" webresourceffa90dbc183e6c272a8db7f373766c11","width":481,"height":247,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresourceffa90dbc183e6c272a8db7f373766c11","initialsize":{"width":481,"height":245},"loading":false}}]"=""></article>需要注意的是:如果是手动分配哈希槽,需要手动把 16384 个槽都分配完,否则 Redis 集群无法正常工作。 </article></article><article data-content="[{" type":"block","id":"b3fl-1649673310103","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"dv6j-1649673310101","leaves":[{"text":"如果redis运行在虚拟化环境中,其基线性能相较纯物理机部署会有一些性能消耗,因此,其基线性能会较高一些。","marks":[]}]}],"state":{}},{"type":"block","id":"z9iy-1649673500561","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"annk-1649673500559","leaves":[{"text":"一般情况下,对于基线性能,我们只考虑服务端软硬件环境的影响","marks":[{"type":"bold"}]},{"text":",不考虑网络对基线性能的影响。如果需要排查网络对redis的性能影响,可以使用iperf这样的工具,观察网络延迟情况。如果这个网络延迟较高,那么可能网络环境中存在有大流量的其他应用程序在运行,导致网络拥塞了。","marks":[]}]}],"state":{}}]"=""><article data-content="[{" type":"block","id":"vase-1649750079414","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"irwu-1649750079412","leaves":[{"text":"让客户端和多个独立的="" redis="" 实例依次请求加锁,","marks":[{"type":"fontsize","value":14}]},{"text":"如果客户端能够和","marks":[{"type":"fontsize","value":14},{"type":"bold"}]},{"text":"半数以上","marks":[{"type":"fontsize","value":18},{"type":"bold"}]},{"text":"的实例成功地完成加锁操作","marks":[{"type":"fontsize","value":14},{"type":"bold"}]},{"text":",那么我们就认为,客户端成功地获得分布式锁了,否则加锁失败。即使单个实例发生了故障,锁变量也不会丢失,不会影响客户端进行锁操作。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}}]"=""><article data-content="[{" type":"block","id":"uvc3-1649836259559","name":"paragraph","data":{},"nodes":[{"type":"text","id":"rjhi-1649836259558","leaves":[{"text":"使用扩展:对于大型秒杀活动,可以","marks":[]},{"text":"使用redis切片集群中的不同实例来分别保存分布式锁和商品库存信息","marks":[{"type":"bold"}]},{"text":"。这样可以将获取分布式锁="" 和="" 查询商品库存="" 的请求压力分摊开来,减轻保存库存信息的redis实例的压力。此外,也建议不要将秒杀商品的库存信息和日常系统的数据保存在同一个redis实例,避免干扰业务系统的正常运行。","marks":[]}]}],"state":{}}]"="">
3两种方案对比 <article data-content="[{" type":"block","id":"d00n-1649836276251","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"x4oo-1649836276252","leaves":[{"text":"对于秒杀场景来说,只用="" redis="" 是不够的。秒杀系统是一个系统性工程,redis="" 实现了对库存查验和扣减这个环节的支撑,其他环节也需要考虑支持:","marks":[]}]}],"state":{}},{"type":"block","id":"mjxw-1649845940463","name":"list-item","data":{"listid":"zrvj-1649846217569","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"xhci-1649845940462","leaves":[{"text":"前端静态页面的设计","marks":[{"type":"bold"}]},{"text":"。秒杀页面上能静态化处理的页面元素,我们都要尽量静态化,这样可以充分利用="" cdn="" 或浏览器缓存服务秒杀开始前的请求。","marks":[]}]}],"state":{"index":1}},{"type":"block","id":"csfq-1649846202571","name":"list-item","data":{"listid":"zrvj-1649846217569","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"fuai-1649846202570","leaves":[{"text":"请求拦截和流控","marks":[{"type":"bold"}]},{"text":"。在秒杀系统的接入层,对恶意请求进行拦截,避免对系统的恶意攻击,例如使用黑名单禁止恶意="" ip="" 进行访问。如果="" 实例的访问压力过大,为了避免实例崩溃,我们也需要在接入层进行限流,控制进入秒杀系统的请求数量。","marks":[]}]}],"state":{"index":2}},{"type":"block","id":"w129-1649846209641","name":"list-item","data":{"listid":"zrvj-1649846217569","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"j1ku-1649846209639","leaves":[{"text":"库存信息过期时间处理","marks":[{"type":"bold"}]},{"text":"。redis="" 中保存的库存信息其实是数据库的缓存,为了避免缓存击穿问题,我们不要给库存信息设置过期时间。","marks":[]}]}],"state":{"index":3}},{"type":"block","id":"qszy-1649846212344","name":"list-item","data":{"listid":"zrvj-1649846217569","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"5qyl-1649846212342","leaves":[{"text":"数据库订单异常处理","marks":[{"type":"bold"}]},{"text":"。如果数据库没能成功处理订单,可以增加订单重试功能,保证订单最终能被成功处理。","marks":[]}]}],"state":{}}]"=""><article data-content="[{" type":"block","id":"18rn-1649915176468","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"mchk-1649915176469","leaves":[{"text":"一表胜千言:","marks":[]}]}],"state":{}},{"type":"block","id":"yakv-1649915185620","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 15802="" webresourcee3a142b4cdcaca032c5221b3d128425f","width":506,"height":203,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresourcee3a142b4cdcaca032c5221b3d128425f","initialsize":{"width":506,"height":205},"loading":false}},{"type":"block","id":"ahvy-1649915185622","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"9pwo-1649915185621","leaves":[{"text":"综合比较="" codis="" 和="" redis="" cluster:","marks":[]}]}],"state":{}},{"type":"block","id":"ywhe-1649915266530","name":"list-item","data":{"listid":"sexd-1649915324036","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"xurv-1649915266529","leaves":[{"text":"codis出现的早,工程实践多,比较稳定;","marks":[]}]}],"state":{"index":1}},{"type":"block","id":"f2ix-1649915270864","name":"list-item","data":{"listid":"sexd-1649915324036","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"4erv-1649915270863","leaves":[{"text":"codis有proxy兼容单实例客户端,客户端无需改造;="" ","marks":[]}]}],"state":{"index":2}},{"type":"block","id":"z5sl-1649915272095","name":"list-item","data":{"listid":"sexd-1649915324036","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"5r6o-1649915272093","leaves":[{"text":"redis="" cluster对redis新特性、新命令支持的更好;="" ","marks":[]}]}],"state":{"index":3}},{"type":"block","id":"cny5-1649915273426","name":"list-item","data":{"listid":"sexd-1649915324036","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"2bwu-1649915273425","leaves":[{"text":"codis支持异步迁移数据,迁移数据频繁建议用codis;","marks":[]}]}],"state":{}}]"="">一表胜千言: 综合比较 Codis 和 Redis Cluster: Codis出现的早,工程实践多,比较稳定; Codis有Proxy兼容单实例客户端,客户端无需改造; Redis Cluster对Redis新特性、新命令支持的更好; Codis支持异步迁移数据,迁移数据频繁建议用Codis; </article></article></article></article></article></article>本文总结了Redis集群的两种方案:Codis 和 Redis Cluster 的基础内容,希望对你有帮助。 参考资料 极客时间,蒋德钧《Redis核心技术与实战》 黄建宏,《Redis设计与实现》 拉钩教育,刘海丰《架构设计面试精讲》 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |