总是聊并发的话题,聊到大家都免疫了,所以这次串讲下个话题——数据库(欢迎纠正补充)
看完问自己一个问题来自我检测: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
领取专属 10元无门槛券
私享最新 技术干货