Redis 的性能幻想与残酷现实(转)

2011 年,当初选择 Redis 作为主要的内存数据存储,主要吸引我的是它提供多样的基础数据结构可以很方便的实现业务需求。另一方面又比较担心它的性能是否足以支撑,毕竟当时 Redis 还属于比较新的开源产品。但 Redis 官网宣称其是提供多数据结构的高性能存储,我们对其还是抱有幻想的。

幻想

要了解 Redis 的性能,我们先看看官方的基准性能测试数据,心里有个底。

测试前提
Redis version 2.4.2
Using the TCP loopback
Payload size = 256 bytes
测试结果
SET: 198412.69/s
GET: 198019.80/s

这个数据刚一看觉得有点超出预期了,不过看了测试前提是规避了网络开销的,Client 和 Server 全在本机。而真实的使用场景肯定是需要走网络的,而且使用的客户端库也是不同的。不过这个官方参考数据当时让我们对 Redis 的性能还是抱有很大的期待的。

另外官方文档中也提到,在局域网环境下只要传输的包不超过一个 MTU (以太网下大约 1500 bytes),那么对于 10、100、1000 bytes 不同包大小的处理吞吐能力实际结果差不多。关于吞吐量与数据大小的关系可见下面官方网站提供的示意图。

验证

基于我们真实的使用场景,我们搭建了性能验证环境,作了一个验证测试,如下(数据来自同事 @kusix 当年的测试报告,感谢)。

测试前提
Redis version 2.4.1
Jmeter version 2.4
Network 1000Mb
Payload size = 100 bytes
测试结果
SET: 32643.4/s
GET: 32478.8/s

在实验环境下得到的测试数据给人的感觉和官方差了蛮多,这里面因为有网络和客户端库综合的影响所以没有实际的横向比较意义。这个实验环境实测数据只对我们真实的生产环境具有指导参考作用。在实验环境的测试,单 Redis 实例运行稳定,单核 CPU 利用率在 70% ~ 80% 之间波动。除了测试 100 bytes 的包,还测了 1k、10k 和 100k 不同大小的包,如下图所示:

诚然,1k 基本是 Redis 性能的一个拐点,这一点从上图看趋势是和官方图的一致。

现实

基于实验室测试数据和实际业务量,现实中采用了 Redis 分片来承担更大的吞吐量。一个单一 Redis 分片一天的 ops 波动在 20k~30k 之间,单核 CPU 利用率在 40% ~ 80% 之间波动,如下图。

这与当初实验室环境的测试结果接近,而目前生产环境使用的 Redis 版本已升级到 2.8 了。如果业务量峰值继续增高,看起来单个 Redis 分片还有大约 20% 的余量就到单实例极限了。那么可行的办法就是继续增加分片的数量来分摊单个分片的压力,前提是能够很容易的增加分片而不影响业务系统。这才是使用 Redis 面临的真正残酷现实考验。

残酷

Redis 是个好东西,提供了很多好用的功能,而且大部分实现的都还既可靠又高效(主从复制除外)。所以一开始我们犯了一个天真的用法错误:把所有不同类型的数据都放在了一组 Redis 集群中。

  • 长生命周期的用户状态数据
  • 临时缓存数据
  • 后台统计用的流水数据

导致的问题就是当你想扩分片的时候,客户端 Hash 映射就变了,这是要迁移数据的。而所有数据放在一组 Redis 里,要把它们分开就麻烦了,每个 Redis 实例里面都是千万级的 key。

而另外一个问题是单个 Redis 的性能上限带来的瓶颈问题。由于 CPU 的单核频率都发展到了瓶颈,都在往多核发展,一个 PC Server 一般 24或32 核。但 Redis 的单线程设计机制只能利用一个核,导致单核 CPU 的最大处理能力就是 Redis 单实例处理能力的天花板了。

举个具体的案例,新功能上线又有点不放心,于是做了个开关放在 Redis,所有应用可以很方便的共享。通过读取 Redis 中的开关 key 来判断是否启用某个功能,对每个请求做判断。这里的问题是什么?这个 key 只能放在一个实例上,而所有的流量进入都要去这个 Redis GET 一下,导致该分片实例压力山大。而它的极限在我们的环境上不过 4 万 OPS,这个天花板其实并不高。

