00:00
那我们来讲一下文档处理,这里的处理呢,我们主要是讲文档冲突,那比方说呀,我们在访问我们文档的时候,不光你在访问,其实其他的人也同时在访问,如果在访问的过程当中,你做的是全量更新的话,你首先会先查询它的原始文档,然后呢,再进行修改,最后统一去更新我们的索引文档,对吧?那这样的话,最后一个我们的用户他的访问应该是成功的,为什么?因为我们最后一个的更新,它会把所有的文档全部更新,你之前的那些用户的更改就全部覆盖掉了,大家想是这样的吗?所以这样的话,他们的数据就丢失了,你的数据是起作用的。这个原则上来讲应该是没有任何问题的,但是如果你是局部更新怎么办?你更新的不是一个全量数据,而是局部数据,那么这样的话就可能会出现什么呢?别人把你的这个数据改了,你把别的那个数据改了,那这样的话就会有冲突,你之前全量更新全是你的,这个我觉得问题不大,恰恰是局部更新可能会有很大的问题,所以在这种情况下呀,我们需要去解决,其实这种情况并不是只有ES软件才会出现,我们在很多的网站当中经常会出现这种并发运行时所导致的数据冲突问题,比方说我们买卖商品的时候,库存。
01:18
你的库存的这个值呀,你不能有变化,不能有冲突,不能有问题,为什么呢?我想卖东西库存不够了,但是你又卖出去了,这怎么可能,这就是因为我们多线程在并发的时候,它的并发判断和锁的机制问题没有处理好。所以啊,这个没有好的办法,这个需要我们去进行一些特殊的处理,那么其实所谓的特殊处理就是加锁呗,但你怎么加锁呢?大家可以看到我们的加锁来控制我们的数据安全,其实有两种方式,一种叫悲观锁,一种叫乐观锁,那么所谓的悲观锁啊,就是我们悲观的认为。我们的整个世界是黑暗的,你做任何事情都会有人跟你抢,那怎么办?我事先加一把锁,你不想跟我抢吗?你抢不到是我的,那这样的话你不就处理不了了吗?等我做完才该你,所以这就叫做什么呢?悲观锁,而这个悲观锁呀,性能会比较低,为什么呢?因为它会阻塞其他用户的访问,我做完了才该你,对不对?这叫悲观锁呀,我加了一把锁呀。
02:19
但乐观所就不一样了,乐观所描述的概念是说,诶,我乐观的认为这个世界是友好的,我在访问的时候不会有人跟我冲突,所以我根本就不用加上说,我用一个特殊的字段来描述我当前的状态,那好了,别人想访问,我只要状态没问题,他就能够访问,但如果状态不对,他就不能访问。那么我们这里所谓的状态,咱们指的是版本号。当版本号相同或比它大的情况下,你的更新,你的修改都没有问题,但如果版本号是旧的,就意味着你的版本号小,那么你的数据不是最新的就会有问题,所以我们通过这种方式来进行操作就会好很多,最起码性能提升了。但是由于啊,它的版本号旧,它会导致它什么呢?更新失败,它会重新发送请求,拿到最新的版本做修改,那么我们ES当中也采用这种方式来实现,大家可以看到它这里呢,要什么呢?同步数据,要做数据的传输,保证分片和我们副本之间的数据是同步的。
03:20
可是当你去复制这些数据的时候,你不能保证它的顺序是正常的,它可能是乱序,就导致我们新版本的数据和旧版本的数据的顺序是打乱的,那么这样的话就会出现旧版本把新版本覆盖的情况,那是绝对不允许的。所以我们这里会有个版本号的概念,那么这个版本号我们可以作为一个更新的一个参数。接下来我们给大家演示一下乐观锁的操作,现在我们来点击put创建数据,咱们点一下幺零零幺点。点完以后,大家可以看到我们现在呢,就已经创建成功了,那么这个时候呢,它里面有一个叫下划线version,叫做版本号是一,对不对,这边呢,还有一个SE number和我们的primary term啊这些东西其实都跟我们的乐观所有一定的关系,咱们先不说了,咱们现在点一个修改,咱们点修改的时候1001,我们要修改它,好我们点击send点,点击完成以后,大家会发现什么呢?版本号发生变化了吧,然后呢,你再往下看,它们的这个sex number其实也发生了变化,刚才是零,现在是一,好大家看一下点这边是不是零啊,现在是一,哎,就是这样。
04:29
那好,那这个时候呢,我想再做一个更新,但这个更新呢,干嘛呢,我要加版本号的,叫沃森给咱们加版本号,版本号以后干嘛呢?我给个一,我现在去更新大家看啊,我要更新了,我点计算的。干完以后你会发现它是不让你做的,为什么不让你做呢?首先我们的用法呢,比较旧,就是我们这是早期版本的用法,它叫worse,大家看一下,它就跟你说了,我们这里啊,请采用什么呢?叫if EQ number和if primary term,用这两个东西来进行代替,所以啊,这个water这个东西啊,是早期的事儿。
05:07
那我现在怎么办呢?哎,咱们来把它拿过来拷贝,拷贝以后放过来放到这啊放到等于什么呢?我们的零,然后再来一个咱们叫做它拷贝。拷贝完成以后,我们写上一个,诶,我们也写个零,我们现在点上的填,你会发现不行,为什么不行,因为我们这个是零,我们这个是零啊,你如果是零,零的话,它会找不到匹配的数据,为什么?因为我们当前的这个是一而不是零,所以说你会发现我们的数据是有问题的。那该怎么办?很简单,大家看我们的这个地方应该两个都是一,因为刚才已经做了更新嘛,所以我这里要改成都是一啊,记住这就是一个我们的乐观的操作,保证我们的号码都是对的,我再去做更新及站点。N基完成以后,大家可以看到是不是都是一,那么这个时候就说明你拿到的就是最新的版本,那么你更新是没有问题的,如果你拿到的是旧的,那肯定就不行了,对不对?哎,就是这个样子啊好了,那么我们这里再给它改一下,比方说改咱们叫华为123,我点赞的点。
06:12
点击完成以后,版本号是三,你再往下你看版本是二了,你再去做更新,你就更新不了了,点三的你会发现又更新不了,对不对,诶就是这个意思啊,所以呢,我们把版本号给它添加上就行了啊好,咱们继续往下,这我们的ES呢,它也支持我们的外部的版本控制,就意味着不用我们内置的一些参数,用我们指定的一些我们的参数是可以的,大家可以想到这里面需要加一个配置,我们称之为叫外部的版本类型。那么这个我们怎么给大家演示一下呢?很简单,大家看我们再给大家查询的时候,我们来啊,我们写上咱们叫做1001,我们去查一下点点完以后大家会发现这边有一个下划线版本号。之前呢,咱们用的是我们的这个东西,咱们的secret number和primary term啊用的这两个,现在我就想用这个water怎么办?可以没问题,但是前提条件你要写上咱们叫做问号啊,大家看一下,我们给它post一下,咱们给它更新,那我们写上叫沃,咱们统一。
07:11
这地方不是三吗?我给个一。然后呢,我们把这个写上叫做worse APP啊,有一个外部的一个版本类型,然后呢,我的body,我现在给它加点东西。点一下,点完以后呢,我们就写上干嘛呢,我们就叫title写上啊,咱们叫做嗯,测试手机好了,我现在就准备要更新一下,但你要记住啊,这个版本是一,咱们这个版本是三,那么你来提示一下运行,运行之后看结果有没有发现当前版本是三,但是你的这个是不是我们的一样,哎,所以说你的版本是旧的,那我当然就不能让你更新。那老师怎么才能更新呢?很简单,你把这个改成什么啊,改成我们的三呢?那么你版本相同,说明你拿的是最新的数据对不对?好,我们点击上的点,点击完成以后,哎,好像不行,他说了必须要比它高,或者说比它相同对不对,那我这里改一下,咱们写个四,好我们点击它三。
08:11
点击完成以后,大家会发现版本号发生了改变,那我现在的数据也都发生改变了,现在呢,我们去查一下来get get以后这个咱不要了,不要了以后把这个去掉,嗯,我们点击算,诶看完以后你看都是手机对不对,哎,就是这么一个概念啊好了同学们,这个呢,就是我们的一个冲突的解决啊。
我来说两句