总是聊并发的话题,聊到大家都免疫了,所以这次串讲下个话题——数据库(欢迎纠正补充)
看完问自己一个问题来自我检测:NoSQL我到底该怎么选?
1.1.分类主要有这么三大类:[再老的数据库就不说了]
1.传统数据库(SQL):关系数据库:SQLite、MySQL、SQLServer...
2.高并发产物(NoSQL):键值数据库:Redis、MemCached...
文档数据库:MongoDB、CouchBase、CouchDB、RavenDB...
列式数据库:Cassandra、HBase、BigTable...
图形数据库:Neo4J、Infinite Graph、InfoGrid...
3.新时代产物(TSDB):时序数据库:InfluxDB、LogDevice...
来看个权威的图:(红色的是推荐NoSQL,灰色是传统SQL)
先说下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
上篇提到了ACID这次准备说说,然后再说说CAP和数据一致性
2.1.ACID事务以小明和小张转账的例子继续说说:
A:原子性(Atomic)