nosql简答什么是最终一致性_NoSql的三大基石:CAP理论BASE最终一致性

关系型数据库的局限

NoSql出现在关系型数据库之后,主要是为了解决关系型数据库的短板,我们先来看看随着软件行业的发展,关系型数据库面临了哪些挑战:

1、高并发

一个最典型的就是电商网站,例如双11,几亿大军的点击造成在某一时刻的并发量是很高的,传统的关系型数据库肯定已经是不堪重负了,如Oracle的Session数量推荐的才只有500。

2、高效率存储海量数据

大数据时代,数据量已经不是用GB、TB来衡量了,而是EB、ZB了,面对这海量的数据,如何高效率的存储这些数据,关系型数据库无法解决这个问题,以Oracle为例,单机的物理扩展不仅成本高,而且难度也加大了。

3、高可用&高扩展

Oracle即使RAC能扩展数台机器,但数量也是有限。

NoSql的出现即是为了解决这些问题了,但是NoSql并不是用来替代关系型数据库的,因为它本身也有着不可克服的缺陷,俗话说,好处不可能都让你占了。

关系型数据库与NoSql一致性的比较

一般来说,构建NoSql,为了高可用和海量数据存储,我们会选择牺牲一致性,但这并不意味着我们不要一致性,而是我们可以选择不实现强一致性,而实现弱一致性或者最终一致性。无论是在关系型数据库或者NoSql中,我们都是通过事务来实现一致性,下面我们来讨论两者在一致性方面的差异:

关系型数据库事务的4个基本特性ACID,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

而对于分布式事务的特性BASE,则是反这个标准的,即基本可用(Basically Availble)、软状态/柔性事务(Soft-state)、最终一致性(Eventual Consistency)。下面是Brewer教授在PODC大会展示的ACID vs BASE:

前面我们说过,NoSql的出现是为了解决高并发、海量数据、高可用等问题的,因而一般分布式是最优选项,我们先来说一下分布式系统的特性:CAP理论,当然,这也是NoSql的特性:

CAP理论

CAP理论是Brewer教授提出的:一个分布式系统不能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Tolerance of network Partition)。鱼和熊掌不可兼得。

一致性:任何一个读操作总是能读取到之前完成的写操作结果,也就是在分布式环境中,多点的数据是一致的。

可用性:每一个操作总是能在确定的时间内返回,也不是系统随时都是可用的。

分区容错性:在出现网络分区(如断网)的情况下,分离的系统也能正常运行。

PS:这里有人可能会问,可用性与分区容错性是不是一个意思(既然分区都可以容错了,不就是可用么),个人理解这里可用性说的是调用不会被阻塞。

而市场上的NoSql则以CAP理论为指导,大多选择实现了CAP理论的两点(如CA、CP、AP),未实现的即其缺陷部分。下面则是常见NoSql系统的特性:

常见NoSql的分类

类型

部分代表

特点

列存储

Hbase

Cassandra

Hypertable

顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。

文档存储

MongoDB

CouchDB

文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。

kv存储

Tokyo Cabinet / Tyrant

Berkeley DB

MemcacheDB

Redis

可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)

图存储

Neo4J

FlockDB

图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。

对象存储

db4o

Versant

通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。

xml数据库

Berkeley DB

XML

高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。

参考文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树的先中后序遍历

【0】README 0.1)本文旨在理清二叉树的先中后序遍历, 以及如何建立二叉树等相关内容; 0.2)本文涉及代码均为原创; 0.3)本文中遍历后的打印结果,朋友您可以直接写出二叉树的节点构造出来&…

表达式树

【0】README 0.1)本文旨在总结出表达式树的构建步骤, 其中还涉及到中缀转后缀表达式,以及如何计算 表达式树中的值; 0.2)本文源代码均为原创; 0.3) 其实, 实现一个简单的计算器&a…

Date/Timestamp/String/LocalDate/LocalDateTime

文章目录String 转成 DateDate 转成 StringString 转成 Timestamp获取系统当前的毫秒数获取系统当前的日期时间毫秒数转成 Timestamp毫秒数转成 DateTimestamp 转成 StringDate 转成 TimestampTimestamp 转成 Datejava.util.Date 转成 java.sql.Date将带T的日期时间转成正常的日…

python可以用来写什么工具_python写工具

谷歌开源 Python Fire:可自动生成命令行接口今天我们很高兴地宣布 Python Fire 开源。Python Fire 可从任何 Python 代码生成命令行接口(command line interfaces (CLIs)),简单地调用任意 Python 程序中的 Fire 函数以将那个程序自动地转化为 CLI。该库可…

java原始类型和引用类型_Java中的8种原始类型

java原始类型和引用类型几年前,当我开始编辑Java Basics系列时,我认为将一些非常详细的信息拉到自己的帖子中是很有意义的。 这样,初学者的内容就更容易消化了。 首先,我将介绍有关Java的8种原始类型的所有信息。 Java基本类型 正…

