app后端的开发中,经常要面临的一个问题是:数据放在哪里? mysql ?redis?mongodb?

  

  现在有这么多优秀的开源数据库产品,怎么根据业务场景来选择合适的数据?

  

  常用的数据库产品的优缺点又是什么呢?

  

  通过阅读这篇文章,能帮你解决以上的疑惑,使你在碰到数据存储选择问题时思路更清晰。

  

1. redis,mongodb,mysql存储数据的区别

  

  数据,就涉及读和写这两个问题.出于性能的考虑,当然希望读和写的速度越快越好.

  

  计算机中,数据一般都放在内存或硬盘,众所周知,内存的读写速度比硬盘快多了。因此,为了获得更快的读写速度,数据尽可能放在内存中。

  

  但是,内存的容量是非常有限的,例如,在ucloud的服务器上,最多只能拥有64G的内存,而ucloud的服务器上的单个硬盘,最多可高达1000G。

  

  redis的数据是放在服务器的内存中,当内存用满了,redis就没折了(现在只有第三方的分布式解决方案,官方的分布式方案要在3.0版本才会出。)。当然了,为了防止数据丢失,可通过配置文件,把数据在硬盘上做一个备份。

  

  mongodb的数据主要是放在内存中,如果mongodb发现内存满了,数据再也放不下了,mongodb就把新增的数据放在硬盘中。如果是采用分布式架构,那基本不用考虑数据会放在硬盘中。

  

  mysql的数据是放在硬盘中。虽然mysql也有缓存,但mysql缓存的是查询的结果,而不是缓存数据。

  

2. redis,mongodb,mysql查找数据的区别

  

  如果你想在一栋大楼里找某个房间,但是你不知道这个房间的门牌号,只记得这个房间的门是非常特别的,那找到这个房间唯一的方式只能每层楼逐个房间找一次,直到找到这个房间为止。

  

  如果你知道了这个房间的门牌号,那很简单,直奔那个楼层就是了。

  

  redis的数据是基于“键值对”存储,“键”相当于门牌号,“值”相当于房间。redis查找数据,每次都是直奔目标,读写速度当然高。

  

  mongodb和mysql中,每组数据都有一个id(或者可以为每组数据建索引),这个id或索引就相当于门牌号。

  

  mongodb和mysql中查找数据,有两种模式,知道id或索引,和不知道知道id或索引。知道id或索引,就相当于知道门牌号,那就直奔目标就行了,效率很高。如果不知道id或索引的情况下查找数据,那就相当于每层楼逐个房间找,效率很低。

  

3. redis,mongodb,mysql适用场景

  

redis适用场景:

  

  数据读写速度快,但由于redis数据只存放在一台服务器的内存中(现在只有第三方的分布式解决方案,官方的分布式方案要在3.0版本才会出来),所以存储数据有限。

  

  同时,由于redis存放的数据必须是键值对(key-value)的形式,在读写redis的数据时必须要知道键,这点需要考虑。

  

  所以,在app后端中,最讲求读写效率,最频繁读的数据一般都会放在redis中(当然,这部分数据同时也存在于mysql 或者mongodb中, redis中的数据是一个冗余,当数据更新的时候,两部分都要更新)。

  

  举例,在社交app中,很多操作都需要验证用户的登录信息,那一般怎么做的呢?

  

  用户登录后,服务器会把一个token符串返回给用户,假设这个token字符串为"abcdsdf", 服务器中已经登记了这个token符串,而且把这个tokentoken符串和用户的信息关联在一起,通过这个token符串就能查询到用户的信息。

  

  当遇到需要验证用户的登录信息,就把这个token字符串传给服务器,服务器根据这个token的信息,在服务器中查找这个用户的信息。

  

  在社交app中,大多数的操作都需要这个验证,可以看出,是个很频繁的操作,而且这个操作需要在极短的时间内完成。

  

  那么,这个token字符串和用户的信息,就很适合放在redis中,把token字符串当成一个key(键),用户的信息当成是value(值),查找起来非常方便和高效。

  

  当然了,验证用户的登录信息还需要很多安全的措施,这里只讲一个最简单的模型,在以后的《app通讯安全性》一文中会讲完善的安全措施。

  

mongodb适用场景:

  

  a.网站数据:mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

  

  b.缓存:由于性能很高,mongo也适合作为信息基础设施的缓存层。在系统重启之后,由mongo搭建的持久化缓存可以避免下层的数据源过载。

  

  c.大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比较贵,在此之前,很多程序员往往会选择传统的文件进行存储。

  

  d.高伸缩性的场景:mongo非常适合由数十或者数百台服务器组成的数据库。

  

  e.存储地理坐标的数据。mongo支持非常强大的地理坐标的查询,例如,可以在某个矩形范围内的用户。非常适合于LBS的应用。

  

  mongodb不适合的场景:

  

  a.高度事物性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。

  

  例如,涉及金钱的操作,假设要把转账,必须从一个账号上扣钱,再在另外一个账号上把钱转账。这个操作必须保证要么两个都完成,要么两个都不做,不能只做一个。但很遗憾,由于mongodb不支持事务,所以没法保证。

  

  b. 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

  

  c. 需要SQL的问题。虽然mongodb支持类似于sql的查询方式,但它的查询比起mysql还是有一定的差距。

  

mysql适用场景:

  

  a. 事物性的系统。例如,在mongodb中举例的转账的例子

  

  b. 需要复杂SQL的问题。

  

  简单地来说,综合考虑后,发现数据不适合放在redis和mongodb后,那就把数据放在mysql吧^-^

