聊聊数据库 开篇

总是聊并发的话题,聊到大家都免疫了,所以这次串讲下个话题——数据库(欢迎纠正补充)

看完问自己一个问题来自我检测:NoSQL我到底该怎么选?

主要有这么三大类:[再老的数据库就不说了]

传统数据库(SQL):

关系数据库:SQLite、MySQL、SQLServer…

高并发产物(NoSQL):

键值数据库:Redis、MemCached…

文档数据库:MongoDB、CouchBase、CouchDB、RavenDB…

列式数据库:Cassandra、HBase…

图形数据库:Neo4J、Infinite Graph、InfoGrid…

新时代产物(TSDB):

时序数据库:InfluxDB、LogDevice…

来看个权威的图:(红色的是推荐NoSQL,灰色是传统SQL)

先说下NoSQL不是不要使用传统SQL了,而是不仅仅是传统的SQL(not only sql)

先看看传统数据库的好处:

通过事务保持数据一致

可以Join等复杂查询

社区完善(遇到问题简单搜下就ok了)

当然了也有不足的地方:

数据量大了的时候修改表结构。eg:加个字段,如果再把这个字段设置成索引那是卡到爆,完全不敢在工作时间搞啊

列不固定就更蛋疼了,一般设计数据库不可能那么完善,都是后期越来越完善,就算自己预留了也不人性化啊

大数据写入处理比较麻烦,eg:

数据量不大还好,批量写入即可。

可是本身数据量就挺大的,进行了,读数据在进行到没啥事,但是大量写数据库怼到上去就吃不消了,必须得加主数据库了。

加完又出问题了:虽然把主数据库一分为二,但是容易发生(同样数据在两个主数据库更新成不一样的值),这时候得结合分库分表,把表分散在不同的主数据库中。

完了吗?NoNoNo,想一想表之间的Join咋办?岂不是要跨数据库和跨服务器join了?简直就是拆东墙补西墙的节奏啊,所以各种中间件就孕育而生了【SQLServer这方面扩展的挺不错的,列存储也自带,也跨平台了(建议在Docker中运行)(点我查看几年前写的一篇文章)】

欢迎补充~(说句良心话,中小型公司绝对是最佳选择,能省去很多时间)

现在说说NoSQL了:(其实你可以理解为:NoSQL就是对原来SQL的扩展补充)

分表分库的时候一般把关联的表放在同一台服务器上,这样便于join操作。而NoSQL不支持join,反而不用这么局限了,数据更容易分散存储

大量数据处理这块,读方面传统SQL并没有太多劣势,NoSQL主要是进行缓存处理,批量写数据方面测试往往远高于传统SQL,而且NoSQL在扩展方面方便太多了

多场景类型的NoSQL(键值,文档、列、图形)

如果还是不清楚到底怎么选择NoSQL,那就再详细说说每个类型的特点:

键值数据库:这个大家很熟悉,主要就是,代表=>Redis(支持持久化和数据恢复,后面我们会详谈)

文档数据库:代表=>MongoDB(优酷的在线评论就是用基于MongoDB的)

一般都不具备事务(开始支持事务了)

不支持Join(Value是一个可变的,表结构修改比较方便)

列式数据库:代表:Cassandra、

对大量行少量列进行修改更新(新增一字段,批量做个啥操作的不要太方便啊~针对列为单位读写)

扩展性高,数据增加也不会降低对应的处理速度(尤其是写)

图形数据库:代表:Neo4J(数据模型是图结构的,主要用于关系比较复杂的设计,比如绘制一个QQ群关系的可视化图、或者绘制一个微博粉丝关系图等)

下次继续~

回头还是要把并发剩余几个专题深入的,认真看的同志会发现不管什么语言底层实现都是差不多的。

比如说进程,其底层就是用到了我们第一讲说的。再说进(线)程通信,讲的等很少用吧?但是底层就是这些实现的,不清楚的话怎么读源码?

还记得当时提到Java里的吗?要是不了解怎么自己快速模拟一个Python里面没有的功能呢?

知其然不知其所以然是万万不可取的。等后面讲MQ的时候又得用到的知识了,可谓一环套一环~

既然不是公司的萌妹子,所以呢~技术的提升还是得靠自己了^_^,先到这吧,最后贴个常用解决方案:

Python、NetCore常用解决方案(持续更新)

https://github.com/LessChina

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180915G1I7N500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券