技术开发 频道

Redis数据库在新浪微博中的应用

  新浪Redis使用历程

  2009年, 使用memcache(用于非持久化内容), memcacheDB(用于持久化+计数),memcacheDB是新浪在memcache的基础上,使用BerkeleyDB作为数据持久化的存储实现。

  1.面临的问题

  数据结构(Data Structure)需求越来越多, 但memcache中没有, 影响开发效率。

  性能需求, 随着读操作的量的上升需要解决,经历的过程有:数据库读写分离(M/S)-->数据库使用多个Slave-->增加Cache (memcache)-->转到Redis。解决写的问题,水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在另外一个表。可靠性需求Cache的"雪崩"问题让人纠结Cache面临着快速恢复的挑战。

  开发成本需求Cache和DB的一致性维护成本越来越高。(先清理DB, 再清理缓存, 不行啊, 太慢了!)开发需要跟上不断涌入的产品需求硬件成本最贵的就是数据库层面的机器,基本上比前端的机器要贵几倍,主要是IO密集型,很耗硬件。

  维护性复杂一致性维护成本越来越高。BerkeleyDB使用B树,会一直写新的,内部不会有文件重新组织。这样会导致文件越来越大,大的时候需要进行文件归档,归档的操作要定期做。这样,就需要有一定的down time。

  基于以上考虑, 新浪选择了Redis。

  2.寻找开源软件的方式及评判标准

  对于开源软件,首先看其能做什么,但更多的需要关注它不能做什么,它会有什么问题?上升到一定规模后,可能会出现什么问题,是否能接受?google code上, 国外论坛找材料。观察作者个人的代码水平

  Redis应用场景

  1.业务使用方式

  hash sets: 关注列表, 粉丝列表, 双向关注列表(key-value(field), 排序)

  string(counter): 微博数, 粉丝数,(避免了select count(*) from ...)

  sort sets(自动排序): TopN, 热门微博等, 自动排序

  lists(queue): push/sub提醒

  上述四种, 从精细化控制方面,hash sets和string(counter)推荐使用, sort sets和lists(queue)不推荐使用还可通过二次开发,进行精简。比如: 存储字符改为存储整形, 16亿数据, 只需要16G内存存储类型保存在3种以内,建议不要超过3种。

  将memcache +myaql 替换为Redis:Redis作为存储并提供查询,后台不再使用mysql,解决数据多份之间的一致性问题。

  2.对大数据表的存储

  一个库就存唯一性id和140个字;另一个库存id和用户名,发布日期、点击数等信息,用来计算、排序等,等计算出最后需要展示的数据时再到第一个库中提取微博内容。

  改进的3个步骤:1)发现现有系统存在问题;2)发现了新东西, 怎么看怎么好, 全面转向新东西;3)理性回归, 判断哪些适合新东西, 哪些不适合, 不合适的回迁到老系统。

0
相关文章