00:00
好,同学们聊完了面试题,咱们立刻手下见真章,看一下下面内存满了怎么办?看一眼,那么就引来这个问题,既然是满了,我怎么知道到达到多少会满?一句话默认内存又是多少?我在哪里查看?如何设置并修改呢?来吧,同学们再看挨个推引出来的问题,那么请问杨哥,第一问,如何查看red最大占用内存?打开我们的red配置文件,在memory management这个标签页,这这有个max memory,听好在在这块把这个注释去掉。或者你拷贝一行下来,直接配好你准备给red分配的内存大小,它的单位是字节,请注意类型转换好,那么当然你别写成一个G什么的,没有啊,拿拿字节来说,我们先回到我们的red配置文件来,大家请看这是内存管理这个标签页啊,我把行号给大家整理出来,那么这直接告诉你了。
01:16
我们在这儿最大的内存,现在呢,以字节为单位,那杨哥他什么都没配呀,那没配是多少呢?答案是零啊两个零零的话,那我这个现在过去的话。我怎么存进去呢?那你怎么知道一定是零呢?我们来啊,同学们,我们来这red server red red7点red好,连进来了,看f get,请看这个参数是刚才我往配置文件里面拿出来的。几啊?所以说得到这道题目的第一个问题,原来red默认的内存是多少?是零?
02:08
我晕,杨哥,你你这个还讲个毛线啊零的话,那我怎么存进去呢,第一种看表面啊零,所以说呢。的内存存不进去,但是我们有没有存进去东西?第二种思维方式,杨哥懂了,这个零。应该类似于代表透过现象看本质,一定代表有更深层次的意思。那么大家觉得会是哪一种?我先卖个关子好。内存多少可以用呢?为什么上面是零呢?请注意紧接着来的,如果没有设置最大内存大小,或者设置内最大的内存大小为零,64位操作系统下面是不限制内存大小,基本上就是完全共享并抢占你的物理内存,但是在32位操作系统下面最多用三个G,那么各位亲,只要你是正常的开发人员,我不认为你还会去装32位的操作系统,我就不解释了,所有操作系统都是64位,因为我们是开发生产型的,注意64位系统下max设置为零,也就是我们默认的表示不限制内存,基本上达到可以标到理论上你物理内存的上限。
03:25
好,这是我们的第二个问题,那么一般上生产上你如何配置呢?那么这个没有绝对权威的公式数学支撑和答案来看,你们公司业务一般推荐设置为物理内存的3/4啊,你不要全部。配到最大零的话,就代表我与操作系统占内存啊,所以就跟我们配GVM的堆内存一样,默认的话配到多少多少有个速啊,不要把内存全用完,因为有一定要留有一点。余地,做人留一线对吧,日后好相见,要给操作系统来用,如果操作系统崩了,什么都挂了,所以默认啊业内的我做,我去大厂调研了一下某度他们的公司的内部的操作,也就是物理内存3/4,我们参考大厂的工程案例经验啊,这个不权威,那么你说老师我就配个1/2行不行,由得你,那么请问一下杨哥如何修改呢?那么所以说呢,各位亲。
04:25
第一种,我们这儿是不是叫默认是零啊,那没什么好说的。直接搁到这儿,咱们是不是相当于在这个下面,你说多少就是多少,我给你配一下对吧?那么也就说什么它的方式就写进配置文件,重启我们的red即可,那么第二种呢,我这是不是可以用get,那么有没有set,就跟Java一样set get,第二种方法是不是代表用命令来取舍,所以在这儿同学们来第一种通过修改文件来进行配置,那么同学们请看104857600是不是两个1024相乘呢?那么这个时候同学们搂一眼啊,那么假设人家是什么字节,那么1024个字节是不是1KB再乘以1024,弟兄们1048576是多少?不用我多说了吧,那么这个时候。
05:32
是不是一兆P再乘个100,弟兄们加两个零,那么这个时候O不OK,那么所以说呢,大家都清楚,这个时候我就配了多少100兆币,OK好了过那么第二种通过命令来修改,那么来看set max memory是这么一个数,那么当然啊,这个一重启就没有了,命令只是临时的,我们来试一下啊,来吧,Con set max memory OK,那么这个值呢,我呢,直接。
06:08
干脆就写个1048576吧,OK,设置OK,然后再get,大家请看是不是从零到1048576了,那么零几乎等价于你物理机的内存上限。可以这么讲,就是无穷大无限量,跟物理机持平,那假设我现在配的小一点了,那么弟兄们的东西存的多了,会不会把它干爆?答案是肯定的,所以弟兄们走起,那么接下来啊,我们来看看你。用什么命令来查看red内存呢?两个,第一个叫info memory,第二个叫con get max memory OK,那么来弟兄们,我们来看一下啊,这个就不用我多废话了吧,最大内存是多少是吧?要么是默认的零。
07:04
等价于物理机内存,要么就是你具体设多少,我出多少,还有一个就是for memory,好,弟兄们请看现在是不是它有很多内存的细节,有多少用户用了多少等等都给你呢,说的明明白白来,在在这一块,大家请看我们这1048576个字节,那么大概是不是就是我们这这么了东多我这配了一兆啊,我就没写计算机上这后面这两个零,那么就不是100兆,OK,好,那么这个就是我们对应的相关的一个介绍,那么接下来。真要打满了会怎么样?如果red内存超出了设置的最大值会什么情况呢?不废话,那么弟兄们看,Set max memory,好,我就一个字节OK了吧。那么来,弟兄们大家都清楚这是不是一那么sat k,一我这V。
08:03
一百分之百超过一个自己了吧,一回车什么鬼oom啊哦,原来Java虚拟机里那块对应内存爆了,会报OM red,如果你达到它的最大内存设置了,依旧也会报内存oom的这么一个错误,这个命令不允许当你使用的内存大过最高设置的上限内存,那么同学们,我认为。很简单,不再废话了,OK,所以我们呢,故意把它搞大了,刚才呢,我是配在了我们的什么。呃,刚才呢,我是用命令啊,你也可以在配置文件里面写死重启一下,我们register一句话就会报oom这个错误,OK,我就不想写死在register的这个配置文件里面,再重启浪费时间,所以我直接用手工命令,但是在这儿给同学们呢,也就演示了red内存满了怎么办,怎么派,什么故障清清楚楚,所以设置了最大内存的选项,假如red内存使用达到了上限,那么这个时候呢会报oom,如果这个内存只进不出,就是你所有的key没有配置,过期时间都是永不过期,那么是不是就容易给我们的red内存打爆?
09:24
所以产生了一种自我优化的叫内存淘汰策略,就是没有加上过去时间,容易导致写满最大的内存要求。为了避免这种情况,所以red就有一个知识点叫内存淘汰策略。接下来我们聊一下往里面写的数据是怎么没了的。他是如何删除的啊?杨哥,这不废话,你讲过两个命令,一个叫按link克无阻塞删除,一个叫第一下直接剁掉,讲麻辣下克真是这样吗?那为什么会有缓存淘汰策略呢?它内部是有一些精细的设计和一些底层算法思想在支撑的。来同学们露一眼,首先啊,Red过期键的删除策略,我问一下大家,你觉得是不是只要一到过期时间?
10:14
超过这个有效期了,立刻删除,那假设现在手术艾丽丝又瞒着别的业务很忙很累,而这个key这一批key他也到时间了,那么请问我是忙我当前最重要最紧急的这个主要业务流程,还是去忙那一波不再使用了,但是却已经到期的时间呢?这这个经历它red底层怎么跟操作系统配合来调度,来达到最佳的性能效用比呢?下面我们来看一眼,如果一个键是过期的,那么它到期之后是不是马立刻马上现在就干掉我,不管你red是不是在忙着别的事,哎哎,我到期了,我到期现在伤我这是最高优先级,Red啊,你把你手头上的活停下来杀我来呀,弄死我。
11:05
如果你回答yes是立即删除,那么请问你是自己走还是让面试官送你走出门右转式电梯拜拜?如果不是,那么他到底什么时候会被删除呢?具体是个什么样的操作呢?所以引出了我们下一章内存淘汰策略的算法和策略ready,实质而言,它有三种不同的删除策略,那么第一种啊。没什么好说,最经典不忙的时候也没什么其他事,迪delete立刻删除,好瑞斯呢,不可能时时刻刻遍利所有设置了生存时间的这个K来检测数据是否已经达到过期,因为它有一个扫描程序,就跟我们后台加中一样的,哎,哪些key这一批次呢?或者某一个K这个点到期了要送到斯。干了它对吧,重新投胎立刻删除是能够保证内存中数据最大的新鲜度,这个最好是吧?
12:01
过期作废,清理库存,因为它会保证过期的件会在过期后马上被删除,所以立即删除确实是最简单粗暴、直接有效、立竿见影的算法,大多数都是它,但是它的缺点是它所占有的内存。很小,但是它的缺点是什么?对CPU最不友好,导致操作系统CPU特别忙。哎,送过来了,这一批杀,杀你下一批杀,就跟一个古时候的皇帝批折子一样,他随时随地七十二四小时都在批折子,都在删除数据,累不累?所以他呢,立刻把过去剑删了。对内存很友好,但是对CPU最不友好,很累,很繁忙,因为删除操作会占用CPU的时间,如果刚好碰上CPU很忙,我这会儿忙着接个大活呢,比如正在做交集或排序计算的时候。在互联网的高频发业务,谁谁谁是谁的好友,他最近打赏是多少,CPU忙着呢,RA更重要的事去做,而这p key又到期了,你让我立刻删除,就会给CPU造成额外的压力,搞得CPU心很累,时时刻刻都需要删除,忙死。这样呢会产生大量的性能消耗,同时也会影响数据的读取操作好所以总结一下,对CPU不友好,比较费CPU,但是对内存很友好,内存里面的数据大部分都是新鲜的,它呢是用处理器的性能,用CPU换取内存的更大的容量和空间,一句话时间换空间,所以时时这个所谓的时间就是CPU的运行、运作、处理的时间,很忙很累,让CPU累死,但是呢,内存空间很干净很大,好,立即删除,优缺点陈述完毕,接下来。
13:54
那你长时间让CPU这么忙着不好啊,所以有种东西叫惰性删除开工数据到达过期时间了,不闻不问,不做处理,等一会儿,可是我下次访问数据的时候。
14:12
如果这个数据没有过期,还在有效期以内正常返回,但是发现已经过期了,这个时候发现有点像懒加载,你调用我的时候,我去查一下他有没有过期,没有过期给你数据提供使用,皆大欢喜而活,如果已经过期了,这个时候我才删。哎,相当于把CPU的工作减轻一点,然后告诉调用者啊,这个数据已经过期了,根本不存在了。所以惰性删除的策略类似于懒加载,它的好处是对内存最不友好,但是可以帮CPU减轻负担。我相讲到这,大家应该非常明白了一句话,如果一个键已经过期,而这个键又保留在当中,那么只要这个过期键不被删除,它是不是就一直占着茅坑不拉屎?对不对?占着坑位吧,所以呢,我们在使用惰性删除策略的时候,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它也许永远不会被删除。当然啊,一些强制性的,手工的,比杨哥我把卸了或者flash DB什么的另说。我们甚至可以将这种情况看成一种内存泄漏,已经过期无用了,但是却占着坑位。
15:22
无作用是位数差对吧,所以无用的垃圾。无用的数据,过期的key占用了大量的内存,而服务器不会自己去释放他们,那么对于运行状态非常依赖于内存服务器来说,肯定不是一个好消息,对吧?所以呢,第二种惰性删除。对内存最不友好,对CPU好,它呢是用内存的空间换取处理器,不要这么繁忙,它是拿空间去换CPU的处理时间,换性能,OK,那么当然默认的话呢,你要是开启这个,要开启这个惰性淘汰这个策略,在我们的write page置文件里面,Lazy free lazy evi,要把它从默认的no改为yes,那么同学们,我们可以简单的来给大家做一下这个说明啊,那么在这块大家请看啊,人家默认啊,我们找找找,是另外一个版图,叫lazy free,就是惰性示范淘汰策略这块啊,那么大家请看这有个lazy free lazy e是驱逐的意思啊,驱逐舰,军舰的驱逐舰默认是什么?No OK,你如果需要开启惰性淘汰的话,要把这个从no变为yes,但默认的话呢,也让你使用no好,这个看你自己。
16:45
请问两个怎么着方案都比较极端,所以有第三种策略,叫定时删除,或者叫定期删除,这个嘛,CPU类。内存斜这个嘛,CPU斜内存类可不可以折中一下。
17:07
火锅一样的白锅红锅混一块鸳鸯,那么这个时候定期删除他这么干,这种策略是两种策略的折中打折,定期策略意识,每隔一段时间执行一次删除过期键的操作,哎,并通过限制删除操作执行的时长和频率来减少删除操作。对CPU。性能的影响,它这样的周期性的轮型库中的时效性数据好,比如说每隔多长时间我扫一次随机。抽取的策略,利用过期数据占比的方式控制这个删除频率,1CPU性能占用设置,它是有峰值的检测频度,自己进行设置一下。第二个内存压力不是很大,长期占用内存的冷数据会被持续清理,总结就是周期性的抽查,存储空间随机抽查,重点抽查,然后到期删除。
18:04
那么举个例子啊,弟兄们,这是一种算法的一种,呃,定期删除策略啊,默认大家都是用简单粗暴的给delete塔立即删除吧,比如说呢,它默认每隔100毫秒检查是否有过期的K,有过期的K就干掉,注意每隔100毫秒啊。我们不是把red里面所有的key都检查一次,而是随机抽取,比如说我每隔100毫秒抽取1万条数据来看一下,如果每隔100毫秒就要把全部的B全部的key扫描一遍,有点类似于我们MYS克里面的全标要扫描,那么还是别做这个事,咱们还是聊聊前面的两种删除算法吧,否则这个要干这样的活,直接进ICU了。因此啊,我们只能是采用一种定期删除策略,就会导致。很多K到期的时间还是没有删除,因为有会有漏网之余,好大家试想一下,每隔100毫秒,它不是全部的K,它是抽取进行检查,那假设啊,我抽了三次啊,有一个K呢,这三次啊都没有被扫描到,实际上它已经过期了,那么它是不是还是存在于我们的re里面,哎,所以说这种算法呢,是一种折中的算法,但是它会产生漏网之鱼,所以定期策略它的难点是确定删除的操作时长和这个频率多久扫一次啊,怎么个抽查怎么个删除,如果操作太频繁或者执行的时间太长,那么定期删除策略就会退化成立即删除策略,以至于CPU又过多的损耗了,如果执行的太少或者是太短,又会退化成惰性删除的策略,出现浪费内存的情况。因此大家呢,都要根据服务器的业务和你的实际情况来断定我们的时长和执行频率。
19:51
第一次定期删除就是前两者的一种折中性的删除算法,但是呢,它定期抽样这个K判断是否过期,第二个他会有漏网之鱼,总有一些K一直没有抽到,那么这个时候弟兄们,那么上述步骤我们都过长了,以后还会有漏洞吗?答案是肯定的,请看定期删除的时候从来没有被抽查呢。
20:19
第二个惰性,删除的时候也从来没有被点中使用过,哎,基于上述两个步骤,大量过期的key堆积在内存里面,我也定期删除了,但是太多了,总是有些没有被轮到,那我可不就是吧,等着投胎没人要。对吧,那导致什么1万电源满了,那所以说呢,内存空间紧张或者很快耗尽,基于此,我们必须要有一个更好的兜底方案,所以引出了我们的ready缓存淘汰策略。
我来说两句