新浪微博开放平台
Redis 实践
@唐福林
http://weibo.com/tangfl
http://fulin.org
大纲
• Redis 简介
• 新浪微博中的Redis实践
• 好友关系
• 计数器
• 经验教训
Redis
• in memory (database?)
• data can dump to disk
• many useful data structure
• FAST both read and write
• we start u...
微博=feed+关系+数字
微博=feed+关系+数字

• feed
• 看微博,看评论
• 发微博,转发微博,发评论
微博=feed+关系+数字
微博=feed+关系+数字

• 关系
• 关注,取消关注
• 关注列表,粉丝列表
微博=feed+关系+数字
微博=feed+关系+数字
• 数字
• 微博,粉丝,关注数
• 评论给我的,@我的,我评论的
• 小黄签提醒:新粉丝,新@,新评论
• 未读微博数
微博=feed+关系+数字
微博=feed+关系+数字
• 数字
• 微博,粉丝,关注数
• 评论给我的,@我的,我评论的
• 小黄签提醒:新粉丝,新@,新评论
• 未读微博数
微博=feed+关系+数字
微博=feed+关系+数字
• 数字
• 微博,粉丝,关注数
• 评论给我的,@我的,我评论的
• 小黄签提醒:新粉丝,新@,新评论
• 未读微博数
微博=feed+关系+数字
微博=feed+关系+数字
• 数字
• 微博,粉丝,关注数
• 评论给我的,@我的,我评论的
• 小黄签提醒:新粉丝,新@,新评论
• 未读微博数
微博=feed+关系+数字
微博=feed+关系+数字

•
mysql
•
mc
•
feed
微博=feed+关系+数字

•

关系
微博=feed+关系+数字
• mysql: relation.following
•

fromuid, touid, addtime

• 关注列表:
• 粉丝列表:
• 问题:fromuid, touid 都为索引,插入慢
select ...
微博=feed+关系+数字
• mysql: relation.following relation.follower
•

fromuid, touid, addtime

• 关注列表:
• 粉丝列表:
• 问题:插入两张表,非事务,一致性...
微博=feed+关系+数字
• 双向关系:关注与粉丝的交集
• 实时计算:读的时候计算。
• 问题:效率
• 预先计算:写的时候计算,存储
• 问题:一致性,空间占用
微博=feed+关系+数字
• 我和ta的共同关注
• 我关注的人里有多少关注了ta
• 我的粉丝里有多少关注了ta
• 。。。
微博=feed+关系+数字
• 我们想要的
• 简单:c/java ,可快速通读代码
• 可靠:经过验证的
• 高效:读写速度满足需要
• 方便实现需求
微博=feed+关系+数字
• redis
• hash :
• key : user id
• fields : friends ids
• value : add time
微博=feed+关系+数字
• redis
• hash :
• hset fromuid.following touid addtime
• hset touid.follower fromuid addtime
• hgetAll from...
微博=feed+关系+数字
• hash-max-zip-size
•
•

64 -> 256,节省近 1/3 内存
cpu 消耗增大

• hgetAll cost too much cpu
• add mc
• high delay
微博=feed+关系+数字
微博=feed+关系+数字
• redis
• cache ? waste too much mem
• storage ?
• rdb may lost data
• aof r/w too slow, recover too slow
• ...
微博=feed+关系+数字
微博=feed+关系+数字
• 更新
• mysql binlog >> queue >> Java Processor
>> redis

• mysql binlog >> trigger >> redis
微博=feed+关系+数字
• 现状
• redis@weibo for now:
• TB 级
• growing fast
微博=feed+关系+数字
• 未来
• @摇摆巴赫 mysql modified + innodb
• following list of a user in one column
• still under dev
微博=feed+关系+数字

•

数字
微博=feed+关系+数字
• 永久计数
• 用户的
• 微博,粉丝,关注
• @我的,我评论的,评论我的
• 微博
• 转发,评论
微博=feed+关系+数字
微博=feed+关系+数字
• 临时计数
• 小黄签提醒
• 新粉丝,新@,新评论
• 未读微博
• 聚合计算
• 页面js每隔一段时间请求一次
微博=feed+关系+数字
• mc + queue + mysql
• 写入量:mysql 批量插入
• mc与mysql不一致
• 为了提高命中率,mc 空间需要足够大
微博=feed+关系+数字
• 我们想要的:
• 大写入量
• 大读取量
• 持久化
• 简单可靠高效
微博=feed+关系+数字
• redis
• k-v , 100 byte per k-v
•
•

mc 也一样
单个业务十亿量级的数字个数

• hash , hget pipeline slow
微博=feed+关系+数字
• redis
• rdb ? may lost data
• aof ? grow too fast (4G/day)
• bgsave/bgrewriteaof influence parent
微博=feed+关系+数字
微博=feed+关系+数字
• redis rolling
•
•
•
•

