刘祥超 05/06/2011<br />SNS中的MongoDB<br />
个人介绍<br />Iwind – 架构师<br />RockMongo – MongoDB管理软件http://code.google.com/p/rock-php<br />PHP+MongoDB<br />将近一年的版本更新<br />9...
Why mongo<br />MongoDBvs RDBS<br />MongoDBvs other NoSQLs<br />文档模型的优势<br />
MongoDBvs RDBS<br />RDBS<br />稳定和健壮<br />成熟的解决方案<br />结构分散,查询繁琐<br />效率低下<br />MongoDB<br />快速发展当中,不够成熟<br />新的编程模式<br />K...
MongoDBvs其他NoSQL<br />其他NoSQL<br />存储对象间关系较弱<br />Set/get速度极快<br />适合做缓存<br />MongoDB<br />支持存储对象间的查询<br />Group/distinct<...
MongoDB文档模型的优势<br />BSON<br />Encode/decode 快,在PHP中<br />比json速度快30%<br />比serialize速度快100%<br />JSON<br />易于学习<br />一次性读取...
SNS中的技术特点<br />以用户为中心<br />高并发<br />写操作频繁<br />服务稳定性<br />高扩展性<br />即时功能<br />IM<br />消息<br />
特点 - 以用户为中心<br />索引<br />以uid为第一过滤条件<br />
特点 – 高并发<br />Replica Set http://www.mongodb.org/display/DOCS/Replica+Sets<br />读写分离、分布:slaveOkay<br />
特点 – 写操作频繁<br />Replica Set<br />
特点 - 服务稳定性<br />Replica Set<br />数据冗余<br />故障转移<br />热维护<br />故障恢复:<br />delayed secondary - slaveDelay<br />
特点 – 高扩展性<br />Sharding<br />http://www.mongodb.org/display/DOCS/Sharding<br />maxSize<br />
特点 – 即时<br />MongoDB可以支撑长连接<br />配合Memcache<br />
设计原则<br />效率<br />简单<br />限制<br />
设计原则 – 效率<br />优先选择效率高的方案<br />保留扩展的可能<br />
设计原则– 简单<br />简化数据结构<br />制定通用的规则<br />命名<br />集合设计模式<br />不考虑未知的需求<br />尽可能减少字段<br />尽可能聚合而非拆分<br />
设计原则 – 限制<br />只使用MongoDB作为存储数据库<br />只考虑在Linux/Unix下的运行效率<br />只考虑Nginx下的优化<br />只支持某一种开发语言<br />Java<br />PHP<br />对SNS做...
Schema<br />仅供参考<br />Map: { … }<br />List: [ … ]<br />
常用模式<br />自定义函数<br />模版模式<br />
自定义函数 – sytem.js<br />在控制台上操作<br />参考RockMongo<br />
自定义函数<br />实际应用中不会明显提升效率<br />简化程序<br />可以根据关联集合过滤数据<br />可以一次性取出多个集合的数据<br />可以批量提交更新<br />由于效率问题,不应该只使用$where<br />
自定义函数 - 示例<br />
模版模式<br />分离数据和显示<br />易扩展和维护<br />体积小<br />存储<br />渲染<br />
SNS常用功能的设计<br />好友<br />新鲜事<br />在线状态<br />访问统计<br />聊天会话<br />事件<br />
好友设计<br />一次性读取list<br />$slice分页<br />公共的好友:<br />Intersect($list1, $list2)<br />好友的好友(可能认识的好友)<br />$diff = Diff($list1,...
新鲜事设计 - 1<br />样式各异<br />只需要保留最近的<br />
新鲜事设计 - 2<br />设计<br />查询 $in<br />
在线状态设计<br />State<br />0 离线<br />1在线<br />放在users表中<br />
在线状态 – 查询<br />状态<br />离线:online.state=0||updated_at<最近五分钟<br />离开:online.state=1 && updated_at>最近五分钟<br />在线:online.state...
在线状态 – 更新<br />comet轮询中更新<br />
访问统计设计<br />日统计<br />月统计<br />总访问数<br />$addToSet<br />查询<br />
聊天会话设计<br />
聊天会话 – 对象<br />会话人 – connections<br />会话 – conversations<br />消息 - messages<br />
聊天会话 – 设计<br />
聊天会话 – 查询<br />通过conversation_id将两人联系起来,理论上是多人的<br />查询user_connections取得正在会话的人<br />查询user_conversations查询当前会话的状态<br />查询...
事件设计<br />事件源<br />控制中心<br />订阅者<br />事件<br />
事件 – 查询<br />订阅事件 $addToSet events<br />发布事件 <br />$set list.事件类型:事件数据<br />$set updated_at_ms<br />查询事件<br />comet长轮询<br ...
总结<br />减少查询,尽可能一次到位<br />减少查询的字段数<br />在对象中多使用嵌套的Map/List<br />$addToSet减少查询<br />
配合工具<br />目的<br />减少查询<br />用更适合的工具做不同的事情<br />Memcached比MongoDB快2~3倍<br />Nginx<br />Fastcgi cache<br />Memcached<br />分布...
Thanks<br />Thanks<br />
Upcoming SlideShare
Loading in...5
×

MongoDB in SNS

2,688

Published on

MongoDB Beijing Meetup on May 7th.

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

No Downloads
Views
Total Views
2,688
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
111
Comments
0
Likes
13
Embeds 0
No embeds

No notes for slide

MongoDB in SNS

  1. 1. 刘祥超 05/06/2011<br />SNS中的MongoDB<br />
  2. 2. 个人介绍<br />Iwind – 架构师<br />RockMongo – MongoDB管理软件http://code.google.com/p/rock-php<br />PHP+MongoDB<br />将近一年的版本更新<br />9种国际化语言<br />Windows/MacOS/Unix的集成环境<br />7 committers and contributors<br />欢迎合作开发社区和游戏产品<br />联系方式:<br />Gmail: iwind.liu@gmail.com<br />QQ: 19644627<br />
  3. 3. Why mongo<br />MongoDBvs RDBS<br />MongoDBvs other NoSQLs<br />文档模型的优势<br />
  4. 4. MongoDBvs RDBS<br />RDBS<br />稳定和健壮<br />成熟的解决方案<br />结构分散,查询繁琐<br />效率低下<br />MongoDB<br />快速发展当中,不够成熟<br />新的编程模式<br />Key/value<br />高存储和读写效率 <br />安装、维护、扩展容易<br />
  5. 5. MongoDBvs其他NoSQL<br />其他NoSQL<br />存储对象间关系较弱<br />Set/get速度极快<br />适合做缓存<br />MongoDB<br />支持存储对象间的查询<br />Group/distinct<br />MapReduce<br />驱动较全C/C++/Java/PHP/node.JS /Scala…<br />Set/get稍弱<br />适合做存储<br />
  6. 6. MongoDB文档模型的优势<br />BSON<br />Encode/decode 快,在PHP中<br />比json速度快30%<br />比serialize速度快100%<br />JSON<br />易于学习<br />一次性读取一组信息<br />容易集成到其他系统中<br />使用嵌套对象减少集合数量<br />
  7. 7. SNS中的技术特点<br />以用户为中心<br />高并发<br />写操作频繁<br />服务稳定性<br />高扩展性<br />即时功能<br />IM<br />消息<br />
  8. 8. 特点 - 以用户为中心<br />索引<br />以uid为第一过滤条件<br />
  9. 9. 特点 – 高并发<br />Replica Set http://www.mongodb.org/display/DOCS/Replica+Sets<br />读写分离、分布:slaveOkay<br />
  10. 10. 特点 – 写操作频繁<br />Replica Set<br />
  11. 11. 特点 - 服务稳定性<br />Replica Set<br />数据冗余<br />故障转移<br />热维护<br />故障恢复:<br />delayed secondary - slaveDelay<br />
  12. 12. 特点 – 高扩展性<br />Sharding<br />http://www.mongodb.org/display/DOCS/Sharding<br />maxSize<br />
  13. 13. 特点 – 即时<br />MongoDB可以支撑长连接<br />配合Memcache<br />
  14. 14. 设计原则<br />效率<br />简单<br />限制<br />
  15. 15. 设计原则 – 效率<br />优先选择效率高的方案<br />保留扩展的可能<br />
  16. 16. 设计原则– 简单<br />简化数据结构<br />制定通用的规则<br />命名<br />集合设计模式<br />不考虑未知的需求<br />尽可能减少字段<br />尽可能聚合而非拆分<br />
  17. 17. 设计原则 – 限制<br />只使用MongoDB作为存储数据库<br />只考虑在Linux/Unix下的运行效率<br />只考虑Nginx下的优化<br />只支持某一种开发语言<br />Java<br />PHP<br />对SNS做出限制<br />只考虑1000条数据<br />允许数据显示的延迟(<10s)<br />特殊问题特殊对待<br />
  18. 18. Schema<br />仅供参考<br />Map: { … }<br />List: [ … ]<br />
  19. 19. 常用模式<br />自定义函数<br />模版模式<br />
  20. 20. 自定义函数 – sytem.js<br />在控制台上操作<br />参考RockMongo<br />
  21. 21. 自定义函数<br />实际应用中不会明显提升效率<br />简化程序<br />可以根据关联集合过滤数据<br />可以一次性取出多个集合的数据<br />可以批量提交更新<br />由于效率问题,不应该只使用$where<br />
  22. 22. 自定义函数 - 示例<br />
  23. 23. 模版模式<br />分离数据和显示<br />易扩展和维护<br />体积小<br />存储<br />渲染<br />
  24. 24. SNS常用功能的设计<br />好友<br />新鲜事<br />在线状态<br />访问统计<br />聊天会话<br />事件<br />
  25. 25. 好友设计<br />一次性读取list<br />$slice分页<br />公共的好友:<br />Intersect($list1, $list2)<br />好友的好友(可能认识的好友)<br />$diff = Diff($list1, $list2)<br />$diff = Diff($list1, $list3)<br />…<br />Top(group($diff))<br />方便分组<br />
  26. 26. 新鲜事设计 - 1<br />样式各异<br />只需要保留最近的<br />
  27. 27. 新鲜事设计 - 2<br />设计<br />查询 $in<br />
  28. 28. 在线状态设计<br />State<br />0 离线<br />1在线<br />放在users表中<br />
  29. 29. 在线状态 – 查询<br />状态<br />离线:online.state=0||updated_at<最近五分钟<br />离开:online.state=1 && updated_at>最近五分钟<br />在线:online.state=1 && updated_at>最近1分钟<br />列表<br />在线的好友:<br />db.users.find({ “uid”: {$in: [friends], “在线”:1 } })<br />在线的人的资源:<br />is_online函数:在online中查询db.users表<br />db.resources.find({ $where: “is_online(this.uid)” })<br />
  30. 30. 在线状态 – 更新<br />comet轮询中更新<br />
  31. 31. 访问统计设计<br />日统计<br />月统计<br />总访问数<br />$addToSet<br />查询<br />
  32. 32. 聊天会话设计<br />
  33. 33. 聊天会话 – 对象<br />会话人 – connections<br />会话 – conversations<br />消息 - messages<br />
  34. 34. 聊天会话 – 设计<br />
  35. 35. 聊天会话 – 查询<br />通过conversation_id将两人联系起来,理论上是多人的<br />查询user_connections取得正在会话的人<br />查询user_conversations查询当前会话的状态<br />查询user_messages查询会话的消息<br />每个消息两份,可以单方面删除或清空<br />
  36. 36. 事件设计<br />事件源<br />控制中心<br />订阅者<br />事件<br />
  37. 37. 事件 – 查询<br />订阅事件 $addToSet events<br />发布事件 <br />$set list.事件类型:事件数据<br />$set updated_at_ms<br />查询事件<br />comet长轮询<br />先检查updated_at_ms<br />再取数据<br />
  38. 38. 总结<br />减少查询,尽可能一次到位<br />减少查询的字段数<br />在对象中多使用嵌套的Map/List<br />$addToSet减少查询<br />
  39. 39. 配合工具<br />目的<br />减少查询<br />用更适合的工具做不同的事情<br />Memcached比MongoDB快2~3倍<br />Nginx<br />Fastcgi cache<br />Memcached<br />分布式的内存缓存<br />共享内存<br />内存缓存,比Memcached快3~4倍<br />MongoDB<br />Memcached<br />Share Memory<br />Nginx<br />
  40. 40. Thanks<br />Thanks<br />
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×