无论我们写什么样的程序,目的都是一样的:
以某种方式组织数据服务我们的目的。 但是数据不仅仅由随机位和字节组成。我们建立数据元素之间的关系以便于表示实体,或者现实世界中存在的事物 。 如果我们知道一个名字和电子邮件地址属于同一个人,那么它们将会更有意义。
尽管在现实世界中,不是所有的类型相同的实体看起来都是一样的。 一个人可能有一个家庭电话号码,而另一个人只有一个手机号码,再一个人可能两者兼有。 一个人可能有三个电子邮件地址,而另一个人却一个都没有。一位西班牙人可能有两个姓,而讲英语的人可能只有一个姓。
面向对象编程语言如此流行的原因之一是对象帮我们表示和处理现实世界具有潜在的复杂的数据结构的实体,到目前为止,一切都很完美!
但是当我们需要存储这些实体时问题来了,传统上,我们以行和列的形式存储数据到关系型数据库中,相当于使用电子表格。 正因为我们使用了这种不灵活的存储媒介导致所有我们使用对象的灵活性都丢失了。
但是否我们可以将我们的对象按对象的方式来存储? 这样我们就能更加专注于使用数据,而不是在电子表格的局限性下对我们的应用建模。 我们可以重新利用对象的灵活性。
一个 对象是基于特定语言的内存的数据结构。 为了通过网络发送或者存储它,我们需要将它表示成某种标准的格式。 JSON 是一种以人可读的文本表示对象的方法。 它已经变成 NoSQL世界交换数据的事实标准。当一个对象被序列化成为 JSON,它被称为一个 JSON 文档 。
Elastcisearch 是分布式的文档存储。它能存储和检索复杂的数据结构–序列化成为JSON文档–以实时的方式。
换句话说,一旦一个文档被存储在 Elasticsearch 中,它就是可以被集群中的任意节点检索到。
当然,我们不仅要存储数据,我们一定还需要查询它,成批且快速的查询它们。 尽管现存的 NoSQL 解决方案允许我们以文档的形式存储对象,但是他们仍旧需要我们思考如何查询我们的数据,以及确定哪些字段需要被索引以加快数据检索。
在 Elasticsearch 中,每个字段的所有数据都是默认被索引的 。 即每个字段都有为了快速检索设置的专用倒排索引。而且,不像其他多数的数据库,它能在相同的查询中使用所有这些倒排索引,并以惊人的速度返回结果。
阅读至此总结:
传统的关系型数据库,需要我们建立模型以方便存储对象。但是面向对象世界里,万物都是对象,用这种行和列来
存储会破环对象的灵活性。而ES是通过存储对象的方式,专注于数据的本身。利用倒排索引索引每个字段的所有
数据。
防止更新冲突:
更新文档的步骤是:索引旧文档、修改文档、删除旧文档,重新索引文档。
检索和重建索引步骤的间隔越小,变更冲突的机会越小。 但是它并不能完全消除冲突的可能性。 还是有可能在 update设法重新索引之前,来自另一进程的请求修改了文档。
为了避免数据丢失,update API在检索步骤时检索得到文档当前的 _version
号,并传递版本号到重建索引 步骤的index请求。 如果另一个进程修改了处于检索和重新索引步骤之间的文档,那么 _version
号将不匹配,更新请求将会失败。
对于部分更新的很多使用场景,文档已经被改变也没有关系。 例如,如果两个进程都对页面访问量计数器进行递增操作,它们发生的先后顺序其实不太重要; 如果冲突发生了,我们唯一需要做的就是尝试再次更新。
这可以通过 设置参数 retry_on_conflict
来自动完成, 这个参数规定了失败之前update应该重试的次数,它的默认值为 0 。
并发控制方式:
1、悲观控制:加锁。
2、乐观控制:_version控制,通过外部系统的version_type和_version比较进行控制。