场景:微博的评论数
每天写入亿级,每天读取十亿级
明显的时间长尾
目标:将一段时间前的 key 淘汰出去
微博=feed+关系+数字
• 现状
• rediscounter @果爸果爸
• array , not linked list
• malloc all mem when start
• hash key to position
• wri...
微博=feed+关系+数字
• 未来
• rediscounter + innodb
• auto roll cold data to disk
微博=feed+关系+数字
• 未读微博数
•
•
•
•

@TimYang 亲自设计算法
@XiaoJunHong 实现
向量相减
redis (delay) - mc (throughput) - java hash map
经验教训
• 准确定位
• cache
• storage
经验教训
• 适用场景
• 大量写入
• 复杂数据结构
• 简单数据结构+持久化
• 容量小于内存
经验教训
• 容量规划
• 容量增长预估
• 读/写量预估
• 数据结构
• 内存碎片
经验教训
• 持久化
• 是否需要
• rdb or aof ?
经验教训
• 高延迟
• 持久化
• rehash
经验教训
• HA / Cluster
• 当前 Redis 本身支持不完美
• Jedis 客户端支持不完美
经验教训
• CPU 瓶颈
• Redis 单线程
• hset with big hash-max-zip-size
• hgetAll
• 对策:mc
经验教训
• 扬长避短
• 内存操作快
• 磁盘操作慢
• 偶尔高延迟
• 可能费内存
Thanks
@唐福林
http://weibo.com/tangfl
http://fulin.org
Q &A
PS. We are hiring !
contact me via @唐福林
Upcoming SlideShare
Loading in...5
×

新浪微博开放平台中的Redis实践

799
-1

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
799
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
33
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