androidtabhost缓存_FragmentTabHost布局的使用及优化方式

欢迎Follow我的GitHub, 关注我的简书. 其余参考Android目录.TabHostAndroidFragmentTabHost作为Android4.0版本的控件, 已经被项目广泛使用, 5.0版本又推出TabLayoutViewPager显示多页. 我来讲解如何使用FragmentTabHost.本文源码的GitHub下载地址主要包括:(1) 自定义Tab的图片…

二叉查找树

【0】README 0.1)本文的重点在于介绍 二叉查找树的概念,以及写出 二叉查找树的操作例程的源代码, 其中当属delete 操作的源代码最不容易实现; 0.2)本文源代码均为原创, 当然 代码中的idea 是借鉴人家的&a…

常用的命名规范/命名规则

文章目录骆驼式命名法(CamelCase)帕斯卡命名法(PascalCase)串式命名法(KebabCase)下划线命名法(UnderScoreCase)骆驼式命名法(CamelCase) 也叫小驼峰式命名法…

spring order_Spring @Order批注

spring order介绍: Spring Order注释是在Spring 2.0中首次引入的。 然后,它仅用于定义AspectJ建议中的顺序。 在Spring 4.0的后面,对该注释的实现进行了进一步改进。 从那时起,它还支持对Java数组或List之类的集合中的Spring组件或…

AVL树

【0】README 0.1)本文给出了平衡二叉树(AVL树)的插入例程涉及到的单旋转双旋转的概念,并给出了代码实现; 0.2)本文源代码均为原创, 当然相关idea 还是借鉴人家的;(真心…

spring 注释_Spring@懒惰注释

spring 注释介绍: 默认情况下, Spring框架在应用程序启动时加载并热切初始化所有bean。 在我们的应用程序中,我们可能有一些非常消耗资源的bean。 我们宁愿根据需要加载此类bean。 我们可以使用Spring Lazy批注实现此目的 。 在本教程中&…

管理系统的账户设计(涉及注册/登录逻辑)

文章目录方案一方案二方案三方案一 类似华为云IAM(Identity and Access Management 身份和访问管理)用户,阿里云的 RAM(Resource Access Management 资源访问管理)用户 机构有独立的账户(主账户&#xff…

opencv生成日志_OpenCV-Utils学习日志:VideoCapture使用样例

1.VideoCapture可以打开多种来源的数据流,但常见的是相机、视频及图像序列三类数据流:(1)打开相机数据流,需要指定相机在主机上的设备编号,若主机上只有一个相机则编号通常是0。(2)打开视频数据流,需要指定视频的完整路…

jdbc查询序列_JDBC –模拟序列

jdbc查询序列也许我们每个人在程序员的生活中至少遇到过一次这个问题- 如何模拟数据库序列? 在下面,您可能会发现我对该问题解决方案的各种了解。 假设我们有一个接口定义了所需的API,用于返回整数序列: public interface Sequen…

利用 GregorianCalendar 制作当前月的月历

【0】README 0.1)本文文字总结于 core java volume 1 , 源代码均为原创; 0.2)本文旨在熟悉 GregorianCalendar 日历类,每一天就是一个GregorianCalendar 日历类,一天有很多的日历属性,觉得用它…

pyecharts怎么绘制散点图_PyeCharts绘制各种图形

简介PyeCharts 是一个用于生成 Echarts 图表的类库,用其生成的图可视化效果非常棒,而且使用起来非常简单。下面是一些常用图的pyecharts实现方法柱状图bar pye.Bar("柱状图")#新建柱状图bar.add("服装", #图例名称["衬衫"…

junit junit_穿越JUnit流

junit junit关于JUnit 5迁移的好处之一是,您可以在老式模式下运行JUnit 4测试,并且所有内容仍然兼容。 不利的一面是,某些注释和方法在JUnit 4和JUnit 5中具有相同的名称,并且当两组库依赖项都可用时,很容易导入错误的…

被遗忘的软件产品形态

从2010年以后,很多公司开发的软件产品,很少有客户端了,web2.0之后,主流的业务系统基本上都是基于Web去构建业务系统。这几年见到的业务应用系统都是基于Web的构建的。而在To C市场,几乎就没有客户端了,都是…

vue进行判断使用class_vue判断dom的class

vue点击给dom添加class然后获取含有class的dom{{item.name}}{{item2.name}}jschek(index2, index) {this.iac[index2] indexthis.iac this.iac.concat([]);this.checkchose()},checkchose:function(){var chosethisvar chosedomchose.$refs.choseboxconsole.log(chosedom)for…

方法参数的值调用+引用调用+深浅拷贝

【0】README 0.1)本文描述源代码均 转自 core java volume 1, 旨在理清值调用引用调用; 【1】参数传递给方法的专业术语: 1.1)值调用:它表示方法接收的是调用者提供的值; 1.2)引用…