00:00
好,各位同学大家好,我们继续通过上一讲,我们也明白了,百万级别的red数据量不要用kiss星,避免卡顿,我们用SKY来代替,那么SKY它有个特点。返回的话呢,是包含两个元素的速组,第一个是用于下一次进行迭代的新油标,第二个这个速组呢,就是包含了所有被迭代符合条件的元素,那么所以呢,切记人家一次性返回是两个,第一个有必要,第二个本次迭代符合条件的返回值给你录出来。好,那么对于我们的SC命令,扫描命令我们就讲到这儿,那么接下来同学们我们来看一下big key相关的生产案例。一。都明白大K,那么下面我们的问题来看看。多大算大?我们都清楚啊,我们前面学过SK1V1。这个V1就以我们string类型为例,是512兆B哦。
01:04
那么这个时候请问业内一般多大算大?OK,这是第一个问题,第二个咱们要说清楚,一般啊,大的内容不是key本身,而是它对应的value,因为同学们这个K这个名字啊,你也不可能这个K的名字,比如K1到K100 K200 K300,但是这个value你是不是可以写很多乱七八糟的东西。所以说呢,严格而言,其实是一个K导致的大V这么一个问题,OK,好,那么带着这两个问题,我们来先来看看多大算B格呢?那么按照业内啊,我们有这么一些说法。一参考阿里云的开发规范,我们这儿说过。首先拒绝big key,防止网网卡流量很慢查询,刚才我们演示过了,对吧?String类型控制在多少10KB以内,哈希list set z set的元素个数不要超过5000个,OK,所以说这个呢,就是我们的一个规范。首先。
02:15
非字符串的big key不要使用delete删除,那么也就是说非字符串就是只有string类型,你可以直接使用delete塔,其他的这些动作请用这样的方式渐进式删除,同时要注意防止big t过期时间的自动删除问题。OK,那么这时候大家都清楚没了的话呢,基本上又会打到后面产生一些大麻烦。好,那么得到一个结论。第一个此种类型10K以内。其他的这个类型元素个数不要超过5000,好,那么来我们来看一下string和对应的二级结构。首先strange value最大值是512,但是大于等于10KB了就是大K,那么哈希set set个数超过5000就是big key,好,我要这么跟你说,我相信你呢,也不会有太多1亿对吧?杨哥讲到啊,加上阿里云开发规范也这么规定的,那OK,我就认着。可是问题你要思考一个问题,凭什么5000?为什么是5000?因为你别忘了。
03:16
对于list,哈希塞等等,我们说过了,它一个列表最多可以包含二十三十二方减一个元素,这是四接近42这个每个列表元素超过40这个元素,你凭什么到5000就不行了呢?那这个是一个最大的一个问题,同学们请思考一下啊。好,那么刚才呢,也和同学们呢,交流讨论了一下啊,都能转过这个弯啊,那么同学们呢,也会明白,理论上这个数据和实际的使用大家都清楚啊。谁会往内测里面,就说咱们Java里面的R列测吧,就当是你存四十二四十二这个数值。这个我认为这是脑子不正常,还是吃错药了对不对?所以呢,不用多说,我们呢就会清楚,理论上你确实支持40亿这样的数据,但是实际工作中我们判定。
04:08
大于10KB。个数5000个就为大K,好吧,这点应该能转的过来,那接下来我们来看看大K有哪些危害,它是如何产生的,以及你如何发现你rise库里面有大K了。好,首先不多废话,内存不均,集群迁移肯定困难,一般哈,我们当然呢,都差不多的数据,但是突然你拿一个是吧,大家都差不多,行李只有一件,你有十件行李,那你这样的。VIP大key自然而然必须要走特殊通道。一说大家都明白。第二个。大了。不好掉头删除的话从中作梗。接下来大了,网络流量阻塞。街上突然来辆火车,一路霹雳火花带闪电,那你告诉我,堵不堵一说都懂过,那么它是如何产生的呢?各位同学?
05:05
大家思考一下,难道是我们故意要把这个K变大吗?有些时候是一些定时任务和一瞬间打高的峰值所产生的,它没办法甚至难以避免。第一个社交类,比如说王心凌粉丝列表,你说王心凌的粉丝才有5000个。这不可能吧,那么典型案例就是假设经年累月啊,就一这一个月好,那么乘风破浪的姐姐还是如影随形的弟弟,那么这些粉丝逐步递增,第二个汇总统计某个报表,越是年经经年累月的这样的一个积累,所以说慢慢的这个数据就会越来越大,那么接下来我们如何发现一个大K呢?来,他的工作上有两个命令,一个叫red big kiss,另外一个叫memory usage,来吧,首先啊。它的好处呢,我们呢是他给你写个summary做下面的总结,就是你用完命令以后,他给你全部录一遍,在你的key的空间里面全扫描一下哪些是大K,给你提前和预警,比如说我们给出每种数据结构拓扑一的一个T,同时给出每种数据类型的介值的个数加平均大小占多少个字节,那么当然不足的话,如果你想查询大于10KP的所有K,杠杠,P kiss,这个呢就。
06:26
无能为力了,所以说需要需要用到我们后面的memory usage来计算每一个键值的子节思,所以一般人家问你面试题,请问大K怎么产生?大K有哪些危害?你这个big k是如何发现的呢?那么两个命令,一个是杠杠big key参数,第二个是memory use it来,同学们请先看啊。我们直接来第一个命令,那么这两个命令有什么区别,我们待会说,好,抱歉不是在这执行啊,这个red client是在外面我们来执行一下,现在呢,我们有100万的red记录来主机端口,然后我们来加上我们的big key。
07:13
好一回车,大家请看,等他来进行一下计算,我先暂停一下录屏,同学们,结果已经出来了,他说的呢,很清楚,扫描当前K的这些实体,去找到最大的k as well as,平均这个按照这个K的类型,平均每个K的。占用的大小,当然你也可以使用再加个参数,就是杠I 0.1to sleep 0.1秒,也就有个间隔,每扫描100个命令,Not usually。Need一般呢,也不常用,也不需要啥意思呢,它是这样的啊。如果你加这个参数就是杠I0.1,意思就是说每隔100条skin这样的扫描命令就会休眠0.1秒,那么你这样的这个就不会OS呢,就不会剧烈的弹升,但是呢,扫描时间会会变长,那么按照我们的原话提示,Not usually need,也不用特别的需要,好吧,那也就是直接干就行了,那么来他就告诉你,那么找出来我们现在的样本数是100万个K啊,所以说呢,扫了一遍,那么最大的string发现的是K228162,那么大概是七个字节,那么K100,当然这个K的名字对吧,它呢有点类似,就说什么概念呢,我们这儿是不是也就是get k100万。
08:36
那么这个value这个值是不是也是最长对吧,所以说占的东西也就多一些,好理解吧,这个我相信OK,所以呢,这个呢占了八个字节,所以三给你总结一下。样本案例100万个K,在这个全集里面,总的K的长度字节是多少多少?那么最大的一个是这个占有八个字节,那么请看list,哈希,Stream stream set z,由于我没有其他类型,所以给你统计出来100%是这么多,那么平均呢,是6.89这么个字节数,OK,离我们的10KB还差的远呢,OK,所以说呢,这个呢,也就是我们需要掌握的第一个问题。
09:15
干干big kiss,那么第二个memory use,这是什么东东呢?那么我们先来看一下官网,直接告诉你。给出一个K和它的值在内存中所占用的什么字节数,返回的结果是K的值,以及为管理该K分配的内存总字节数。命令很简单,Memory use h,具体哪个K它占多少?OK,所以说呢,这个就冤有头占有主,你多吃多占的给我计算出来,所以计算每个键值的子节数,那么来吧,那么同学们,我们呢,也很简单,那么memory useage这个K,假设我就K100好吧,占多少?56 OK,大概就这个意思。好,那么同学们这个呢,是一个很简单命令,就说具体某一个K占了多少,是多少就是多少,那我们来进行一些K的诊断和统计,那么这个就是我们big key如何发现最主要常用的两个手段。
10:15
我们继续,前面已经给大家阐述了大K的危害,OK,那么怎么做呢?你发现了以后,并且用memory usage也确认判定了这个K大于10KB以上。你当然是希望。把它拿掉,尽量的不要影响我们的系统,少一个大K就多一份安全,那么接下来我们来看看如何删除我们的大K呢?走,首先。再次参考阿里云red开发手册,大家请看非字符串的big key不要使用,比delete删除啊,那啥意思呢?比如说如果是你是string,你用一下delete塔还情有可原。但是对于哈希。
11:00
Set z set这样的其他数据类型的需要什么?重点渐进式删除那么杨哥请说人话,什么叫渐进式删除?我们下面呢,先举个案例,假如说我现在H塞尔塔。Customer,那么001这是个哈希类型,ID是11C name是李四,A是23,那么分数是80对吧?等等等等其他的好了,那么h get,大家请看CUSTOMER001那么哪个字段IDC name对吧?我看啊ID11,那么ID啊,多写了一个field,好,那么现在c name OK,没有任何问题,那么接下来的问题是什么叫渐进式删除呢?那么同学们,我们这个key是叫CUSTOMER001,那别忘了啊,我们是不是可以这样直接删。
12:05
霸王硬上钩强上,但是何为渐进式删除?你既然整个K你都要删掉了,那么请问咱们是不是什么事都是从大到小从小化了,渐进式删除意思你能不能先把它这些F的先干掉一下,那么这个时候同学们是不是有h delete,哪个CUSTOMER001,这个key,哪个field,比如说我们先删除school和age,各位亲,没问题吧,那么h get wall,然后CUSTOMER001,那么同学们请看现在是不是你把它的F的减小了,那么这个T慢慢的是不是从大到小,最后是不是你在迪丽塔卡001彻底把这个T拿下,听明白了吗?这个就是给大家的一种建议,俗称渐进式删除。好,那么回到我们的官网对SKY命令这样的一个描述,直接告诉你。
13:06
啊,它是分这么多种类型,对吧,所以我们呢,在删除大K的话,需要。量体裁衣,依据不同的数据类型,用不同的策略和方案逐步达成渐进式删除。走起第一个,对于此菌类型好说,人家说的是什么非字符串的big key,那么此是不是就是big?K当中的字符串类型,它可不可以使用比delete塔删除啊,一般只要不是特别过分,你呢是可以用比delete塔删除的,OK,因为string它比较快啊,后面我们讲string的底层源码,它的话呢,那个string它做过优化,但是如果你还是担心保险安全起见,你可以用。And link OK,一步删除,好,这是对于string,那么对于我们的哈希处理呢?请大家看,我们使用h skin扫描每次获取少量的field的value,再使用H1删除每个field,那么这个时候field的value少了,比如说这个哈希啊,它干到5000多个字的话,我先从5000上到1000多,那么这个时候这个K慢慢的变小了,最后是不是再使用迪丽塔把它干掉,所以呢,同学们请看h skinan这个秘密,那么就针对于哈希的这个key,那么游标和之前的一样,只不过类型换成。
14:27
哈希了,仅此而已,好,语法参数不变,那么结合我们阿里手册给出的建议和我们的加号程序该怎么写呢?同学们请看h skin再加h delete渐进式删除,走,我们来看一下这个代码啊。Big哪个类型,哈希主机端口密码big哈希key,那比如说啊,我们现在传进去的就是我们这个CUSTOMER001好了,假如他呢,干到6000个field,好我们来继续。
15:03
主机端口author密码,然后请看count每次多少100个默认游标多少零,然后扫描的结果就告诉你HSKY针对于哈希这个K,就是我们这的这个B格哈西K,那么传进去的初始游标是零,扫描多少个100个,好得到这挨个挨个的循环便例,同学们请看接艾注意这个是什么?是不是h delete针对于这个big hush key里面的entry get key,那是不就是删除它的这个某一个key里面的某一个field,删删删删删的话,虽然说名义上还有这么一个,但是它内部是不是几乎被挖空了,一直到便利了以后这个游标零。开始零终止,那么这个时候这个big哈西key里面的这个field是不是被删的差不多了?哎,这就是渐进式删除,然后最后一刀毙命删除big key delete塔一定要出现,先用h delete塔把哈希的field的value这个个数降下来,整个K变小了,最后在解delete删除big格哈西K,其他类型几乎也都是按照这样的一种思路来运作的。渐进式删除OK,我相信这个详细讲过以后,下面这三个同学们应该是秒懂来,我们继续list呢,是用l trainm渐进式逐步删除,直到全部删除完成,那么这个list。
16:39
Push从5000个以上进去了,好,那么我们的命令大家请看,我们要LM对一个列表进行修剪,就说让列表只保留指定区间内的元素,区间以外的。OK,那么请看,不在区间之内的元素将被删除,那么不在区间之内的就是区间之外的将会被除。OK,那么来同学们看一下,假设我r push list12345,然后呢,L我遍利一下12345,那么现在L出修剪LIST0和2012,那么也就是123,不好意思,不在指定区间之内的将被删掉,那么我指定的是012,就是只留123,外面的四五干掉了,大家请看区间以外的四五被删除,只剩下了123 OK,所以对于list而言的话呢,我们用L也就小部分小部分啊,当然你也别太狠了,那么假设零到什么?
17:42
多少多少对吧,2000什么没必要,你就一百一百的商可以好,那最后还是那句话,它如果例子只变了,走到了什么。几百或者1000以内,最后在迪丽塔再干掉啊,一定要保证渐进式删除,这个思路好,那么同理命令讲完了,我们来说一下Java代码,String还是big list t,那么主机端口密码过,那么大家请看长度是那么多,那么便利一下L。
18:14
从开始一直到它的长度,多少多少多少个,最后delete,一刀毙命干掉,OK,好,这是我们的list,那么如法炮制set the set大致也差不多。那么对于set使用it skin,对于set类型进行扫描,获取部分元素,再使用its remove命令删除每一个元素。那么大家请看一下我们的命令,那么假设我杨哥这有个set类型啊,从零开始,U标ABCDFG。我呢,删掉AB渐进式删除,你别直接上来delete塔,听懂了吧,到s rem把这个set变小了,最后你再delete塔,把这个K给干掉,OK,好,那么同学们,这是我们的S那么一样。
19:01
不多废话,还是什么big set key,大家请看。扫描,然后是s remove干嘛,甚至于这个key挨个挨个的把里面挖空成员。减少。大P变小P,最后DELETE1刀毙命,OK,好,那么下面the set也一样直接告诉你了,也是用ZSC每次获取部分元素,再使用they remove range by rank命令删除每个元素。那么来吧,同学们请看一下啊,The a,那么he叫salary。分数值,分数值还记不得是一个分数加值的一个键值,对对吧,我们的sorted set就是z set类型,那么下面。张三月薪3000,李四月薪4000,王五月薪5000,孙七月薪7000。The range遍利一下,好,我们用z skin,然后呢,对这个KEY0游标开始一到八条记录给我,用这个命令逐个山零和一,第零条第一条,那说白了就把张三李四给删掉,那么下面再来看一下还剩多少,是不是还只剩下王五和孙七了,哎,等这个salary key又彻底变小了,再用delete塔拿下。所以说呢,这个命令和他们的套路就是big the set key写法都一样,先用z remove让它变小,最后在d delete塔一刀毙命干掉。OK,好,那么同学们,这个就是我们对big key如何删除的一个详细讲解。
20:33
接下来我们给大家介绍big key的生产调优篇,那么大家请看一下哈,还记不记得前面我们问过一道面试题,Big key你有没有做过调优?知不知道什么叫惰性示范lazy free,这个问的就是很真实的,就说白了就是肯定是高并发的互联网公司会问到的,那么对于大K我们讲了这么多啊,危害啊,产生啊,发现啊,删除,那么接下来。
21:01
能不能造下优化,那尽量的少产生p key呢?那么我建议大家这个可以在你的生产上进行一下调优,对应的配置就跟我们前面讲过的这个GVM参数调优一样,一放到生产上,那基本上效果是立竿见影,杠杠的好。那么同学们漏,首先这个调优在哪呢?请你打开conf配置文件,有lazy free对应的。相关选项来做一下部分参数的调优,好,同学们。看到这有个lazy free来直接就告诉你了。red呢,有两种最原始的删除P的套路和方法,一种就是我们日常用的delete,它是一个什么blocking阻塞型的删除动作,OK,那么好,这是第一个,第二个呢,巴拉巴拉的这一大堆,他说了基于上述原因。那么自身。架构优化调整和发展,那么right同样也提供一种no blocking阻塞的删除原始的操作,比如说UN link就是非阻塞型删除,哎,所以说同学们这个按link命令对于你是大K是非常关键的,所以呢,各位同学读了这些我们就会明白red它是有一些参数是需要你调整来满足阻塞还是不阻塞?来,我们一起简单的来阅读和看一下,通过刚才red配置文件的。
22:30
阅读我们就知道red天生带着两种删除命令,阻塞和非阻塞型,这段我给大家呢做了一下简单的删除啊翻译,那么呢,有两个来删对吧?一个delete,阻塞型的意味着服务器停止处理新命令,就是我没删干净之前我不接受新的,那这样是不是容易造成堵塞?那么来,那么这块巴拉巴拉这一堆,但是如果键与包含数百万个元素的聚合值相关联,那么服务器可能会阻塞很长时间,甚至几分几秒钟才会完成操作,这就是为什么删除大key比较困难,其实删个大key跟那个kiss星差不多,我是不是都得变利一遍把它全部删光啊?那么基于上述原因,Red还提供了非阻塞型的这样对吧,以及flash或flash DB命令的异步的这个选项,以便后台回收内存,这些命令在恒定时间内执行另一个线程,尽可能尽快的逐步释放后台中的对象。所以呢,对于这些命令啊,取决于这个,这些选项是用户控制的,那么取决于你应用程序的设计是要同步还是异步啊。然而呢,作为其他操作的副作用,Red服务器有时不得不删除建或者刷新整个数据库,具体而言,在以下场景中,独立于用户调用删除对象,OK,那么所以说从这我们大致了解它有两个,那么这个呢,是它的原因。好,那么来。
23:48
所以说呢,我们在这儿。那么有个重点,一句话,基于上面这四个说明啊,我们就不再读了,是,是,它默认去删除对象用的是什么阻塞型这个方法,OK like if delete what cool,就说一般大家都用delete,那么然而你能够配置每一种特殊的情况,就说明以帮助我们更好的释放内存。在非阻性的方法,比如说你要是用link来被调用的时候,比如说如果你用非阻塞型的,那么再结合下面的参数配置,你能够可以立竿见影的看到我们的生产效果。所以同学们,我们呢,简单的来看一下啊,这些lazy free,也就是什么惰性删除,什么过期啊等等啊等等,好不多就几个命令足以,同学们请看。
24:43
根据这个,我们就把这三个通通改为yes就行了,大家请看lazy free。惰性示范或者叫延时删除等等都可以。那么服务器的。Lazy server从no改为yes,异步的这个呢,是flash呢改为yes OK,好,那么这最后这个就上面这段话啊。
25:08
Is not easy,不容易的话去修改这个默认的行为,对于delete命令去扮演,相当于这个我们按link,所以你用这样的个配置,Lazy free you delete no也改为yes OK,就是在用delete的时候,你呢,也做了一下这个调调,所以说同学们不多讲,其他不用动,常用的就这三个,可以把它改为液色,那么这个时候你对于大T的处理更多的就是用非阻塞型的来删除,对你的系统是有一定的性能提升和帮助的。OK,好,那么回过头来同学们杀一个回马枪,下面再试试问问自己。见到杨哥之前这几个面试题。心里面是不是打鼓的,那么下面听杨哥分解完成以后,那么今天晚上的家庭作业就是对big key做一个详细的认真的复习,其形成自己的笔记写在简历上。面试的时候,如果人家问你,呃,有没有做过什么生产调优啊,因为现在啊,就开玩笑说句,你一言不合说什么GVM调优,面试官已经不信了,那么你可以说啊,我我这边我们公司用的多一些,因为做一个的话,大家呢,也还是什么一个新的。
26:21
考察点和一个新的这个面试点,OK,同学们还是要做一下针对性的准备,那么下面这些题目呢,我们都说过,我就不再挨个挨个再重复啰嗦了,只要你听懂的话,我认为今天晚上你的复习笔记是应该出来的。所以呢,屏幕前的你。多动手。少说话,把知识学进去,OK,好,再次感谢各位同学的聆听,对于big g,我们就给大家讲解到这。
我来说两句