【Redis】| 总结/Edison Zhou --- 新浪微博作为Redis深度用户,对Redis做了一些优化,一起来看看吧。 1微博对Redis的技术需求 <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":{}}]"=""><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","id":"gm09-1650275031375","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"wlro-1650275031376","leaves":[{"text":"微博对redis的三大具体需求:","marks":[]}]}],"state":{}},{"type":"block","id":"sebf-1650263310682","name":"list-item","data":{"listid":"2yyt-1650263350366","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"gmon-1650263310683","leaves":[{"text":"能够提供","marks":[]},{"text":"高性能、高并发","marks":[{"type":"bold"}]},{"text":"的读写访问,保证读写低延迟;(高性能)","marks":[]}]}],"state":{"index":1}},{"type":"block","id":"cnep-1650263324504","name":"list-item","data":{"listid":"2yyt-1650263350366","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"jyci-1650263324502","leaves":[{"text":"能够支持","marks":[]},{"text":"大容量存储","marks":[{"type":"bold"}]},{"text":";(大容量)","marks":[]}]}],"state":{"index":2}},{"type":"block","id":"j6ra-1650263329720","name":"list-item","data":{"listid":"2yyt-1650263350366","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"cbug-1650263329719","leaves":[{"text":"可以灵活扩展,对于不同业务能够进行","marks":[]},{"text":"快速扩容","marks":[{"type":"bold"}]},{"text":";(易扩展)","marks":[]}]}],"state":{"index":3}},{"type":"block","id":"gsmy-1650275011410","name":"paragraph","data":{},"nodes":[{"type":"text","id":"yzik-1650275011408","leaves":[{"text":"微博2019年的效果:","marks":[]},{"text":"100t+="" 存储、1000+="" 台物理机、10000+="" redis实例、万亿级读写、响应时间="" 20="" 毫秒","marks":[{"type":"fontsize","value":14}]}]}],"state":{}}]"=""> 微博对Redis的三大具体需求如下 能够提供高性能、高并发的读写访问,保证读写低延迟;(高性能) 能够支持大容量存储;(大容量) 可以灵活扩展,对于不同业务能够进行快速扩容;(易扩展) 微博2019年的效果:100T+ 存储、1000+ 台物理机、10000+ Redis实例、万亿级读写、响应时间 20 毫秒 </article></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> 2微博对Redis高性能的保障 <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":{}}]"=""><article data-content="[{" type":"block","id":"nu06-1649918586793","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"v0w5-1649918586794","leaves":[{"text":"redis="" 6.0之前,","marks":[]},{"text":"从网络io处理到实际的读写命令处理,都是单线程操作","marks":[{"type":"bold"}]},{"text":"。一些非核心的命令操作(如:数据删除、快照生成、aof重写等)使用的后台线程="" 或="" 子进程执行。","marks":[]}]}],"state":{}},{"type":"block","id":"80ei-1649918811954","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"oedv-1649918811945","leaves":[{"text":"redis="" 6.0开始,","marks":[]},{"text":"将网络io处理改为多线程,但是实际的读写命令处理仍然保持单线程","marks":[{"type":"bold"}]},{"text":"。这是因为,redis处理请求时,网络处理经常是瓶颈,通过多个io线程并行处理网络操作,可以提升实例的整体处理性能(主要是吞吐量)。","marks":[]}]}],"state":{}}]"=""> <article data-content="[{" type":"block","id":"5orp-1650263189040","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"0tn1-1650263189041","leaves":[{"text":"微博对redis的基本性能改进可以分为两类:避免阻塞="" 和="" 节省内存。","marks":[]}]}],"state":{}},{"type":"block","id":"h43q-1650263503798","name":"heading","data":{"level":"h2"},"nodes":[{"type":"text","id":"sinw-1650263503790","leaves":[{"text":"(1)避免阻塞","marks":[{"type":"bold"},{"type":"fontsize","value":22}]}]}]},{"type":"block","id":"dk0d-1650263517186","name":"list-item","data":{"listid":"qhdp-1650263625041","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"quci-1650263517187","leaves":[{"text":"针对持久化需求,使用="" ","marks":[]},{"text":"全量rdb="" +="" 增量aof复制="" 结合的机制","marks":[{"type":"bold"}]},{"text":",避免数据可靠性或性能降低的问题。(这也是redis4.0之后提供的混合机制)","marks":[]}]}],"state":{"index":1}},{"type":"block","id":"h9my-1650263677231","name":"list-item","data":{"listid":"qhdp-1650263625041","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"epsd-1650263677222","leaves":[{"text":"在aof日志写入磁盘时,用","marks":[]},{"text":"额外的bio线程负责实际的刷盘工作","marks":[{"type":"bold"}]},{"text":",避免aof日志慢速刷盘阻塞主线程的问题。","marks":[]}]}],"state":{"index":2}},{"type":"block","id":"ibis-1650263731763","name":"list-item","data":{"listid":"qhdp-1650263625041","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"ltp3-1650263731761","leaves":[{"text":"增加了aofnumber配置项,用于设置aof文件的数量,","marks":[]},{"text":"控制aof写盘时的文件总量","marks":[{"type":"bold"}]},{"text":",避免写入过多的aof日志文件导致的磁盘写满问题。","marks":[]}]}],"state":{"index":3}},{"type":"block","id":"s0ev-1650263791213","name":"list-item","data":{"listid":"qhdp-1650263625041","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"stpj-1650263791212","leaves":[{"text":"在主从库复制机制上,使用","marks":[]},{"text":"独立的复制线程进行主从库同步","marks":[{"type":"bold"}]},{"text":",避免对主线程的阻塞影响。","marks":[]}]}],"state":{"index":4}},{"type":"block","id":"gzkz-1650263506502","name":"heading","data":{"level":"h2"},"nodes":[{"type":"text","id":"gs5l-1650263506501","leaves":[{"text":"(2)节省内存","marks":[{"type":"bold"},{"type":"fontsize","value":22}]}]}]},{"type":"block","id":"0fw1-1650263517994","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"e6a3-1650263517995","leaves":[{"text":"微博的一个典型优化:","marks":[]},{"text":"定制化数据结构","marks":[{"type":"bold"}]},{"text":"。","marks":[]}]}],"state":{}},{"type":"block","id":"unod-1650274933988","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"ahqw-1650274933987","leaves":[{"text":"优化内容:针对微博用户的关注列表场景,微博定制化设计了longset数据类型,它是一个存储long类型元素的集合。","marks":[]}]}],"state":{}},{"type":"block","id":"88m2-1650274771173","name":"paragraph","data":{},"nodes":[{"type":"text","id":"b0mv-1650274771171","leaves":[{"text":"优化剖析:首先,","marks":[]},{"text":"longset类型的","marks":[{"type":"fontsize","value":14}]},{"text":"底层数据结构是一个hash数组,","marks":[]},{"text":"hash="" 集合类型在保存大量数据时,内存空间消耗较大。其次,在并大请求压力很大的场景下,缓存实例从db读取用户关注列表后用hmset写入hash集合,这个过程会降低redis性能。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}}]"="">微博对Redis的基本性能改进可以分为两类:避免阻塞 和 节省内存。 (1)避免阻塞 针对持久化需求,使用 全量RDB + 增量AOF复制 结合的机制,避免数据可靠性或性能降低的问题。(这也是Redis4.0之后提供的混合机制) 在AOF日志写入磁盘时,用额外的BIO线程负责实际的刷盘工作,避免AOF日志慢速刷盘阻塞主线程的问题。 增加了aofnumber配置项,用于设置AOF文件的数量,控制AOF写盘时的文件总量,避免写入过多的AOF日志文件导致的磁盘写满问题。 在主从库复制机制上,使用独立的复制线程进行主从库同步,避免对主线程的阻塞影响。 (2)节省内存 微博的一个典型优化:定制化数据结构。 优化内容:针对微博用户的关注列表场景,微博定制化设计了LongSet数据类型,它是一个存储Long类型元素的集合。 优化剖析:首先,LongSet类型的底层数据结构是一个Hash数组,Hash 集合类型在保存大量数据时,内存空间消耗较大。其次,在并大请求压力很大的场景下,缓存实例从DB读取用户关注列表后用HMSET写入Hash集合,这个过程会降低Redis性能。 </article> </article></article></article>3微博对Redis大容量的保障 <article data-content="[{" type":"block","id":"ad84-1650263232352","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"trw1-1650263232353","leaves":[{"text":"微博业务层要保存的数据经常会达到="" tb="" 级别,因此对大容量存储的需求较强。","marks":[]}]}],"state":{}},{"type":"block","id":"jxci-1650275288095","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"ssug-1650275288094","leaves":[{"text":"优化内容:针对","marks":[]},{"text":"数据区分冷热度,","marks":[{"type":"fontsize","value":14}]},{"text":"把热数据保留在="" redis="" 中,而把冷数据通过="" rocksdb="" 写入底层的硬盘","marks":[{"type":"fontsize","value":14},{"type":"bold"}]},{"text":"。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}},{"type":"block","id":"8u9i-1650275320452","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"pait-1650275320450","leaves":[{"text":"优化剖析:有些微博话题刚发生时,热度非常高,会有海量的用户访问这些话题,使用="" 服务用户请求就非常有必要。等到话题热度过了之后,访问人数就会急剧下降,这些数据就变为冷数据了。这个时候,冷数据就可以从="" 迁移到="" rocksdb,从而节省redis实例的内存来主要存储热数据。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}},{"type":"block","id":"jubk-1650275547386","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 16485="" webresource3b3018a7fb4d0b8049443bfdfc8240a3","width":420,"height":297,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresource3b3018a7fb4d0b8049443bfdfc8240a3","initialsize":{"width":420,"height":296},"loading":false}},{"type":"block","id":"mx5j-1650275671183","name":"paragraph","data":{},"nodes":[{"type":"text","id":"iwzc-1650275671184","leaves":[{"text":"举一反三:","marks":[]},{"text":"如果想实现大容量的="" 实例,借助于="" ssd="" 和="" 来实现是一个不错的方案","marks":[{"type":"fontsize","value":14},{"type":"bold"}]},{"text":"。rocksdb="" 可以实现快速写入数据,同时使用内存缓存部分数据,也可以提供万级别的数据读取性能。","marks":[{"type":"fontsize","value":14}]},{"text":"当前="" 的性能提升很快,单块="" 的盘级="" iops="" 可以达到几十万级别。","marks":[{"type":"color","value":"#333333"},{"type":"backgroundcolor","value":"rgb(255,="" 255,="" 255)"},{"type":"fontfamily","value":"arial"},{"type":"fontsize","value":14}]}]}],"state":{}}]"="">微博业务层要保存的数据经常会达到 TB 级别,因此对大容量存储的需求较强。 优化内容:针对数据区分冷热度,把热数据保留在 Redis 中,而把冷数据通过 RocksDB 写入底层的硬盘。 优化剖析:有些微博话题刚发生时,热度非常高,会有海量的用户访问这些话题,使用 Redis 服务用户请求就非常有必要。等到话题热度过了之后,访问人数就会急剧下降,这些数据就变为冷数据了。这个时候,冷数据就可以从 Redis 迁移到 RocksDB,从而节省Redis实例的内存来主要存储热数据。 举一反三:如果想实现大容量的 Redis 实例,借助于 SSD 和 RocksDB 来实现是一个不错的方案。RocksDB 可以实现快速写入数据,同时使用内存缓存部分数据,也可以提供万级别的数据读取性能。当前 SSD 的性能提升很快,单块 SSD 的盘级 IOPS 可以达到几十万级别。 </article>
4微博对Redis扩展性的保障 <article data-content="[{" type":"block","id":"uxet-1649918588062","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"uo3a-1649918588063","leaves":[{"text":"redis="" 6.0之前只提供了设置密码来控制安全访问,而redis="" 6.0则提供了细粒度的访问权限控制:","marks":[]}]}],"state":{}},{"type":"block","id":"lo1s-1649926870359","name":"list-item","data":{"listid":"svrd-1649926877420","listtype":"unordered","listlevel":1},"nodes":[{"type":"text","id":"wata-1649926870350","leaves":[{"text":"支持创建不同的用户来使用redis","marks":[]}]}],"state":{"index":1}},{"type":"block","id":"7i85-1649926945723","name":"list-item","data":{"listid":"svrd-1649926877420","listtype":"unordered","listlevel":2},"nodes":[{"type":"text","id":"s3gj-1649926945722","leaves":[{"text":"例如:使用acl="" setuser命令创建一个名为“normaluser”,密码为“abc”的用户","marks":[]}]}],"state":{}}]"=""><article data-content="[{" type":"block","id":"gxgh-1650263189732","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"awxs-1650263189733","leaves":[{"text":"微博有多条不同业务线,它们对redis容量的需求各不一致,而且可能随时有扩容和缩容的需求。","marks":[]}]}],"state":{}},{"type":"block","id":"epvp-1650275971183","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"nbox-1650275971182","leaves":[{"text":"优化内容:微博对redis进行了","marks":[]},{"text":"服务化改造(redisservice),即使用redis集群来服务不同的业务场景需求,每一个业务拥有独立的资源,互不干扰","marks":[{"type":"bold"}]},{"text":"。同时,","marks":[]},{"text":"所有的redis实例构成一个资源池,资源池本身也能轻松地扩容","marks":[{"type":"bold"}]},{"text":"。","marks":[]}]}],"state":{}},{"type":"block","id":"1i7o-1650276127327","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"fzxk-1650276127325","leaves":[{"text":"实现细节:","marks":[]},{"text":"在="" redis="" 服务化的过程中,微博采用了类似="" codis="" 的方案,","marks":[{"type":"fontsize","value":14}]},{"text":"通过集群代理层来连接客户端和服务器端","marks":[{"type":"fontsize","value":14},{"type":"bold"}]},{"text":"。微博在代理层中实现了丰富的服务化功能支持。在服务化集群中,还有一个配置中心,它用来管理整个集群的元数据。同时,实例会按照主从模式运行,保证数据的可靠性。不同业务的数据部署到不同的实例上,相互之间保持隔离。","marks":[{"type":"fontsize","value":14}]}]}],"state":{}}]"="">微博有多条不同业务线,它们对Redis容量的需求各不一致,而且可能随时有扩容和缩容的需求。 优化内容:微博对Redis进行了服务化改造(RedisService),即使用Redis集群来服务不同的业务场景需求,每一个业务拥有独立的资源,互不干扰。同时,所有的Redis实例构成一个资源池,资源池本身也能轻松地扩容。 实现细节:在 Redis 服务化的过程中,微博采用了类似 Codis 的方案,通过集群代理层来连接客户端和服务器端。微博在代理层中实现了丰富的服务化功能支持。在服务化集群中,还有一个配置中心,它用来管理整个集群的元数据。同时,实例会按照主从模式运行,保证数据的可靠性。不同业务的数据部署到不同的实例上,相互之间保持隔离。 <article data-content="[{" type":"block","name":"image","data":{"version":1,"url":"https:="" note.youdao.com="" yws="" res="" 16502="" webresource9bb105cbb1cc6fee52cb608135f00571","width":483,"height":340,"style":{"textalign":"center"}},"nodes":[],"state":{"rendersource":"https:="" webresource9bb105cbb1cc6fee52cb608135f00571","initialsize":{"width":483,"height":339},"loading":false}}]"=""></article></article></article>本文记录了Redis在2019年公开的分享中描述的微博对于Redis的实践和优化,相信对于我们使用Redis会有一定的启发。 参考资料 极客时间,蒋德钧《Redis核心技术与实战》 黄建宏,《Redis设计与实现》 拉钩教育,刘海丰《架构设计面试精讲》 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |