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. SharePoint 2013 页面访问,Url中间多一段"_layouts/15/start.aspx#"

    问题描述: 我想访问如下页面 http://Host/_layouts/15/ManageFeatures.aspx 点击以后页面地址没有错,但是中间多了一段"_layouts/15/sta ...

  2. C语言笔试经典-查找多位数重复数字以及次数

    从键盘输入一个多位的整数 用程序判断 这个数里面有没有 重复的数字  有重复的数字就打印  哪个数字重复了  重复了几次 例如:输入:1122431 打印结果: 1重复 出现3次 2重复 出现2次, ...

  3. SoC嵌入式软件架构设计

    内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...

  4. 和菜鸟一起学linux之常见错误的解决和常用命令

    1.错误提示:make:警告:检测到时钟错误.您的创建可能是不完整的. 解决方法:当前编译目录下,命令行输入:find . -type f -exec touch {} \; 2.SSH生成密钥:ss ...

  5. CF633G

    题目大意: 给你一棵树,根节点为1 有2种操作,第一种是给u节点所在的子树的所有节点的权值+x 第二种是询问,假设v是子树u中的节点,有多少种质数满足av = p + m·k 做法:维护子树信息显然d ...

  6. 在 javascript 中,为什么 [1,2] + [3,4] 不等于 [1,2,3,4]?

    在 stackoverflow 上有人提问:arrays - Why does [1,2] + [3,4] = "1,23,4" in JavaScript? 问题 我想将一个数组 ...

  7. memocache 分布式搭建

    memcached+magent实现memcached集群   首先说明下memcached存在如下问题 本身没有内置分布式功能,无法实现使用多台Memcache服务器来存储不同的数据,最大程度的使用 ...

  8. struts2线程安全

     struts2线程安全 2012-02-16 21:07:58 分类: 系统运维 问题:Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题.Spring的Ioc容器管理 ...

  9. Java框架-Spring MVC理解001

    Spring MVC理解 1.servlet--Spring MVC的本质 2.Spring MVC其实是一个工具,具体的理解可以分为两步:第一步,了解这个工具是怎么创建出来的:第二步,了解这个工具是 ...

  10. IIR滤波器软件实现(Matlab+C++)

    使用C++来写一个IIR滤波器 我们首先要在MATLAB中设计一个IIR滤波器,并生成一个头文件,这个头文件中反映了IIR滤波器的频率响应特性 理论支持 IIR滤波叫做递归滤波器,它是一种具有反馈的滤 ...