新浪微博开放平台中的Redis实践

  1. 1. 新浪微博开放平台 Redis 实践 @唐福林 http://weibo.com/tangfl http://fulin.org
  2. 2. 大纲 • Redis 简介 • 新浪微博中的Redis实践 • 好友关系 • 计数器 • 经验教训
  3. 3. Redis • in memory (database?) • data can dump to disk • many useful data structure • FAST both read and write • we start use from 2.0, now 2.4
  4. 4. 微博=feed+关系+数字
  5. 5. 微博=feed+关系+数字 • feed • 看微博,看评论 • 发微博,转发微博,发评论
  6. 6. 微博=feed+关系+数字
  7. 7. 微博=feed+关系+数字 • 关系 • 关注,取消关注 • 关注列表,粉丝列表
  8. 8. 微博=feed+关系+数字
  9. 9. 微博=feed+关系+数字 • 数字 • 微博,粉丝,关注数 • 评论给我的,@我的,我评论的 • 小黄签提醒:新粉丝,新@,新评论 • 未读微博数
  10. 10. 微博=feed+关系+数字
  11. 11. 微博=feed+关系+数字 • 数字 • 微博,粉丝,关注数 • 评论给我的,@我的,我评论的 • 小黄签提醒:新粉丝,新@,新评论 • 未读微博数
  12. 12. 微博=feed+关系+数字
  13. 13. 微博=feed+关系+数字 • 数字 • 微博,粉丝,关注数 • 评论给我的,@我的,我评论的 • 小黄签提醒:新粉丝,新@,新评论 • 未读微博数
  14. 14. 微博=feed+关系+数字
  15. 15. 微博=feed+关系+数字 • 数字 • 微博,粉丝,关注数 • 评论给我的,@我的,我评论的 • 小黄签提醒:新粉丝,新@,新评论 • 未读微博数
  16. 16. 微博=feed+关系+数字
  17. 17. 微博=feed+关系+数字 • mysql • mc • feed
  18. 18. 微博=feed+关系+数字 • 关系
  19. 19. 微博=feed+关系+数字 • mysql: relation.following • fromuid, touid, addtime • 关注列表: • 粉丝列表: • 问题:fromuid, touid 都为索引,插入慢 select * from following where fromuid=? order by addtime desc select * from following where touid=? order by addtime desc
  20. 20. 微博=feed+关系+数字 • mysql: relation.following relation.follower • fromuid, touid, addtime • 关注列表: • 粉丝列表: • 问题:插入两张表,非事务,一致性 select * from following where fromuid=? order by addtime desc select * from follower where touid=? order by addtime desc
  21. 21. 微博=feed+关系+数字 • 双向关系:关注与粉丝的交集 • 实时计算:读的时候计算。 • 问题:效率 • 预先计算:写的时候计算,存储 • 问题:一致性,空间占用
  22. 22. 微博=feed+关系+数字 • 我和ta的共同关注 • 我关注的人里有多少关注了ta • 我的粉丝里有多少关注了ta • 。。。
  23. 23. 微博=feed+关系+数字 • 我们想要的 • 简单:c/java ,可快速通读代码 • 可靠:经过验证的 • 高效:读写速度满足需要 • 方便实现需求
  24. 24. 微博=feed+关系+数字 • redis • hash : • key : user id • fields : friends ids • value : add time
  25. 25. 微博=feed+关系+数字 • redis • hash : • hset fromuid.following touid addtime • hset touid.follower fromuid addtime • hgetAll fromuid. following • hgetAll touid.follower ? • 姚晨粉丝 11,704,598 @Wed Sep 7 21:46:33 CST 2011
  26. 26. 微博=feed+关系+数字 • hash-max-zip-size • • 64 -> 256,节省近 1/3 内存 cpu 消耗增大 • hgetAll cost too much cpu • add mc • high delay
  27. 27. 微博=feed+关系+数字
  28. 28. 微博=feed+关系+数字 • redis • cache ? waste too much mem • storage ? • rdb may lost data • aof r/w too slow, recover too slow • all data in mem, waste money HA : master slave ? NO WAY • • memory fragment
  29. 29. 微博=feed+关系+数字
  30. 30. 微博=feed+关系+数字 • 更新 • mysql binlog >> queue >> Java Processor >> redis • mysql binlog >> trigger >> redis
  31. 31. 微博=feed+关系+数字 • 现状 • redis@weibo for now: • TB 级 • growing fast
  32. 32. 微博=feed+关系+数字 • 未来 • @摇摆巴赫 mysql modified + innodb • following list of a user in one column • still under dev
  33. 33. 微博=feed+关系+数字 • 数字
  34. 34. 微博=feed+关系+数字 • 永久计数 • 用户的 • 微博,粉丝,关注 • @我的,我评论的,评论我的 • 微博 • 转发,评论
  35. 35. 微博=feed+关系+数字
  36. 36. 微博=feed+关系+数字 • 临时计数 • 小黄签提醒 • 新粉丝,新@,新评论 • 未读微博 • 聚合计算 • 页面js每隔一段时间请求一次
  37. 37. 微博=feed+关系+数字 • mc + queue + mysql • 写入量:mysql 批量插入 • mc与mysql不一致 • 为了提高命中率,mc 空间需要足够大
  38. 38. 微博=feed+关系+数字 • 我们想要的: • 大写入量 • 大读取量 • 持久化 • 简单可靠高效
  39. 39. 微博=feed+关系+数字 • redis • k-v , 100 byte per k-v • • mc 也一样 单个业务十亿量级的数字个数 • hash , hget pipeline slow
  40. 40. 微博=feed+关系+数字 • redis • rdb ? may lost data • aof ? grow too fast (4G/day) • bgsave/bgrewriteaof influence parent
  41. 41. 微博=feed+关系+数字
  42. 42. 微博=feed+关系+数字 • redis rolling • • • • 场景:微博的评论数 每天写入亿级,每天读取十亿级 明显的时间长尾 目标:将一段时间前的 key 淘汰出去
  43. 43. 微博=feed+关系+数字 • 现状 • rediscounter @果爸果爸 • array , not linked list • malloc all mem when start • hash key to position • write disk: asyn & slow down • add position to aof file
  44. 44. 微博=feed+关系+数字 • 未来 • rediscounter + innodb • auto roll cold data to disk
  45. 45. 微博=feed+关系+数字 • 未读微博数 • • • • @TimYang 亲自设计算法 @XiaoJunHong 实现 向量相减 redis (delay) - mc (throughput) - java hash map
  46. 46. 经验教训 • 准确定位 • cache • storage
  47. 47. 经验教训 • 适用场景 • 大量写入 • 复杂数据结构 • 简单数据结构+持久化 • 容量小于内存
  48. 48. 经验教训 • 容量规划 • 容量增长预估 • 读/写量预估 • 数据结构 • 内存碎片
  49. 49. 经验教训 • 持久化 • 是否需要 • rdb or aof ?
  50. 50. 经验教训 • 高延迟 • 持久化 • rehash
  51. 51. 经验教训 • HA / Cluster • 当前 Redis 本身支持不完美 • Jedis 客户端支持不完美
  52. 52. 经验教训 • CPU 瓶颈 • Redis 单线程 • hset with big hash-max-zip-size • hgetAll • 对策:mc
  53. 53. 经验教训 • 扬长避短 • 内存操作快 • 磁盘操作慢 • 偶尔高延迟 • 可能费内存
  54. 54. Thanks @唐福林 http://weibo.com/tangfl http://fulin.org
  55. 55. Q &A PS. We are hiring ! contact me via @唐福林
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×