简述Redis计数在新浪微博的应用

微博业务的迅速发展,对基础架构层面的要求也越来越高。新浪作为国内最早使用redis,并且是国内最大的redis使用者,在redis的使用上,也在逐步优化和提高。

作为微博中一项重要的数据,计数类业务在微博业务中占的比重和重要性逐步提高。计数结果的准确度直接影响用户体验,并且很容易引起用户的投诉。在计数业务上,在不断的优化和改进中,我们主要经历了以下三个阶段:

初级阶段

从2010年开始,使用redis-2.0版本。在最初业务数据比较少的时候,表现相当不错。但随着数据量和请求量的不断增加,一些问题逐渐暴露出来。

主从同步问题

首先遇到的是主从的同步问题。它的原理是当master接收到slave的同步请求后,把内存的数据fork出一个子进程dump出来,形成rdb文件,然后传到slave,slave再把这个文件加载到内存,之后的增量更新由master在执行完每条修改命令后立即同步给slave。 在网络出现问题时,比如瞬断,会导致slave里的数据全部重传。对单个端口来说,如果数据量小,那么这个影响不大,而如果数据量比较大的话,就会导致网络流量暴增,同时slave在加载rdb时无法响应任何请求。

持久化问题

本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/tools/

计数业务中多数使用redis作为存储,因此都开启了aof,并配置为每秒做一次fsync操作将写操作刷新到磁盘。随着aof的增长,需要定期rewrite。Rewrite的机制和生成rdb的过程类似,都是fork出一个子进程来完成的,子进程对于磁盘的持续写入会导致父进程的fsync操作阻塞,造成大量请求超时。

版本升级问题

由于redis在使用初期bug较多,版本迭代频繁,而版本升级需要关闭redis进程并重新加载aof。对于大量使用redis的微博业务来讲,这样的升级成本也越来越难以承受。

内存使用问题

2.0版本的redis,在内存使用上相对比较粗放,对于计数这样一个简单的key-value,占用的内存达到100字节以上,存在比较多的优化空间。

进阶阶段

针对redis使用初期存在的问题,我们逐个进行了改进。主从复制参考mysql的同步方式,使用rdb+aof结合的方式,解决了网络瞬断引起的重传问题,同时限制子进程做后台dump时对磁盘的写入,期间暂停主进程的fsync操作,解决了慢请求的问题。

针对计数业务,我们开发了专用的版本redisscounter,单个key-value占用的内存key的长度加4个字节的value,将内存的使用量降低到原来的1/4以下。通过预先分配内存数组和double hash技术,消除了redis中hash表的大量指针开销。

对于版本升级的问题,我们将redis的核心处理逻辑封装到动态库,内存中的数据保存在全局变量里,通过外部程序来调用动态库里的相应函数来读写数据。版本升级时只需要替换成新的动态库文件即可,无须重新载入数据。通过这样的方式,版本升级只需执行一条指令,即可在毫秒级别完成代码的升级,同时对客户端请求无任何影响。

有了上面的改进后,新版本开始大量应用,多数业务都可以作为完整的存储替代以前的mysql+memcached组合。对于微博的评论数和转发数,由于微博条目不断增加,无法保存全量数据,因此采用mysql+redisscounter组合的方式,mysql保存全量数据,使用两组redisscounter保存最近几个月的热数据,通过定期滚动两组redisscounter里的数据来清理冷数据。

高级阶段

随着微博的发展,针对单条微博的计数也不断增加,从原来的评论数、转发数,又增加了表态数,2013年还上线了阅读数。Redisscounter不能很好的解决这类扩展问题,同时上面的mysql+redisscounter的滚动方式也过于复杂,定期的滚动操作很容易出现问题。针对这类问题,我们再度做出改进,将key由原先的字符串改成微博id,同时对于每条微博的评论转发等计数,我们统计发现,绝大多数微博的计数都可以用10~15个bit来保存,因此可以将多个计数保存到一个4字节的value里,过大的计数值在内存中另外开辟一块空间来保存。这样通过一条get命令即可获取该微博的所有计数。同时针对微博业务的特点,越老的微博被访问的次数就会越少,在内存使用多个数组保存不同范围的微博,内存不足时将最老的一组微博dump到ssd上,内部自动实现的滚动可以保证热微博全部在内存里。对于落到ssd上的老数据的访问,通过异步的io线程来读写,经过这样的改进后,去掉了原先的mysql存储,降低了业务开发成本和运维成本。

从redis在计数业务上的发展经历可以看出,技术的进步是由业务的需求推动的。随着业务的发展,还会遇到更多新的挑战。希望我们走过的这些改进之路对于读者在使用redis的过程中能有所帮助。

时间: 2024-12-27 10:31:08

