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

Weitere ähnliche Inhalte

Ähnlich wie MongoDB in SNS

Introduction to NoSQL
Introduction to NoSQLIntroduction to NoSQL
Introduction to NoSQLjasonfuoo
 
Nosql七种武器之长生剑 mongodb的使用介绍
Nosql七种武器之长生剑 mongodb的使用介绍Nosql七种武器之长生剑 mongodb的使用介绍
Nosql七种武器之长生剑 mongodb的使用介绍yczealot
 
MongoDB Basics and Tutorial
MongoDB Basics and TutorialMongoDB Basics and Tutorial
MongoDB Basics and TutorialHo Kim
 
51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundryHong Cai
 
深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo dbLucien Li
 
Mongo db 簡介
Mongo db 簡介Mongo db 簡介
Mongo db 簡介昱劭 劉
 
110412 kningsoft-mongo db-intro-usage-in-mercury
110412 kningsoft-mongo db-intro-usage-in-mercury110412 kningsoft-mongo db-intro-usage-in-mercury
110412 kningsoft-mongo db-intro-usage-in-mercuryZoom Quiet
 
Bootstrap 導入分享
Bootstrap 導入分享Bootstrap 導入分享
Bootstrap 導入分享得翔 徐
 
Google code开源项目精选:
Google code开源项目精选:Google code开源项目精选:
Google code开源项目精选:wensheng wei
 
前端工程開發實務訓練
前端工程開發實務訓練前端工程開發實務訓練
前端工程開發實務訓練Joseph Chiang
 
IDF2013大会分享——《使用新浪移动云开发全平台应用》
IDF2013大会分享——《使用新浪移动云开发全平台应用》IDF2013大会分享——《使用新浪移动云开发全平台应用》
IDF2013大会分享——《使用新浪移动云开发全平台应用》easychen
 
I os与android多平台开发心得
I os与android多平台开发心得I os与android多平台开发心得
I os与android多平台开发心得drewz lin
 
Responsive Web Design [rebuild as design]
Responsive Web Design [rebuild as design]Responsive Web Design [rebuild as design]
Responsive Web Design [rebuild as design]Benny Chak
 
Taobao数据库这5年
Taobao数据库这5年Taobao数据库这5年
Taobao数据库这5年yp_fangdong
 
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1Yi-Feng Tzeng
 
如何逐步提升CSS的可利用性、模組化
如何逐步提升CSS的可利用性、模組化如何逐步提升CSS的可利用性、模組化
如何逐步提升CSS的可利用性、模組化洧杰 廖
 
Mongodb 20110610
Mongodb 20110610Mongodb 20110610
Mongodb 20110610小 米猪
 
Big Java, Big Data
Big Java, Big DataBig Java, Big Data
Big Java, Big DataKuo-Chun Su
 

Ähnlich wie MongoDB in SNS (20)

Introduction to NoSQL
Introduction to NoSQLIntroduction to NoSQL
Introduction to NoSQL
 
Nosql七种武器之长生剑 mongodb的使用介绍
Nosql七种武器之长生剑 mongodb的使用介绍Nosql七种武器之长生剑 mongodb的使用介绍
Nosql七种武器之长生剑 mongodb的使用介绍
 
MongoDB Basics and Tutorial
MongoDB Basics and TutorialMongoDB Basics and Tutorial
MongoDB Basics and Tutorial
 
51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry
 
深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo db
 
Mongo db 簡介
Mongo db 簡介Mongo db 簡介
Mongo db 簡介
 
Go
GoGo
Go
 
110412 kningsoft-mongo db-intro-usage-in-mercury
110412 kningsoft-mongo db-intro-usage-in-mercury110412 kningsoft-mongo db-intro-usage-in-mercury
110412 kningsoft-mongo db-intro-usage-in-mercury
 
Mongo db 特性
Mongo db 特性Mongo db 特性
Mongo db 特性
 
Bootstrap 導入分享
Bootstrap 導入分享Bootstrap 導入分享
Bootstrap 導入分享
 
Google code开源项目精选:
Google code开源项目精选:Google code开源项目精选:
Google code开源项目精选:
 
前端工程開發實務訓練
前端工程開發實務訓練前端工程開發實務訓練
前端工程開發實務訓練
 
IDF2013大会分享——《使用新浪移动云开发全平台应用》
IDF2013大会分享——《使用新浪移动云开发全平台应用》IDF2013大会分享——《使用新浪移动云开发全平台应用》
IDF2013大会分享——《使用新浪移动云开发全平台应用》
 
I os与android多平台开发心得
I os与android多平台开发心得I os与android多平台开发心得
I os与android多平台开发心得
 
Responsive Web Design [rebuild as design]
Responsive Web Design [rebuild as design]Responsive Web Design [rebuild as design]
Responsive Web Design [rebuild as design]
 
Taobao数据库这5年
Taobao数据库这5年Taobao数据库这5年
Taobao数据库这5年
 
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
 
如何逐步提升CSS的可利用性、模組化
如何逐步提升CSS的可利用性、模組化如何逐步提升CSS的可利用性、模組化
如何逐步提升CSS的可利用性、模組化
 
Mongodb 20110610
Mongodb 20110610Mongodb 20110610
Mongodb 20110610
 
Big Java, Big Data
Big Java, Big DataBig Java, Big Data
Big Java, Big Data
 

MongoDB in SNS