12.app后端如何选择合适的数据库产品
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后端如何选择合适的数据库产品的更多相关文章
- 【转】app后端如何选择合适的数据库产品
转自:http://blog.csdn.net/newjueqi/article/details/44003503 app后端的开发中,经常要面临的一个问题是:数据放在哪里? mysql ?redis ...
- NoSQL系列:选择合适的数据库
NoSQL系列:选择合适的数据库 为什么使用NoSQL数据库? 阻抗失衡 关系模型和内存中的数据结构不匹配 采用更为方便的数据交互方式提升开发效率 待处理的数据量很大 数据量超过关系型数据库的承载能力 ...
- (转)NoSQL系列:选择合适的数据库
内容目录: 为什么使用NoSQL数据库? 键值数据库 文档数据库 列族数据库 图数据库 附思维导图 参考 NoSQL系列:选择合适的数据库 为什么使用NoSQL数据库? 阻抗失衡 关系模型和内存中的数 ...
- app后端设计--总目录 (转)
特此说明,我转载的!!! app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务 app后端设计(4)-- 通讯的安全性 app后端设计( ...
- app后端设计--总目录
做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,现就职于app云后端平台bmob(想了解bmob点击这里).其中的乐与苦 ...
- [置顶] app后端设计--总目录
版权声明:本文为博主原创文章,未经博主允许不得转载. 做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,Android客户端,iphone客户端,现就职于app云后 ...
- 1.用互联网的产品思维打造一本app后端的书
刚刚接触app后端,是做完adidas中国的官方商城的时候,那时不清楚app后端应该怎么架构,只能摸着石头过河,网络上只有一些零散的资料,遇到问题,只能不断地搜索,思考,务必找到解决问题的方法. 在从 ...
- app后端设计(11)-- 系统架构(2014.12.05更新)
个人认为,在小型的创业团队中,特别是以应用产品为主,在架构后台的时候,需要集中精力解决自身业务上的问题,不是花时间解决第三方已经解决的问题,简单点来说,就是能用第三方服务就使用第三方的服务.基于这个原 ...
- app后端设计(12)--图片的处理
app上线后,不断接受用户的反馈,于是,反馈非常差的情况下,都会有app的改版. 一旦app的改版,都会有比较大的UI改动,一改动UI,那么图片的尺寸也就必须要改变. 在app后端设计(1)—api( ...
随机推荐
- Android特效专辑(二)——ViewPager渲染背景颜色渐变(引导页)
Android特效专辑(二)--ViewPager渲染背景颜色渐变(引导页) 首页:http://blog.csdn.net/qq_26787115/article/details/50439020 ...
- Angular v6 正式发布
Angular 6 正式发布 Angular 6 已经正式发布了!这个主要版本并不关注于底层的框架,更多地关注于工具链,以及使 Angular 在未来更容易快速推进. 作为发布的一部分,我们同步了主要 ...
- nodejs+express blog项目分享
项目简介:项目采用nodejs+express+typescript+mongodb技术搭建 主要功能: 1.用户注册 2.用户登录 3.文章管理模块 4.图片管理模块 5.token认证 6.密码加 ...
- miniUI Grid添加汇总行,Grid绑定数据,IDEA免编译设置
坑1: 2017-6-5周二,上午解决了昨天摸索一下午的问题,使用miniui显示汇总行数据,要点有这么几个 在创建Grid div的时候一定要加上以下两个属性: //显示汇总行开关 showSumm ...
- java日期操作常用工具
java日期操作常用工具 package com..util; import java.sql.Timestamp; import java.text.SimpleDateFormat; import ...
- 小议 HashMap
大家都知道,在Java里对对象的操作是基于引用的.而当我们需要对一组对象操作的时候,就需要有接收这一组引用的容器.平时我们最常用的就是数组.在Java里可以定义一个对象数组来完成许多操作.可是,数组长 ...
- sublime使用技巧之集成VI
熟悉开发工具,减少多余的操作流程有助于提高开发效率,而Sublime Text 2是sublime产品的经典版本,因此本文基于Sublime Text 2讲解sublime的使用技巧. VI的主要作用 ...
- ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
官方已经给出解决方案:https://github.com/pyenv/pyenv/wiki/Common-build-problems#error-the-python-ssl-extension- ...
- MDCC2013会议笔记
技术性的Topic听的不多,也没记多少东西. 下面这些是产品设计论坛的笔记: 互联网为实体行业带来:数据驱动,用户参与,快速验证想法 体验整合:线上与线下,产品与服务,运营与营销,用户和利益相关方体验 ...
- 基于RecyclerView的瀑布流实现
fragment的布局: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...