简述Redis计数在新浪微博的应用的相关文章

详解 Redis 应用场景及应用实例

1. MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: 1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间. 2.Memcached与MySQL数据库数据一致性问题. 3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法

Redis基础知识之—— 缓存应用场景

转载原文:http://www.cnblogs.com/jinshengzhi/articles/5225718.html 一.MySql+Memcached架构的问题 Memcached采用客户端-服务器的架构,客户端和服务器端的通讯使用自定义的协议标准,只要满足协议格式要求,客户端Library可以用任何语言实现. Memcached服务器使用基于Slab的内存管理方式,有利于减少内存碎片和频繁分配销毁内存所带来的开销.各个Slab按需动态分配一个page的内存(和4Kpage的概念不同,这

REDIS集合的应用:下单有礼功能实现示例

为了广大亲们能够好好剁手,我们也是拼了,"双十一"一过,我们就开始准备"双十二"了,大促活动有很多,本文以"下单有礼"的功能实现,讲讲redis的几个用法,如redis集合.自增的具体应用.这里仅仅举个小例子,在一个大型网站多个终端中,要考虑各种不同的情况和应用场景. 下单有礼的需求说明: 活动时间:12月11日10:00 ~ 12月14日09:59 活动内容: 1.活动期间,用户购买大促商品,首笔订单金额满68元及以上,即可获得一个68元优惠券

Redis和nosql简介,api调用;Redis数据功能(String类型的数据处理);List数据结构(及Java调用处理);Hash数据结构;Set数据结构功能;sortedSet(有序集合)数

1.Redis和nosql简介,api调用 14.1/ nosql介绍   NoSQL:一类新出现的数据库(not only sql),它的特点: 1.  不支持SQL语法 2.  存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式 3.  NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景 4.  NoSQL中的产品种类相当多: a)        Mongodb  文档型nosql数据库,擅长做CMS系统(内

最大的Redis集群:新浪Redis集群揭秘

前言 Tape is Dead,Disk is Tape,Flash is Disk,RAM Locality is King.       - Jim Gray Redis不是比较成熟的Memcache或者Mysql的替代品,是对于大型互联网类应用在架构上很好的补充.现在有越来越多的应用也在纷纷基于Redis做架构的改造. 可以简单公布一下Redis平台实际情况 2200+亿 commands/day   5000亿Read/day   500亿Write/day 18TB+ Memory 5

Redis编译安装和saltstack简单配置

分布式存储之-Redis redis常用于数据库读缓存和写缓存,通常写缓存需要考虑到数据一致性的问题,读缓存应用较多 redis是一个开源的,使用c语言编写的,支持网络交互的,可基于内存也可持久化的key-value数据库   目前国内最大的redis集群--新浪微博 redis和memcached对比 [root@yum-down local]# wget http://download.redis.io/releases/redis-3.0.7.tar.gz [root@yum-down l

浅谈sqlserver下float的不确定性

很多时候,大家都知道,浮点型这个东西,本身存储就是一个不确定的数值,你永远无法知道,它是 0 = 0.00000000000000123 还是 0 = 0.00000000000999这样的东西.也许一开始使用的时候没有问题,但是有时候做统计的时候,就会看出端倪 简单的举个例子,就知道统计的时候,有可能出现意外的效果,导致可能需要存储过程或者接收程序的代码左额外的取舍数位的处理,所以在此其实我是推荐使用Numeric来替代float进行一个替代使用,避免一个sum ,然后明明明细看每一条数据都是

【独家】一文读懂非关系型数据库(NoSQL)

前言 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL". 现代计算系统每天在网络上都会产生庞大的数据量.这些数据有很大一部分是由关系型数据库管理系统(RDBMSs)来处理,其严谨成熟的数学理论基础使得数据建模和应用程序编程更加简单. 但随着信息化的浪潮和互联网的兴起,传统的RDBMS在一些业务上开始出现问题.首先,对数据库存储的容量要求越来越高,单机无法满足需求,很多时候需要用集群来解决问题,而RDBMS由于要支持join,union等操作,一般不支持分

php + Redis 写的类似于新浪微博的feed系统

    最近接了一个feed系统的外包,类似于微博那种!客户端是ios和android,服务器用的php,数据库用的是redis.分享下服务器和数据库部分的功能!希望对大家有帮助. 关于redis的介绍,大家可以看这个百度百科!    首先是用户基本信息部分,包含账号,昵称,签名,公司还有头像,我们使用redis的hash结构(一种类似于map键值对的数据结构)结构如下:(大家在做的时候,还是用hgetAll的命令,这样只会有一次的网络请求),注意只是基本信息,诸如玩家的粉丝,关注和帖子,我们采