聊聊数据库~开篇

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

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

1.1.分类

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

1.传统数据库(SQL):

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

2.高并发产物(NoSQL):

键值数据库:Redis、MemCached...

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

列式数据库:CassandraHBase、BigTable...

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

3.新时代产物(TSDB):

时序数据库:InfluxDBLogDevice...

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

最新DB排名

1.2.概念

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

1.关系型数据库优劣

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

通过事务保持数据一致

可以Join等复杂查询

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

当然了也有不足的地方:

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

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

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

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

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

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

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

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

2.NoSQL

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

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

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

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

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

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

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

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

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

列式数据库:代表:Cassandra、HBase

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

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

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

关系图

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

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

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

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

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

Python、NetCore常用解决方案(持续更新)
https://github.com/LessChina

2.概念

上篇提到了ACID这次准备说说,然后再说说CAP和数据一致性

2.1.ACID事务

以小明和小张转账的例子继续说说:

A:原子性(Atomic)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdxsz.html