Your SlideShare is downloading. ×
新浪微博开放平台中的Redis实践
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

717

Published on

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

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

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×