了解一些非关系型数据库。
01 定义
阿里云论坛:MongoDB:是一个数据库 ,高性能、无模式、文档性,目前 nosql 中最热门的数据库,开源产品,基于 c++开发。是 nosql 数据库中功能最丰富,最像关系数据库的。
为什么 mongodb 很耗内存?读和写都是基于内存的。
腾讯云文章:MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
百度百科介绍:MangoDB 由 c++ 编写,运行效率自然不低,分布式文件存储系统,开源数据库系统,谁都可以用。
MongoDB.com: MongoDB 是一个文档数据库,为简化应用程序的开发与扩展而设计。MongoDB Atlas :用于云端 MongoDB 部署的完全托管服务。MongoDB Enterprise:基于订阅、自行管理的 MongoDB 版本。MongoDB Community:source-available、可免费使用以及自行管理的 MongoDB 版本。这是官网资料,针对不同客户需求有不同版本。
知乎介绍:MongoDB是一个基于文档型数据库,MongoDB中文档数据,使用BSON(一种和JSON类似的)东西作为数据格式。数据结构符合大部分程序语言。可在文档内嵌入子文档(相当于传统数据库的嵌套表)。动态增减文档或修改文档格式。
稀土掘金:MongoDB是一个开源、高性能、无模式的文档数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品的一种。是最像关系型数据库(MySQL)的非关系型数据库。
它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以它既可以存比较复杂的数据类型,又相当的灵活。
MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构,MongoDB文档类似于JSON对象,即一个文档认为就是一个对象。字段的数据类型是字符,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。
02 使用场景
1.弱一致性场合
2.读取频繁的场合
3.数据量较大,必须分片的场合
4.不规则数据,且频繁更新数据类型的场合
5.需要可以动态追加数据字段或修改数据字段类型的场合
03 最佳实践案例
案例来自知乎。
东方航空的挑战
东方航空作为国内的3大行之一,每天有1000多个航班,服务26万多乘客。过去,顾客在网站上订购机票,平均资料库查询200次就会下单订购机票,但是现在平均要查询1.2万次才会发生一次订购行为,同样的订单量,查询量却成长百倍。按照50%直销率这个目标计算,东航的运价系统要支持每天16亿的运价请求。
思路:空间换时间
当前的运价是通过实时计算的,按照当时的计算能力,需要对已有系统进行100多倍的扩容。另一个常用的思路,就是采用空间换时间的方式。与其对每一次的运价请求进行耗时300ms的运算,不如事先把所有可能的票价查询组合穷举出来并进行批量计算,然后把结果存入MongoDB里面。当需要查询运价时,直接按照 出发+目的地+日期的方式做一个快速的DB查询,响应时间应该可以做到几十毫秒。
那为什么要用MongoDB?
因为我们要处理的数据量庞大无比。按照1000多个航班,365天,26个仓位,100多渠道以及数个不同的航程类型,我们要实时存取的运价记录有数十亿条之多。这个已经远远超出常规RDBMS可以承受的范围。
MongoDB基于内存缓存的数据管理方式决定了对并发读写的响应可以做到很低延迟,水平扩展的方式可以通过多台节点同时并发处理海量请求。事实上,全球最大的航空分销商,管理者全世界95%航空库存的Amadeus也正是使用MongoDB作为其1000多亿运价缓存的存储方案。
Spark + MongoDB 方案
MongoDB可以用来做我们海量运价数据的存储方案,在大规模并行计算方案上,此案例中用到了Spark技术。
关于Spark,
点击查看 ,虽然他不是流式计算引擎,却可以解决不同持久化方案之间数据计算、存储、迁移的问题。
参考文献
[1] 阿里云-白大锅(2022),两万字详解MongoDB从入门到精通(一),阿里云,2022
[2] 腾讯云-Gorit(2021),MongoDB 学习笔记(入门看这一篇足矣),腾讯云,2021
[3] 知乎-张琼芳(2019),MongoDB 介绍与应用详解,知乎,2019
[4] 稀土掘金-你好生活(2021),MongoDB介绍,稀土掘金,2021