---------------------------------------------------------------------------------------------------------------------------

打开链接  app后端系列文章总目录 总目录 ,能查看本人发表过的所有原创“app后端”文章。

【作者】曾健生

【QQ】190678908

【qq群】254659220 

【微信公众号】 appbackend

【新浪微博】 @newjueqi

【博客】http://blog.csdn.net/newjueqi

版权声明:本文为博主原创文章,未经博主允许不得转载。

12.app后端如何选择合适的数据库产品的更多相关文章

  1. 【转】app后端如何选择合适的数据库产品

    转自:http://blog.csdn.net/newjueqi/article/details/44003503 app后端的开发中,经常要面临的一个问题是:数据放在哪里? mysql ?redis ...

  2. NoSQL系列:选择合适的数据库

    NoSQL系列:选择合适的数据库 为什么使用NoSQL数据库? 阻抗失衡 关系模型和内存中的数据结构不匹配 采用更为方便的数据交互方式提升开发效率 待处理的数据量很大 数据量超过关系型数据库的承载能力 ...

  3. (转)NoSQL系列:选择合适的数据库

    内容目录: 为什么使用NoSQL数据库? 键值数据库 文档数据库 列族数据库 图数据库 附思维导图 参考 NoSQL系列:选择合适的数据库 为什么使用NoSQL数据库? 阻抗失衡 关系模型和内存中的数 ...

  4. app后端设计--总目录 (转)

    特此说明,我转载的!!! app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务 app后端设计(4)-- 通讯的安全性 app后端设计( ...

  5. app后端设计--总目录

    做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,现就职于app云后端平台bmob(想了解bmob点击这里).其中的乐与苦 ...

  6. [置顶] app后端设计--总目录

    版权声明:本文为博主原创文章,未经博主允许不得转载. 做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,Android客户端,iphone客户端,现就职于app云后 ...

  7. 1.用互联网的产品思维打造一本app后端的书

    刚刚接触app后端,是做完adidas中国的官方商城的时候,那时不清楚app后端应该怎么架构,只能摸着石头过河,网络上只有一些零散的资料,遇到问题,只能不断地搜索,思考,务必找到解决问题的方法. 在从 ...

  8. app后端设计(11)-- 系统架构(2014.12.05更新)

    个人认为,在小型的创业团队中,特别是以应用产品为主,在架构后台的时候,需要集中精力解决自身业务上的问题,不是花时间解决第三方已经解决的问题,简单点来说,就是能用第三方服务就使用第三方的服务.基于这个原 ...

  9. app后端设计(12)--图片的处理

    app上线后,不断接受用户的反馈,于是,反馈非常差的情况下,都会有app的改版. 一旦app的改版,都会有比较大的UI改动,一改动UI,那么图片的尺寸也就必须要改变. 在app后端设计(1)—api( ...

随机推荐

  1. web报表工具FineReport最经常用到部分函数详解

    之前分别列出来了finereport常用的文本.时间函数的解释,这里应广大朋友的要求,整理了finereport最常用到的一些函数! SUM SUM(number1,number2,-):求一个指定单 ...

  2. MR PAGERANK思路

    map( key: [url, pagerank], value: outlink_list ) for each outlink in outlink_list emit( key: outlink ...

  3. SharePoint 用户控件编写的简单介绍

    我们开发中,通常需要写各种各样的部件来实现我们的展示或者功能,下面就介绍下刚刚接触的QuickPart+用户控件的方式,算是自己的学习笔记,也和大家交流下心得. 1. 新建Web应用程序 2. 在项目 ...

  4. coco2dx添加类报错

    最近刚开始学习2dx,用的vs编辑器,现在说说我使用时碰到的一点小问题: 我使用的类添加向导,但是添加的类在win32目录下,而且编译的时候总是提示找不到 .h 文件 其实,这样添加类不是很好,可以在 ...

  5. obj-c编程15[Cocoa实例04]:基于Core Data的多文档程序示例[未完待续]

    上一个例子我们使用的模式数据实际上是基于一个Person数组,现在我们看一下如何使用Cocoa中的Core Data框架支持,几乎不用写一行代码,完成模式数据的建立. 我们这里模式的元素使用的是Car ...

  6. java并发编程——通过ReentrantLock,Condition实现银行存取款

         java.util.concurrent.locks包为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器.该框架允许更灵活地使用锁和条件,但以更难用的语法为代价. Lock 接口 ...

  7. 前端技术之_CSS详解第四天

    前端技术之_CSS详解第四天 一.第三天的小总结 盒模型box model,什么是盒子? 所有的标签都是盒子.无论是div.span.a都是盒子.图片.表单元素一律看做文本. 盒模型有哪些组成: wi ...

  8. Hibernate中的对象有三种状态

    Hibernate中的对象有三种状态: 瞬时状态 (Transient),持久状态 (Persistent), 1. 脱管状态 (Detached) 1. 1. 瞬时状态 (Transient) 由  ...

  9. JavaScript数组中出现的次数最多的元素

    var arr = [1,-1,2,4,5,5,6,7,5,8,6]; var maxVal = arr[0]; // 数组中的最大值 var minVal = arr[0]; // 数组中的最小值 ...

  10. 3 Steps to Perform SSH Login Without Password Using ssh-keygen & ssh-copy-id

    http://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-password-using-ssh-keygen-s ...