总结

认识清楚了现实的残酷性,了解了你所在环境 Redis 的真实性能指标,区分清幻想和现实。我们才能真正考虑好如何合理的利用 Redis 的多功能特性,并有效规避的它的弱项,再给出一些 Redis 的使用建议:

-根据数据性质把 Redis 集群分类;我的经验是分三类:cache、buffer 和 db
- cache:临时缓存数据,加分片扩容容易,一般无持久化需要。
- buffer:用作缓冲区,平滑后端数据库的写操作,根据数据重要性可能有持久化需求。
- db:替代数据库的用法,有持久化需求。

  • 规避在单实例上放热点 key。
  • 同一系统下的不同子应用或服务使用的 Redis 也要隔离开

另外,有一种观点认为用作缓存 Memcache 更合适,这里可以独立分析下其中的优劣取舍吧。Memcache 是设计为多线程的,所以在多核机器上单实例对 CPU 的利用更有效,所以它的性能天花板也更高。(见下图)要达到同样的效果,对于一个 32 核机器,你可能需要部署 32 个 Redis 实例,对运维也是一种负担。

除此,Redis 还有个 10k 问题,当缓存数据大于 10k(用作静态页面的缓存,就可能超过这个大小)延迟会明显增加,这也是单线程机制带来的问题。如果你的应用业务量离 Redis 的性能天花板还比较远而且也没有 10k 需求,那么用 Redis 作缓存也是合理的,可以让应用减少多依赖一种外部技术栈。最后,搞清楚现阶段你的应用到底需要什么,是多样的数据结构和功能、更好的扩展能力还是更敏感的性能需求,然后再来选择合适的工具吧。别只看到个基准测试的性能数据,就欢呼雀跃起来了。



额外扯点其他的,Redis 的作者 @antirez 对自己的产品和技术那是相当自信。一有人批评 Redis 的问题,他都是要跳出来在自己的 blog 里加以回应和说明的。比如有人说 Redis 功能多容易使用但也容易误用,作者就跑出来解释我设计是针对每种不同场景的,你用的不对怪我咯,怪我咯。有人说缓存场景 Memcache 比 Redis 更合适,作者也专门写了篇文章来说明,大概就是 Memcache 有的 Redis 都有,它没有的我还有。当然最后也承认多线程是没有的,但正在思考为 Redis I/O 增加线程,每个 Client 一个线程独立处理,就像 Memcache 一样,已经等不及要去开发和测试了,封住所以批评者的嘴。

Redis 这些年不断的增加新功能和优化改进,让它变得更灵活场景适应性更多的同时,也让我们在使用时需要更细致的思考,不是它有什么我就用什么,而是你需要什么你就选择什么。

这篇先到这,后面还会再写写关于 Redis 扩展方面的主题。

参考

[1] antirez. Redis Documentation.
[2] antirez. Clarifications about Redis and Memcached.
[3] antirez. Lazy Redis is better Redis.
[4] antirez. On Redis, Memcached, Speed, Benchmarks and The Toilet.
[5] antirez. An update on the Memcached/Redis benchmark.
[6] dormando. Redis VS Memcached (slightly better bench).
[7] Mike Perham. Storing Data with Redis.
[8] 温柔一刀. Redis 常见的性能问题和解决方法.

 

http://www.cnblogs.com/mindwind/p/5067905.html

时间: 2024-11-01 06:12:25

Redis 的性能幻想与残酷现实(转)的相关文章

翁建仁:PC凶险宏碁有信心直面残酷现实

宏碁全球总裁翁建仁(TechWeb配图)[搜狐IT消息]11月2日消息,近日,一向很少在大陆露面的宏碁全球总裁翁建仁接受了搜狐IT专访.作为宏碁全球的掌门人,翁建仁强调,全球PC市场下滑是残酷现实,而本次在伦敦发布的Win8笔记本则意义重大,翁建仁强调,如果Win8成功, 那么PC市场下滑的趋势将会被遏制.此外,翁建仁还专门谈到了中国市场.过去两年,宏碁在中国的增速很快,并且收购了一家国产PC品牌--方正电脑业务.对于来自大陆的竞争企业联想,翁建仁表示,与之前的宏碁不同,现在宏碁并不再看重PC在

