业界时评 | Twitter如何使用Redis提高可伸缩性

最近,Twitter Cache团队的工程师Yu Yao在Youtube发表了一段演讲,介绍了Twitter如何使用Redis提高系统可伸缩性。High Scalability对这段演讲进行了整理和总结。

Yu Yao首先解释了为什么Twitter Cache团队选择了Redis,而不是Memcache。原因在于Twitter对网络带宽以及长通用前缀(Long Common Prefix)在使用效率上的考虑。Twitter主要将Redis用于timeline服务,而针对这方面的功能,Redis的表现要优于Memcache。对于长通用前缀问题,Yu Yao则谈到Twitter处理数据的两种场景:

数据格式需要采用灵活的样式。一个对象拥有确定的属性,但该属性可能存在,也可能不存在。每一个单独的属性需要建立单独的键。这就要求为每个单独的属性发送单独的请求,而在缓存中,可能并不存在所有的属性。

随时间变化所能观察到的度量值样本具有相同的名称,但却具有不同的时间戳。如果要单独存储每个度量值,就可能导致冗长的通用前缀会被存储多次。

针对度量值与灵活样式这两种场景,都需要更多空间。为提高空间的有效性,就需要具有分层的键空间。

根据业务需要,Twitter为Redis增加了两种数据结构:Hybrid List与BTree。针对List类型,Redis自身只支持ziplist与linklist。前者对空间的利用更好,后者则更加灵活。因而在不同的场景下,两种List类型表现各有利弊。例如当数据量巨大时,ziplist在添加或删除元素的性能方面表现得不如人意;而linklist由于为每个key提供了两个指针,就可以更加高效地添加或删除元素,遗憾的是,多余的指针又会带来空间的浪费。由于Twitter Timeline数据量非常大,且经常需要对其数据进行写操作,Redis提供的这两种List都不适合。为了鱼和熊掌兼得,Twitter引入了Hybrid List。它通过综合ziplist 和linklist的特性,解决了这个问题。本质上,Hybrid List就是一个存储了多个ziplist的linklist。

引入BTree则是为了更好地支持对分级Key的区间查询(Range Query)。在Redis中,处理二级键(Secondary Key)或二级域(Secondary Field)的方式是使用hash map。之所以要存储排序后的数据,就是为了更好地执行区间查询。如果二级键或名称无法排序,且数据量较大时,查询就变成了线性的,效率较低。BTree正是为了解决此问题,它借鉴了BTree的伯克利算法,在分级key的区间查询方面具有更好的性能。

Yu Yao在演讲中还谈到了Twitter如何对Redis集群进行管理,并从数据角度对Redis进行了评价。最后,她总结了Twitter在这方面的收获与体会:

  • 需要预测规模的需求。如果集群越大,客户越多,就越需要进行预测。
  • 长尾延迟问题(Tail Latencies Matter)。如果存在多个分区,当其中一个变慢,则整个查询也会变慢。
  • 明确的配置对于运维非常重要。Twitter使用Mesos作为Job Scheduler,对CPU、内存等资源的管理与监控有助于更好的运维。
  • 知道运行时的资源使用状况将大有裨益。
  • 将计算推送到数据端。
  • Redis会成为下一个高性能的流处理平台。

原文发布于微信公众号 - 逸言(YiYan_OneWord)

原文发表时间:2014-09-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏瓜大三哥

实现(Implement)

1.翻译过程 在翻译过程中,设计文件和约束文件将被合并生成NGD(原始类型数据库)输出文件和BLD文件。 1) Translation Report:用以显示翻...

1825
来自专栏一个会写诗的程序员的博客

函数式编程与面向对象编程[5]:编程的本质函数式编程与面向对象编程[5]:编程的本质编程的本质

函数式程序员在洞察问题方面会遵循一个奇特的路线。他们首先会问一些似有禅机的问题。例如,在设计一个交互式程序时,他们会问:什么是交互?在实现 基于元胞自动机的生命...

512
来自专栏Golang语言社区

关于多核编程的一点想法

Nim语言有很多语言上先进的特性和接近Python的语法,Rust定位成C++的直接竞争者。 但是请认真思考:这两个语言从一出生开始,都没有解决,而且以后也很难...

3065
来自专栏数据和云

学习设问以提高

我在很多面试环节发现,工程师们往往不善于设问和解答,这样就导致他们面对问题时局促、紧张,甚至答非所问,无法正常发挥。而我觉得正确的学习方法需要工程师们学会设问,...

2689
来自专栏LET

CPU简介

1659
来自专栏用户画像

13年5月 软考笔记整理

虚拟存储器为了给用户提供更大的随机存储空间而采用的一种存储技术。它将内存(主存)与外存(辅存)结合使用,好像有一个容量巨大的内存储器,工作速度接近于主存,每位成...

723
来自专栏程序人生

Erlang 入坑指南

想了半天憋出这么个题目来,这也的确只是一篇入坑文。之前程序君写过一篇 Erlang 文章,我用谷歌翻译出来给 Joe Armstrong 老爷子看,老爷子看后大...

701
来自专栏Golang语言社区

Go 的垃圾回收机制在实践中有哪些需要注意的地方?

之前回答问题的时候Go还处在1.1版本,到了1.2和1.3,Go的GC跟踪命令和GC内部实现已经有一些变化,并且根据评论中的反馈,这边一并做补充说明。 Go ...

4026
来自专栏微信公众号:Java团长

Java就业指导

想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面...

912
来自专栏人工智能头条

如何成为一名异构并行计算工程师

1862

扫描关注云+社区