00:01
各位同学大家好,下面呢,咱们继续来学习中的常用数据类型操作,首先我们先学习里边的第一个数据类型字符串词缀。那字符串string我们先做个介绍,然后给大家演示一下里边常用的操作病理,那我们来看一下啊,这里写到string字符串是write中最基本的数据类型,也是一个很常用数据类型,你可以理解为啊,它跟man k的里边的一模一样的类型,是一个key对一个wedding,因为咱ready就是建筑对一个key对应一个Y。而损类型这里写到它是一个二进制安全的。什么叫二进制安全的?说到通俗点,只要你这个内容能用字符串表示,那都可以存到我们这里边去,比如说我们的图片,比如说你序列化对象约单图片用字节形式表示,是不是可以做成字符串放到文件中,然后咱们进行读取,它只要能变成字符串都能存到里面去,然后你这个字符串最终是不是还能转成一个图片,就是咱视频也能变成字符串,然后里边存储,然后它也能在转换成视频,所以这个叫二进制安全的。另外string是RA中最基本的数据类型,一个RA字符串中的Y6值最多可以是512兆。
01:27
这里强调啊,这里指的这个类型是指它那个Y6值,因为我们的y key和value。它的key我们是用一个字符串表示,Y六指中可以存这个就是字符串类型,当然可以是其他类型,比如说例子的set等等,所以这是关于它的一个基本介绍,然后介绍之后,下面呢给各位来演示一下针对这个字符串类型操作中的基本命令,那我们来一个一个进行演示,首先我们看第一个命令叫set命令,Set命令呢,可以向write中添加键值,对的这么一种形式,那咱们来演示一下。
02:07
我们来操作一下啊,比如现在我们先把我这里边的内容给它先清空一下,然后清空的话呢,这里边有个命令叫flash DB,咱把当前库签清空,为了咱们操作方便,那我现在清空,然后咱们查看一下目前里边是不是什么都没有,然后咱们用第一个命令,就是S命令加上一个K,比如我叫K1加上一个Y6,假如我们叫这个。Y6啊,就叫V100,现在向里面就加了一个数据,比如说我们再加第二个,我们叫set k2,然后加一个叫V200,现在里边就加了两个数据,K1K2对应的分别是V100 V200,那我们来看一下。我们写一个K星号,大家看是不是有这么两个那种,所以这是针对命令的一个操作,那这个眼之后对应set有一个命令,这命令大家应该能猜到叫什么,就是get get能取到你的K对应的这个T的这个值,那咱来取一下,比如来一个get k1,那这个值是不是可以得到,所以这是两个基本命理,一个S设置值,一个get取值。
03:27
那比如说我现在哈,我这么来做,大家想一下,我还是在SK1,但是直到我变成V1100,大家说会有什么效果,因为现在re中是不是存在了K1,然后我又设置一次,咱们看什么效果啊,提示我们OK,然后咱们用get。K1。大家看到什么效果,你设置相同的K,它把之前那种给它是不是就覆盖掉了,最终变成了V1100,所以这是两个基本命令,咱们做了一个演示,然后除了这个之外,下面还有三个命令,也很简单,一个叫A判,就是做一个追加,那咱来用个A判,比如说写个A判K1,我们就叫ABC,然后大家看啊,它反应值是不是一个八呀,这八什么意思呢?我们来一个get k1各位应该能看到啊,就是它在V100后面加上ABC,然后把你总的这个长度返回,就这个八,这个叫A,然后除了A之外,还命令叫STRN,得到你这个值的一个长度,那我们来演示一下啊。
04:45
我们来一个K1长度是不是就八呀,就是你K1对应这个值长度是八,所以这些基本命令,然后除了这个之外,最后还一个命令叫set NX,这命令呢也是用于设置值的,但是跟区别是什么呢?Set设置值的时候,如果你的RAID中不存在K,直接设置,如果存在的话,把这些内容给它就覆盖掉,而用set NX什么特点?
05:14
你只有这个T不存在的时候才能设置成功,如果你K存在的话,那这值就不能进设置,就是它不能做覆盖,也不能做替换,那咱们来测试一下啊SNX,比如说我叫K1,咱就随便来一个V1。然后大家看。返回什么是不是零啊,表示你这个值啊,不能设置成功,比如我们再设一个SNX,我们叫K3,我叫V这个。300,然后咱们get k3,大家看这个值是不设进去了,所以这个叫SNX,所以这些是radio中针对字符串操作的进命令,然后除了这个之外,下面还命令,它表示就是我现在用一个in cx,就是in Korea和一个D可瑞,我们可以让我储存的数字值增一或者减一,注意这个描述啊,注意到数字值,比如我现在这里边用英可瑞,让它只可以加一,用低可瑞只可以减一,但是咱目前存的值呢?
06:22
里边不是数字类型,是一个字符串,所以咱为了能测试效果,我现在再重新加个值,我们叫K4。这个值我就叫500,现在做了一个设置,然后设置之后呢,现在我们用第一个命令叫英可瑞,那我来用一下啊英可瑞。In CR加上你的这个KK4,然后咱们用get,我们直接K4。大家看返回值是501,表示把它叫加一了,注意是数字类型,如果你是字符串不可以,然后在那是一个叫D可瑞,那我试一下啊,De CR,我们也叫K4,这个值又变回了500,就是把它最终就减一了。
07:09
所以这是里边的两个基本操作,然后除了这个之外,因为咱们刚才不管你是用英可瑞还是低可瑞,每次值是不是就是加一或者减一啊,比如现在啊,我想让值做个操作,就让它每次加二或者每次减十,设置它加和减的这个值,那这里边一个命令,这个命令叫音可和第可加上K加上你的不长,不长就是你每次加的那个值,比如你是加一加二,是减三还是减四等等,那现在给各位演示一下啊,比如我们用这个英可瑞。Y加上我这个K4后面写个值十,然后咱们看啊,现在值变成多少,是不是这个501啊,就是把它加了十,那比如说再是一个D可瑞。
08:00
派我们来一个K4,然后这个值我来一个20,大家看变成多少,是不是490了,就是把它减了20,所以这是关于我们针对里边的基本命令给各位做这个演示啊,然后演示之后呢,因为咱刚才用的是因可瑞,你在用英可瑞的时候呢,有这么一个特点,叫做原子性操作。那什么叫原子性?给大家解释一下啊,注意啊,这原子性指的不是咱说那个事物中的原子,它是ready中一个特有名词,叫原子操作。什么叫原子操作呢?它指的是我不会被线程调度机制打断的操作,什么意思呢?因为咱们之前提到过作RA是不是叫单线程操作,比如现在我有两个线程都去操作同一条数据,那这个时候呢,我线程之间是不会被打打断的,比如你操作是你的,我操作是我的,他们中间不会被互相的干扰,这个叫原子操作。
09:04
但是多线程中它肯能就不能保证了,因为re是单线程,比如我现在对这个数据,我一个线程给它加一,另外一个给,比如对它减一或者也是加一,那这操作之间它们不会产生影响,这个叫作原子操作,这各位知道啊,比如说red操作是原子性的,你线程之间是不会被打断的,因为redit是一个单线程操作,它每个操作都是独立的一个线程,它并不是多线程的。这特点各位都知道啊,咱之前提到过,说的完整点叫什么?是不是叫单线程加多路IO复用,而那个慢用K是什么?是不是多线程加锁的机制啊,两个是完全不一样的。这是关于我们提到这么一个基本概念,然后提完之后呢,下面有一道题目给各位来说一下啊,就是这么一道题目,大家看一下啊,这题目是什么呢?我给大家画到图上,咱来把这题目给大家来分析一下啊,这个东西。
10:08
给稍微调的大一点啊,然后大家看啊,首先第一个我这里问的说这个Java中的爱加加是否是原子操作,就是Java重体做操作是否是原子操作呢,是不是。这应该很明确,Java是不是一个多线程的操作呀,所以他的爱加加是不是肯定不是原子操作,肯定不是的,那为什么不是?下面有个例子给大家会做一个具体说明,那这例子给各位我来说明一下啊,比如现在呢,我们有两个线程,分别对I的值进行加,加100次,最终值是多少?I的初始值是零,那大家想一下啊,比如说这个意思,比如现在我们有两个线程啊,这是。第一个现场。然后这个是第二个线程。
11:00
有两个线程,然后两个线程中呢,我们都对这个值,就是I等于零的这个值进行加加操作,每个线程都去加,加100次,就是第一个线程最终肯定是加加100次,第二个线程它也是加加这个100次啊,都是做这操作,然后最终它的值是多少?就是哎,比如说我们从零一直加到100,加100次最终值多少,包括两个线程都来做这个事情,最终值会变成多少。大家可以想一下这个问题啊,首先我先说明Java中的爱加加它不是原子操作,因为Java是一个多线程操作,它里边的这个过程中会互相干扰它,所以这个值最终会变成多少,大家可以考虑一下啊,会变成多少。首先啊,我先说明这个值呢,最终的结果肯定不是一个固定值,它肯定是有一个范围的,那这范围是多少呢。
12:03
大家可以想一下,首先你看第一个啊,其实各位应该能想到它最大值会是多少,是会是200啊,比如说我这个两个线程,第一个线程加了100次,第二个线程在第一个线程基础之上又加了100次,最多是会有200次,所以它的最大值应该是200。这应该能想明白吧,最大值第一个线程加100次,第二个在100基础之上又加了100,所以最大值肯定是200,这肯定没问题,但是关键是它的最小值是多少。大家可以想一下最小值多少?我这里写一个答案,然后给大家分析一下啊,它的最小值应该是二,比如说它有一个范围,就是二到100这个反围中的值,它包含二和200,这是一个最终的这么一个答案,二到200的这么一个范围,那为什么是这个范围的值呢?下面给各位我来分析一下啊,首先我强调,因为你线程创建谁先谁后是不确定的,而它的操作在什么时候被被打断也是不确定的,所以咱考虑这个二应该是一个比较极端的情况,但是理论上这个情况应该会被发生的,那咱说一下为什么会产生二的这个结果,首先大家看一下我里边的这张图上给大家做了一个分析。
13:26
就是这里边,我把这个啊给各位先截过来。就是这个。然后截到我这个图上,咱们做一个详细的分析,我先拿到这里。然后最后还有一部分啊,就是这个地方,我把它也拿过来。咱们做一个详细的分析,然后大家看啊,比如说在我这张图上呢,就是有两个线程,比如说左边是我这个立线程,然后右边是我们这个一线程,现在比如说两个线程都对I等于零这个变量加100次就是加加100次,那比如现在这么做啊,比如现在正好碰巧了我A的线程先创建先执行的,然后他第一次I等于零,I加加,最终I等于99,一直加了99次。
14:20
当然各位知道这个爱加加这个特点啊,就是爱加加是怎么执行的,大家可以想一下,首先里边的第一步,它这个爱是不是先给他做一个就是取值操作呀,然后第二步加一,第三步最终是不是在赋值啊。这应该能想明白吧,A加加咱说的完整点有三步,第一步取值,第二步加加,第三步是不是就是负值啊,比如说现在我到这个时候呢,就是里边这个操作。我I等于零,然后I加加I等于99,最终这里边我们现在已经取值了,然后取值之后,这个I的值最终是不是肯定要加一啊啊,它肯定要做这个操作,但是比如现在在这个时候呢,突然出现一个问题,就是我这个被打断了,被我这个B线程打断了,就是I它已经等于了99,但是目前还没有加一,那它这个值呢,突然被我B线程打断了。
15:19
不是,各位是不是能听懂啊,I等于零,I加加一直加到99,最终肯定是到100,但是到100这个加他还没有执行的时候,被B线程打断了,然后B线程怎么做,它里边又做了加加操作,然后最终这个值等于一。而它等于一的时候呢,比如现在啊,正好碰巧了又被A打断了,然后这个A线程刚才咱们提到它只是负值,没有加一吧,然后A线程这里边把它就做了一个加一,就是以此类推这么一个过程,最终它这值就是一个二,但是这个不太好理解啊,我把这个给大家说的再通俗一点啊,咱再考虑一种情况,第一就是你要理解到什么叫原则操作。
16:03
A线程和B线程如果在原子操作中,他们互相操作是不会产生影响的,但是如果说我们不考虑原子操作,或者说它没有原子操作,那我A和B之间是会互相产生影响的,这一影响可能在你赋值的时候,可能在你取值时候,可能在你加价的时候,都有可能他们互相产生影响,因为他们互相产生影响,所以造成这里边值可能是二,可能是200,可能是二到200之间的这些值,它是因为这个而产生的。这个过程各位应该能听懂,然后下面把这个位因式二给大家再来分析一下。大家看到啊,比如咱们现在这么来说,比如现在呢,我的B先乘,它先创建了,然后I等于零,I等于零之后I是不是要加加呀,就它要加一,但是加一的时候呢,被A线程打断了,就是A把它打断了,然后A比如现在打断之后呢,它就执行了99次,注意啊,比如这家经行只有九次的过程中没有B打断,他就自己来执行,那这个时候他经到99次的时候呢,正好要加一,他在加一的时候被B又打断了,因为B之前是没有加一,然后B操作是不是给他加一就变成了一。
17:27
然后它变成一之后呢,这时候A打断了,A把一取到,A取到之后最终又被被打断,其实A选一之后,最终是不是要加一啊,然后这个时候呢,B把它执行了100次,就到了100,等于说B是不是就执行完成了,最终A把它打断,A最后有一个值没有加一,所以它最终变成了二,这也就是这个过程,A和B在操作过程中,他们互相被打断了,比如说A里边99 B是零,A是一,然后B是100,互相打断,最终值他们会出现二的情况,然后最理想状态肯定是200的情况,所以这时候我们考虑到这么一个问题,大家把这过程自己给他好去分析一下啊。
18:14
你就要考虑一个原则,A在操作过程中可能会被B打断,B在操作过程中也可能会被A打断,它打断过程在哪里不一定,但是最终肯定会出现最小值是二,最大值是200情况,通过它我们就能验证出来,Java中的爱加加操作并不是原子操作,但是反过来看一下re里边的。Inquiry操作是一个原子性操作,这是我们说的这么一个问题,所以各位把这个给他要知道啊。
我来说两句