高德:Redis深度实践,助力实现“现实与互联网世界的底图梦”

在2016杭州云栖大会的"开源数据库之Redis专场"上,高德开放平台总经理童遥带来了题为<高德经典数据库实践案例分享>精彩演讲.演讲中,他主要介绍了高德业务下的经典数据库实践案例. 以下内容根据演讲PPT及现场分享整理. 目前用户使用的高德地图,其实是C端地图,另外还有两个出口:一个是车机地图:另外一个是开放平台.开放平台就是行业合作,比如说使用打车应用或社交应用会请求高德的API,简单地说,就是SDK和API的业务. 作为互联网世界底图,目前10部手机中就有9部在使用高

深入了解Redis的性能_Redis

简介 多少次你发现自己在几个月的开发和无数的努力后陷入了毫无性能而言的web应用?多少次你在好奇如果你无法向普通用户传达快与最快的标准,你的客户还应该把你当作专家?多少你听到有关Google和Facebook一些糟糕的对比?让我告诉你,我的客户是怎么看待这些的: 我曾开发一个有着复杂处理和过滤的web应用,因为很多业务规则和UI要求.再加上一些过时技术的第三方提供者,对于他们而言,速度意味着15年的工作丢进垃圾桶,然后重新开始.我的应用不是那么快,有时处理一个请求花费6-8s才会处理完,业务规则

Zynga没落,手游背后的残酷现实

Zynga 发布的2014年财报显示,过去一年公司营收6.9亿美元,同比下滑达21%,在线游戏收入5.37亿美元,同比下滑达29%,累计亏损达到2.26亿美元,预计明年收入约在1.55亿~1.65亿美元. 尽管如此,公司CEO 马崔克(Don Mattrick)仍然将这一年视为"进步的一年"(a year of progress).或许,在他看来,裁撤大洋彼岸的71名员工从而节省700万美元的开销也算是(will result in an annualized cost savings

电商疯狂刷墙,背后冰冷的残酷现实

这几天,电商刷墙成了一个话题.让人想起多年前,村子西头人家墙面上巨大的化肥.种子以及电信套餐广告. 那时,村庄上人声虽不鼎沸,倒还是充满活力.不知这时节,当电商刷墙人跑到乡村,是否有种异样的感觉,那就是乡村的空洞化:大量劳动力外出务工,甚至常年不回;留守的大都是老年人与上学的孩子们. 当然,电商们刷墙肯定不会寻找那么偏僻的乡村,它们会根据所谓人口.消费力.交通条件等要素选择性地来刷墙,可能看不到这种空洞的现实. 当无数的企业.公共传媒将小城镇.农村.农民当成一种最后的营销洼地时,言必称"四六级市

戴尔EMC合并遭遇残酷现实:组件成本上升 云计算兴起

图:戴尔和EMC 据彭博社北京时间3月31日报道,作为科技行业史上规模最大的合并案之一,戴尔收购信息存储公司EMC的交易已经完成约六个月时间.但是现在,戴尔却不得不应对硬件口味改变,以及组件成本不断上升的挑战,凸显出收购EMC所面临的挑战. 在财年第四季度,位于德州圆石城的戴尔共录得201亿美元营收,运营亏损达17亿美元.戴尔首席财务官汤姆·斯威特在周四与分析师的电话会议上表示,该公司一系列产品中的存储和显示部件成本将会上升. 眼下,信息存储市场正面临着微软和亚马逊等云计算巨头的压力.而在戴尔C

Redis性能问题排查解决手册(七)

阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数据可分为10个类别,分别是: server clients memory persistence stats replication

NoSQL数据库MongoDB、Redis、Tokyo Tyrant的性能比较

准备对MongoDB, Redis以及Tokyo Tyrant的读写做一个简单的测试,为了进行相对公平的测试,需要了解他们背后的实现机制,下面是一些比较: 存储实现的比较: * 内存文件映像(Memory-File Mapping) Redis, MongoDB * 文件 + Cache Tokyo Tyrant * 内存: Redis, Tokyo Tyrant Key/Value索引形式: * B+ Tree : MongoDB, Tokyo Tyrant * Hash Table: Red

Redis-benchmark测试Redis性能

Redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能. 使用说明如下: Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>] -h <hostname> Server hostname (default 127.0.0.1) -p <port>