粉丝5591获赞4.3万

做前端的朋友应该都知道这样一个函数吧, g s twenty five, 我们可以使用这个函数把一个 g s 的对象,然后给他转化成一个阶层串, 那么可能百分之九十九点九九九九九的情况,你是直接这样使用这个函数的,那么除此之外呢,这个函数也会有别的用法,那么现在我就来给大家介绍一下,那么现在大家看我现在这个对象有 liam 还有 ag 两个属性,假如说我给他加一个属性,那么就叫做性别吧,我们叫做接着,然后呢? 嗯,性别我们就叫做如要卖,然后我现在把这个对象给他转化成一个健身串,就可以看到了他这个性别也给打印出来了。 但是呢,此时我们现在这个对象啊,不想让别人知道他的性别是什么,我们就可以怎么办呢?我们可以把这个,我们可以在使用这个节省点 string five 的时候,我们给他传入第二个参数,第二个参数呢是什 什么呢?它是一个数组,这个数组就是我们接下来要在这个啊,要把它加入这个接生串的这个属性的一个列表,比如说我们把内蒙还有 a 级加入进去,那么我们就可以看到最后被转成接生串的就只有这个内蒙还有 a 级属性的,那么这个精准就没有了。 除了上面说的这种方式呢,那么他的第二个参数,我们也可以给他传一个回调函数,那么这个回调函数呃会依次给我们注入 k 和弯流量的参数,那么他分别对应着这个 这个对象的每一个 k 以及 k 对应的值,那么在这里边呢,我们就可以判断,如果这个 k 是等于性别呢,我们就不给他说出任何内容,那么这我们就直接蕊称一个昂迪范, 那么如果 k 不是等于性别呢?那么我们直接把这个直给为称回去,这样的话我们也能够得到一个不包含性别的一个阶层称。有的时候呢 我们会把一个对象给他转化成一个接生串,然后把这个接生串放到我们的页面当中去展示,比如说这我就把转化后的接生串放到我的页面的一个 free 标签中去展示,但是现在呢,我发现我的这个接生串他只有一行,不方便我们 进行查看。那么一般我们的接生串如果格式化之后呢,会方便我们进行查看,这个时候我们就可以用到这个是尊起发的第三个参数,我们把第二个参数传空,然后第三个参数我们可以传一个一到十的数字, 那在这呢我传个一就代表了我们的这个街神格式的这个串,他的每一个每一个级别和上一级的一个缩进是多少。比如说我们传一,那么接下来大家就可以看到,那么 他的每一集和上一集就多添加了一个缩镜,是吧?这样格式化之后就非常方便我们查看呢。那么如果我们啊,我们把这个缩镜改大 大一点,我们改成我们改成五,大家可以看到这个缩进就变得更大了,这样就可以方便我们进行查看。好,那现在假如说咱们的这个小蔡同学啊,他是一个非常低调的人,他不想别人把他的这个信息转化成一个阶层串,告诉其他人,那这个时候呢? 呃,他可以怎么办呢?他可以在他的这个,他的这个对象里边,然后加上一个兔精神的方法,然后呢在这里面他可以啊发出一个警告,比如说他,他,他跟别人试图, 比如说别人试图去转化他的信息的时候,他就发着发出一个警告。说,说什么呢?说,我劝你啊,理智一点。 ok, 那现在假如说别人再去使用接生点儿啊生理发,然后去去给他转换接生串的时候呢?他就会啊,他 就会直接吊用这个突结绳的方法,然后返回他的返回这个突结绳执行后的一个直,那我们可以看看是不是他就可以返回一个字不串了。好,那这就是今天我要给大家介绍的所有内容,如果你有学到了,千万不要忘了点个赞哦。

我们来给这个 jason 斯顿 f 啊,这个函数做一个讲解啊。嗯, jason 啊,就是把 jason 对 象转成 jason 字母串。呃,这个方法,嗯,我们比较常用啊。 呃,但是我们不知道的啊,他是很少用到的,也不能说不知道是很少用到的。还有第二个和第三个参数啊。嗯, 第一个参数我们比较常用,它有 value, 这必须要传的啊,这是要转成字符串的一个那个接送对象。第二个呢?是啊, repeller 啊,这个,嗯,待会我们主要是用来讲解一下它第三个参数也好理解啊,它就是其实一个占位符啊。 嗯,我们先来看一下第三个参数啊, 结合我们的实力啊,我这里是建了三个对象和一个宿组啊,这也是宿组里边把这三个对象放在一起了。我们首先啊,来这样看一下啊,看一下这个 张三,第二个我给了一个那个啊,因为没有第二个,肯定没有第三个,对吧?然后给一个 t, 那我们稍微掀一下,这里就看啊,我们这里是光把这个内幕筛选出来了,它这个年龄是没有的啊。呃,我们平常打印啊,平常打印如果没有这两个参数的话,当然是它是一个字母串啊, 它这里是一个字母串,它就平行打印出来内幕张三艾特十八啊,我们加上这两个,第二个参数是一个数组,然后里边有个内幕。 呃,第三个参数呢?是一个,嗯,制表符啊,我们看有了制表符以后他就这样了啊,没有制表符的话,他还是就是一个数组啊, 这里除了这个还可以设置嗯,一,然后我们看二五, 这就给。呃,前面格式化以后啊,前面加了一个空格,一个长度啊,当我们到十啊,这里注意一点是到十就是已经到头了,最最大空空十个格啊, 如果换成一百的话他也是还是这样的,不会再变好。这是第三个属性啊,咱们回过头来再来看第二个啊,第二个参数, 呃,数组,我们再把这个年龄放放上来啊,我看转成括号出来以后也有年龄,哎,我们还把这个第三个参数放上吧,这样好看一些啊。 嗯,这样好看一些啊。然后看我们看啊,这个网五这里边还有那 friend 啊 friend, 我 们把这个也加上去,然后看看这个效果。 刷新了啊,刷新以后他还是没有的,也没会不会再给你多添加一个啊,但是我们这里打印网五的话 他就都都会出来啊。好,这是一个啊,对了,我们把这个数组再带进去,再让再看一遍啊。首先我们看一样啊,都是能割出来的,我比如说我把这个年龄删除掉, 我们再来看啊,他就年龄是没有的。嗯数组啊, 如果他还可以是一个函数啊,我们看我们这里总结的 用于转换结果的函数或数组啊。数组我们刚才看了,如果是个函数,呃则这个方法将调用该函数啊,并传入每个成员的值键和值 使用返回值而不是原始值。这句话需要刻意。嗯,做一个那什么啊,重点啊。这这也是一句重点使用返回值而不是原始值啊。如果此函数返回 undefined, 则排除成员 跟对象的键是一个空的字母啊。呃,怎么理解啊。我们来还还来看我们的视力这两句话是重点,我们再来看一下啊,如果我们这个值是一个函数, 它这里边呢是两个值,一个 k, 一个 value, 两个参数啊,我们这里打印这个 k, 我们刷新看,他是什么都没有 on the fly 啊,这三十二行是 on the fly 啊,三十二行是这个打印了的,他啊,是 on the fly, 这里是什么都没有。为什么会什么都没有呢? 我们看这里总结的,他使用的是返回值,而不是原始值,跟对象的键是一个空空字符串啊,也就是啥了,他使用正好,这里使用的是返回值,并不是原始值。 呃,我们正好没有返回任何东西,所以他正好第一次循环啊,得到的 k, 它是一个空字母串, 我们这样就能看看清楚了啊,然后是往给这里加一个 i, 等于零, 嗯, i 加加好,我们再来看一眼,刷新零,他是个空啊,然后,没,没,因为我们底线没有再返回了。如果我们把这个 return 啊, return 一个 v, 我 们第二个是值啊,把这个 v 返回回去,我们再来看一遍,我们可以看到啊,第零个是啊,第第零个是空,第一个是零啊,因为我们是数值,第二个是 name, 然后就逐渐它是往深了去的, 第三个是 egg, 第四个是一,一是又到了正好啊外是数值的下标,它一是一个值,然后依次去循环。 好,我们再来看一个啊,嗯,如果此函数返回 undefined, 则排除成员,我们再来写一个啊, 如果,呃,如果 type of v 等于括号, 我们返回一个 undefined, 什么意思呢?刚才我们看到了啊,在在这里看到啊, v 啊,我没有打印 v, 但是,嗯, v 是 它的这个值嘛? v 是, 当 v 是 字母串时,我们返回一个 undefined, 是哪个是字母串呢?这里边所有加起来只有 name 是 字母串啊,我们返回了,如果 v 等于就相当于是 k 等于 name 的 时候啊,返回 ondefine, 我 们来看一下效果刷新。 我们看啊,就直接把 name 就 过滤掉了, name 是 没有了。呃,这就是这句话啊,如果此函数返回 ondefine, 则排除乘以啊。 好,这就是一个对对,这个叙利亚话啊,接受叙利亚话这个方法的一个讲解。我们就到这里啊,下课。

十字符串类型,也叫 string, 可以 看到这里字母串就是一串字母的意思,那这个时候呢,就可以不单单只是一个字母了,我们可以用一串字母来表示,比如说王宫两个字,这就是 string 字母串。我们来演示一下, 我们先敲一个折叠器矩阵类型,然后我们敲一个 string data 九等于双引号,就不是单引号了。我们敲一组矩阵,相应的我们输出一下, 可以看到它就输出的是一串啊,这就是矩阵类型啊。相应的你会发现有个很熟悉的地方, 我们第一节课讲的时候,其实我们就已经用到了字母串,比如输出一个 hello world 启动,我们可以看到其实它也是一个字母串啊。 string 是 非常常用的一个类型。

各位朋友大家好,今天我们来聊聊一个在 java 世界里,从第一天起就伴随着每一位程序员的老朋友 string 类。到了二零二五年, java 已经发展到了二十一版本, 但这个类的核心地位依然无可动摇。它就像我们编程语言里的空气和水,无处不在, 却又因其设计精妙而常常被我们忽略其深度。简单来说, s t r i n g。 在 java 里代表一个不可变的函数训练。什么意思呢? 就是你一旦创建了一个函数串对象,里面的内容就再也不能被改变了。这种不可变性是它所有特性的基石,带来了安全、高效和简洁。它不属于八大基本数据类型,而是一个真正的类。 但 java 给了它像基本类型一样直接赋值的特权,比如 string greeting 等于。你好,二零二五好! 理解了它的本质,我们一起来逛逛它身上那些琳琅满目的能力,也就是它的方法。这些方法大体可以分为几类, 创建与构造、信息获取、比较、判断、查找、解锁、操作变换以及一些非常实用的现代工具。首先,怎么诞生一个 string 呢? 除了直接写双引号,我们还可以用 new string 这个构造器。它有很多重载形式,比如传入一个字母数组叉, 可以把一堆散落的字母组装成字母串,传入一个字节簇组 byte, 并指定字母集名称 charson name。 可以 把网络传输或文件读取来的二进制数据解码成我们认识的文字。 这里要注意字母集这个参数直观重要。处理中文或特殊符号时,如果选错,就可能出现乱码。字母串诞生后,我们自然想了解它。 link 方法,返回字母的个数, 这是对象方法。 is empty 和 is blank, 这是 java 十一引入的,都能判断是否为空。 is empty 要求长度为零, 而 is blank 连纯空白字体如空格制表符也认为是空。 charit into index 是 对象方法,根据下标获取单个字体。记住,下标是从零开始的,可别越界哦。接下来是比较和判断。 equals object, an object 是 最常用的,它比较内容是否完全相同, 强烈建议用它替代,等于来比较内容。 equals ignore case, string another string 则忽略大小写。 compared to string another string 和 compared to ignore case 则用于排序比较,按字典顺序返回差值。 starts with s t r i n g prefix ends with s t r i n g suffix 用来检查开头和结尾。 contains char sequence s, 看看是否包含某个子序列。这些都是对象方法, 需要你有一个字序链来调用。当我们需要在字序串这个文本海洋里查找定位时, 有一组强大的工具, index off index, off string string。 从前往后找某个字母或子串第一次出现的位置找不到,返回负一。它们还有重载版本,可以指定起始搜索点。 from index 对 应的 last i, n, d, e, x, o, f 系列 则从后往前找。这些方法在解析路径,截取内容时非常有用,重头戏来了,操作和变幻。因为字母串不可变, 所以所有这些方法都会返回一个全新的字母串,原串丝毫不变。 sub string int begin index 或 sub string int begin index, int and index 用于截取子串。注意参数是开始下标和结束下标 不包含结束点。本身 concaten string 用来连接,但现在我们更常用加号或者 string join replace char old char char new char or replace char sequence, target char sequence replacement 进行字母或序列的替换, to lower case 和 to upper case 进行大小写转换。 trim 能去掉首尾的空白符,而 java 十一的 strip strip leading strip trail 则对空白符的定义更广泛,更推荐使用 split。 string regx 是 重量级方法,它根据给定的正则表达式,把字串分割成一个字串数组。这个正则表达式参数 rejects 功能强大,但需要学习, 比如用逗号分割就是 split 逗号反过来把多个字母串拼接起来。我们可以用类方法, string join char sequence de limiter char sequence elements。 第一个参数是连接符,后面是可变长参数,用起来非常优雅。例如 string join 两千零二十五零一零一。 java 八之后, string 也加入了函数式编程的潮流。 char 方法返回一个 i, n, t, s, t, r, e, a, m, 让你可以用流的方式处理每个字母。 java 十一的 lines 方法则直接把一个多行字幕串按行分割成一个流,处理文本文件内容简直不要太方便。还有几个非常实用的新方法, repeat int count 可以 将字幕串重复多次。 formatted object arcs 作为实利方法,相当于 string format 的 快捷方式,用来做字幕串格式化。说到类方法,除了刚才提到的 join, 最重要的就是 format string format object arg, x 和 value 系列了。 format 方法利用格式函数串和参数生成格式化后的函数串功能强大,而 v a, l, u, e, o, f 可以 把几乎任何类型整数、浮点数、对象等转换为其函数串, 表示他是一个多才多艺的静态工厂。最后,我们不能忘记字母串的内部秘密,应 turn 这个方法,他会主动将字母串放入字母串长量池。对于大量重复字母串的场景,合理使用它可以节省内存, 但一般情况下我们不需要手动调用。好了,关于 java 二十一中 string 类的核心方法,我们就先聊到这里,他就像一把设计精良的瑞士军刀, 每一个方法都为了解决特定问题而生。理解他们不仅能让你编码更高效,也能让你更深的体会到 java 这门语言在 api 设计上的深思熟虑。希望这次漫步 能让你重新认识这位最熟悉的陌生人。下次当你敲下 s t r i n g 点的那一刻,或许会有更多得心应手的感觉。感谢您的耐心观看,我们下期再见!

面试官问 script 为什么设计成 file 不 可变,要是你只答为了安全系统啊,就这么规定的,那薪资大概约只能卡到初级。 这题百分之八十的人都答的浮于表面,根本没说到面试官想听的底层逻辑。要是他追问啊,不设计成 file 会怎么样?你是不是当场蒙圈? 今天啊,三分钟把底层原理拆的明明白白。核心,哎,是三大底层变量, 少一个都不算达到点子上。第一啊,为了字不串长量尺,附用 jvm 的 长量尺本质是对向共享仓库,你写十个 hello, 尺子里其实只存一份,要是尺寸可变,有人改了其中一个引用的内容,其他九个全跟着乱套,长量尺直接报废,内存也得炸。第二, 为了哈希缓存提效。哈希 mac 的 k 为啥常用 string? 因为它不可变啊,哈希 code 只需要计算一次,之后直接缓存服用,要是可变,每次取 k 都得重算哈希哈希 mac 性能直接崩盘,聚合类都得跟着卡。第三, 还是安全兜底,网络连接啊,数据库 url, 加密密钥全是 seed 类型,要是能随便改,黑客改了参数就把你的数据库地址换了,或者把加密密钥篡改了, 系统直接瘫痪,你都不知道问题出在哪。所以下次面试直接这么秀。 seed 设计为 file 不 可变, 核心是三点,底层逻辑,第一,支撑自互串长量池,附用对象,节省堆内存。 第二,缓存哈希 code 避免重复计算,大幅提升哈希 map 等集合的性能。第三,保障安全性,防止网络请求、 数据库连接等核心参数被恶意篡改或意外修改。你学会了吗?记得点赞收藏面试资料我已经整理好放到主页了。我是 fox, 关注我技术面试不迷路。

咱们今天接着来说这个 c 加加中这个 string 的, 呃,常用的操作啊,先看一个题目, 过滤多余的空格啊,就是在一个句子中呢,也许有多个连续的空格, 然后把这个多余的空格给他过过滤掉,只剩下呢一个空格什么意思啊?底下有个势力啊,假如说我们输入一个西红柿炒鸡蛋,你看他中间呢,有很多的这种空格,最后 经过程序的处理,然后输出啊,这些空格呢只剩下一个,那这个应该怎么去实现呢?好,咱们看一下这个程序啊, 在这里呢,我定义了两个变量, s 一 s 二。呃,然后呢我们输入的这个字母串呢,把它存储到 s 一 里边, 然后通过一个 far 循环来便利这个 s 一, 然后把它给它处理成什么呢?处理成只剩一个空格,最后呢给它输出。 这个 far 里边是怎么来实现的呢?是它这里看啊,这有一个 if, 有 一个 else if 啊,然后呢这个 if 呢是假如 当前的字母不是空格的情况下,然后呢就把这个字母给它存储到 s 二里边,然后后边呢是,呃,若当前的字母是空格, 然后呢就会把它,你看这取的是加一对吧,就把它后面的一个不是空格的字母呢存储到 s 二里边,经过这样的一个处理的话呢,最后啊就会让,呃这个字母里边只剩下一个空格。 咱们来运行一下啊,看看, 我把这个直接复制过来。 复制过来。哎,哪来在这来 好,复制过来了,你看这中间有很多空格,对吧?咱们敲一下回车看看。好,你看它处理完以后啊,这就只剩下一个空格了。

信节 plc 怎么把通信得到的一段是菌类型,或者说制腐创,或者说阿斯克类型转换成腐点数呢? 比方说对于这么一段数据,我要提取这个二百五十八点幺四八,提取这个八十三点七幺七,它们是腐点数,怎么能方便快捷地提取?我这里做了一个 fc, 输入的是菌类型,输出直接是 float 类型, 里面用了 c 语言。主要是这两个函数还是比较复杂的,然后这里是主函数, 在 plc 继承性当中,它是这种,比方说二五五点四三,它们都是连续的地址,然后呢,它们属于阿斯科的类型, 阿斯科类型实际上就是制腐创,然后我这里直接把它转换成浮点数,这里是二五五点四三八十三点七二, 这个数据是这个机器人给的啊,可以发现这两个都是对的,案例已经上传。

这节课我们来学一下 string, import string, 然后我们 string 里有两个长量啊,有很多长量,比如说这个阿斯克,阿斯克码里面的这个,然后还有 这个,这两个的区别是啥呢?首先它呢是输出 a 到 z 的 小写字母,它呢输出 a 到 z 的 大写字母啊,简单易懂。那么我们再试一下 输出这个,这个是数字的意思啊,零到九没有问题,对不对?那么我们已知它可以输出小写字母,它可以输出大写字母,它可以输出数字。我们来做一个随机的密码程序,生成一个随机的密码十二位, 包含数字加字母。那怎么做呢?我们导入一下之前学过的 read on, 导入以后呢,我们就可以用之前学到的一个函数叫 truth 啊,这个大家不是很理解的话,可以看下我以前的视频哈。 ok, 这,这是我去运行的,你看 w, 哎,我再运行 v, 它是随机抽一个数字出来的,这是大写,嗯啊,这是大写的, 嗯,对不对?那么我们已知一个东西啊,已知是什么呢?已知,刚才我们这个它输出是大写,对不对?然后, 嗯,这个它输出是小写,对不对?那有没有大小结合呢?有的兄弟使用这个,还有大小写都有了, 我们直接给它怼上去 z 大 写啊,再运行 t 小 写,对不对?大小写随机抽,我们再弄一个 r, 等于 rand 点 truce, 我 们去让它选择一个数字 运行,那你看零再去运行一, 好,那么十二位啊,十二位里面我们是不是啊?他一共十二位,对不对?那么我们生成一次是有两个,一个字母,一个数字,对不对?那我们也就生成六遍,一次两个,对不对? 这样子,然后 print 二二一,让我们去运行,哎,你看对不对?一二三四五六七八九十十一十二,对不对? 那这么整的话就很好整了,我们既然有了十二个数字啊,十二个数字加字母,给他拼到一块,他就是随机密码了,那怎么拼呢?我们可以这样定义一个文本, a 加等于 r, 再加 r 一, ok, 没有报错完。这时候呢我们直接去运行 a, 输出 a 看,这就是它的随机密码了。 那么我们现在获取了一个密码,我们想要获取很多密码怎么办呢?再嵌一个循环进来 four g e, 然后我就直接一百个密码给它嵌进 运行,看他可以直接输,输出一百个密码也是非常厉害。

好,大家好,欢迎收听今天我们要深入聊的这份资料,是来自波面 app 的 一篇关于 radis 核心数据类型的详尽指南。 咱们的任务很简单,就是帮你彻底搞懂 radis 这把税式军刀。它真的不是一把普通的扳手。呃,它更像是一套为不通场景量身打造的工具。今天咱们就来聊聊怎么用对这些工具,特别是在面试的时候。嗯,这个比喻很到位。 说实话,面试官真正想听的不是让你去背 api, 而是你对权衡这两个字的理解。比如说,同样是存一个用户信息,你用 string 存 json 还是用 hash, 这背后啊,其实是你对性能、内存还有维护成本的综合考量, 这才是区分一个普通开发者和优秀工程师的关键。好,那我们就从最基础的 string 开始吧。它除了能做最简单的缓存,还能干嘛?我听说它的那个基数器功能特别常用,对,源自基数器,这绝对是它的一个杀手级应用。 你就用一个 i n c r m 命令,就能特别安全地给文章阅读数或者商品点赞数加一。 关键点就是原子性。原子性对,你可以把它想象成一个绝对不能被分割的操作,所以在多现成环境下,它绝对不会出错。 也正是因为这个特性,引出了它的另一个高频考点。分布式锁。啊,我想到了,是那个 set n x 命令,对吧? set if not exists 完全正确。 set n x, 它也是一个原子操作, 他把检查 key 在 不在和如果不在,就设置直这两步 a 合并成了一个没法被打断的动作。这样就保证了在任何一个时刻都只有一个客户端能成功地把这个 key 设置上,也就是拿到了锁。 这个有我没?他的特性,就是最简单的分布式锁的实现原理。 o 就 这引出了一个很经典的场景了,假设我们要缓存一个用户对象,里面有 id、 用户名、年龄这些,那直接把整个对象缩列化成一个 json 存进一个 string 里,不是最简单直接的吗? 为什么还要费进去用函数呢?哎,这正好就是那个权衡点,如果你只是读,或者说整个对象一起更新,那 json string 确实简单。但如果你需要频繁地修改某个局部的子段呢? 比如就只更新用户的年龄。啊,我明白了,用 string 的 话,你就得把整个 json 读出来,在你的应用程序里解析,改完再序列化存回去。 可你要是用 hash, 只需要一条 hset 命令,直接就在 reddit 内部把你的字段给改了,网络开销和 server 开销都小得多。原来如此,这在 iou 效率上差异太大了。嗯,还不止,还有内存。 当一个 hash 里面的字段不多的时候, reddit 会用一种叫 zip list 的 紧凑结构来存, 非常省内存哦。 ziplist, 这是个内部优化。是的,这其实是 reddis 的 一个优化策略。它就赌大部分哈希对象都很小,所以默认用内存优的方式去存。一旦这个对象变大了,它会自动转换成更高效的哈希表结构。 你要是能在面试的时候把这种从内存优化到性能优化的动态转变讲出来,那深度一下就上来了。明白了,所以说 hash 完美解决了描述单个对象属性的问题。 但如果我们要处理对象之间的关系呢?比如说一个用户的关注列表,或者他发布过的时间线。诶,这个进入集合类型的范畴了。我们来看看 list set 和 z set。 list, 它就是一个有序的、可以重复的列表, 就像你在社交媒体上刷到的那个时间线啊,新的内容总在最前面,用 l、 p、 u, s, h 把新动态推进去,再用 l、 r、 a、 n、 g 分 页读取,很直观。嗯,确实很直观,但得注意哈。用 list 做消息队列,功能是比较初级的, 它没有消息确认机制,所以 reddit 五点零之后就推出了 stream, 那 个是更专业的解决方案。那 sets 呢?我理解它的核心就是不重复。对,所以它天然就适合做标签系统,或者需要判断存在在的场景。 更有趣的是它的集合运算。比如面试官突然问你如何用 reddit 快 速找到两个用户的共同关注?喔,这个问题就好,你就可以很自信地回答,把每个用户的关注列表都存成一个 set, 然后用一条 s、 i、 n、 t、 e r 命令求个交集,瞬间就能搞定。 我见过一个项目,之前在应用层循环对比要好几秒,换成 s i、 n、 t、 e r 之后就几毫秒,效果惊人。 哇,这个例子太有说服力了。但是 set 是 无序的。如果我想做个排行榜,比如热门商品榜,那怎么办?这就是 z set, 也就是有序集合的舞台了。它在 set 的 基础上,给每个元素都关联了一个 score, 也就是分数。 你可以把商品的销量或者文章的点赞数当做 score, reddis 就 会自动帮你从高到低排序,用 z、 r、 v、 r n h, 拿个前十名就是一条命令的事儿,效率极高。 听下来,这五种核心类型,基本上能解决绝大多数问题了。但有时候我还会听到一些更特殊的类型,比如 bitmap, 还有那个 hyper log log。 嗯,那些可以看作是处理海量数据时的特种兵。 你想象一个场景,要统计一亿用户连续一个月的签到情况,你要是用 set, 那 内存肯定就爆炸了。但用 bitmap 呢?它本质上是一个位数组,每个用户只占一个 bit, 用零或者仪表式签到,没签到空间占用,能解上好几个数量机。 哇,那 hyper log log 呢?听起来更复杂,它其实是用来做基数统计的,说白了就是去重技术。 比如统计一个网站一天到底有多少独立访客,也就是 u v, 它不存具体是谁来了,只是通过一种概率算法估算出总数,结果会有微小的误差。但好处是,不管你统计一万个还是一亿个用户,它占用的内存都是固定的,大概十二 kb 哦,在不需要精确技术的场景下,性价比就非常高了。没错,所以总结一下,关键不在于记住索种命令,而是在面对一个具体需求的时候,能像刨钉解牛一样,分析出问题的本质,然后选择最合适的那个工具去解决它。 好的,那我们进入最后的实战环节,我们来模拟几个最高频的面试题,帮你巩固一下今天的内容。来吧。 第一个问题,如果要你设计一个网站的热门文章榜排行榜,你会选择 reddit 的 哪种数据类型?为什么 zset 有 序集合?因为文章的热度,比如点赞数可以作为 score, 文章 id 作为 member, zset 会自动根据 score 排序,用 z, r, v, r, n, g 就 能轻松拿到 top n 的 文章列表,非常高效,很好。第二个,在 radis 中实现分式锁最简单的方式是什么?用 string 类型和 s d n x 命令。 s d n x 的 特性是,如果 key 不 存在才设置这个原子操作,可以保证在分布式环境下只有一个客户端能成功设置锁,没问题。 第三个,纯用户信息,比如 id、 姓名、年龄,用 string 存 json 和用 hash 存,各有什么优劣?呃,一般来说 hash 更好。优点一, 可以独立更新某个字段,比优质更新年龄开销小。优点二,当字段比较少的时候,内部编码更节省内存。 string 的 优点就是简单直观,但每次修改都要读写整个 json, 效率比较低,清晰。第四问,如何用 radis 快 速查找两个用户的共同关注?用 set 把每个用户的关注列表分别存在一个 set 里面,然后直接用 s enter 命令对这两个 set 去交集,结果就是它们的共同关注了,非常棒。 最后一个问题,用 list 做消息队列有什么不足?有更好的替代方案吗?嗯, list 就 来一个简单的消息队列,它不支持消息组模式,也没有消息确认。 a c k 美机制功能比较初级。 reds 五点零之后推出的 stream 类型是更专业的替代方案,它支持消息组消息持久化和确认机制 功能,更像一个轻量级的 calf 卡,太棒了。所以说,理解每种数据结构背后的设计哲学和它所做的取舍,比单群的记忆要重要得多。正是如此,当你真正理解了这些,你就能在面试中,甚至在实际工作中做出更明智的技术决。

大家好,今天我们来继续学习我们的一个这个达博的高级视力。呃,关于其中的一个放话的调用。 然后呢,放话调用他总共有四个小节啊,第一个是通过死菌子的形式调用,然后第二种是节省,第三种是奥特铺的 stream, 第四种是那种病的饮用的类型。然后呢,我们本章节主要来讲一下,就是呃,死菌, 嗯,怎么去处理的?放化掉用。 好,那我们来看一下。就是我们以前写过的一些放话调用。嗯, 可就是来看一下,用我们一些加瓦大马写的形式,比如说我随便找一个。好,那对于这种形式来,对于放花雕圆,他还是使用这种形式。但是呢,我们会发现一个问题,就是我们这个接口, 我必须得是这种 class 的形式。那如果是 class 形式的话,那意味着我这个 消费方,意味着我要去在我的泡沫需要引诱我们服务方的一个赞的佛萨的。是不是因为你都写在 这,那就意味着我一定要引用我服务方的一个这样的复煞的。那我有没有可能就是不去写这种 实实在在的一个站的 class 呢?啊?其实可以的,那我们本张杰就来带大家就是嗯,来学习一下。就是我们通过放话的调用而 写这种东西呢,代替用他的这个接口的全类名来代替。然后呢,其他的呢,应该都长得差不多。好,那我们首先就是 来,我们如果需要放话的话,那我们得需要一个这样的类。嗯,这里是放 放话试卷的话,那我就弄一个放话的试卷吧。放话的单词哎,这里有 哎,是这个吗? feel, 那我发货的话,我就把这个单词扣过来, 这个叫放话 shy application。 然后呢,这个其实就是放话调用中的 一个试卷手串形式的传传。钓友 对于这样的话,其实会和这些代码长得差不多,那我就把这些代码直接拷贝过来了, 应该是这个整个洞。 但是呢,唯一有一点不同的就是我既然是放话,放话的话大家会看就是放话杰纳瑞克 so is 放话的话就是这个接口,我需要的放话。 然后呢,我们得使用这个 api。 然后这里我就就得做一些调整了, 我这里不再是实实在在的引用下游的一个人的佛萨的 class, 而我这个地方呢,变成了这个尖的这个 sos。 然后我这里也写一下,然后紧接着呢, application 正常, registry 正常。好,那这里营业下游的 facade。 好,那我得把它变掉。我怎么变呢? 这个时候 我把它变成这样,那是不是意味着我这个 interface 是长这样的,一个这样的接口了。然后呢? 第一个是这里替换完了,然后这里替换。第二个是这里替换完了,然后第三个就是我替换完了之后,我得 有地方能知道他是进行放话这一个这样的处理。所以这里有个吉安的瑞克,一个这样的方法。 好,那我就把它变为处。变为处之后呢,其实发现就是你这里拿到了代理的时候,其实就发生了变化,因为你不再是引诱下雨的富萨的了,其实你是一个这样的类型了, 那我就不要了。 好,我就一个这样的服务的调用。然后呢,他里面有什么方法呢? 其中是一个同步的,一个是义务的。然后呢,我们现在就用同同步的来做一个简单的测试验证。那比如说我这里点 invoke, 然后没事的,我要调哪个方法呢? 然后 macer 的掉哪个方法,我应该掉的是哎,我找一个,我就找一个库瑞。 哦,我这里写错了,就是这里其实是引用的,就是我要调用真实佛萨的那个的权利,里面应该是这个,还好刚刚眼前看到了。然后呢,这里有几个参数,就 master 的, 就是方法名,方法参数的类型,以及我们的真实的参数。那对于 我这样一个接口而言,那他的方法名其实就是 carry user。 然后呢,第二个就是他的方法的参数类型,其实方法参数类型是这个使俊, 那我们就来六使劲。 嗯,死菌的话,这里有没有死菌的一些类型,哎,有,有他了。 好,这也弄过来了。然后第三个就是我们的一个这样的真实的参数,然后真实的参数的话,目前他就只是接受一个 就算那比如说我就接受黑米粒这个参数,那这样的话,其实我就可以得到一个这样的结果。那么最终我只要把这个结果简单打印出来,就偶尔,然后这个也不需要了。 好,这就是我们放话调用,然后通过自不创形式的类型。其实你看就是我这个放话里面穿的就是一个简单的自不唱,我也没有什么其他华丽的一些东西。 嗯,然后我起了一个服务端的,嗯,服务端的话,我就起最普通的插庙形式的, 我把它起起来。 然后呢,接 就是来看一下,就是等他起完了之后,我们得去把我们的 消费方通过试卷行驶吊用的时候起起来来, 如果他钓鱼成功的话,你在消费方面应该是能看到一个正常日式的打印的。 嗯,发现没?就是我们已经掉到了那边的接口去了,然后这里是二零八八五那个 端口服务所处理的。然后这里其实也是正常打印,是二零八八五那个端口处理的。这个请求。 嗯, ok。 好。那我们今天就给大家介绍的就是怎么通过 放话调用,然后传传呢,是传我们试卷形式的这种程其实就是主要关注是这个哦,不见的你传的是一个支付串内容,然后你的试卷的这个方法的 常速的类型就是一个试卷的形式。好,那今天就先到这,谢谢大家。

大家好,今天我们来继续学习我们的达宝高级视力中的放话调用,然后呢,这个时候呢,我们是通过节省自创的形式进行传唱的调用 啊,节省自主创是怎么来调呢?我们来回顾一下,就是我们上一节, 上一节的话,我们通过是俊的形式,是通过这么样的传唱的,然后呢,现在我们节省了是怎么来呢?嗯,我们就 把这个改一下,比如说现在是一个节省,哦,应该他最终会转成一个麦普,那就节省麦普吧, 这里是节省。 好,我按照这种形式来调的话,那我需要改哪里呢?因为我既然是个节省的话,那么意味着你是个对象, 那么我现在什么优势?快复差的?现在我里面没有任何一个方法的参数,他是一个对象的形式,那么好,我首先得去改造这个,我让他支持有一个对象的方,就是方法的路上有一个对象, 我进到这个接口来,比如说我给他加一个,比如说叫做一个 quarry user info, cary user info 的话,我这里就给他建一个, 然后有色音符, 然后这里就是用户信息 street, 嗯,然后比如说 id 内幕,然后比如说性别,哎,我就这么点吧,我不搞多了,然后实现序列化接口, 然后呢把他的什么赛特啊 get 方法提供,并且呢给他冲一下图试卷方法。好,那相当于 我有一个这个方法,然后我这个也用它吧。 好,这个也用它,相当于我现在为了实现我接受漫步一个传承的吊用,我得有一个方法接受对象,然后因此 才有了这个方法的诞生。好,那这个方法如果他现在写完了,我就把他一说到本地,然后呢我接下来就是这个地方, 我把它实现一下。其实这个时候呢,你看他已经回到我们的破外的这个工程来了, 我要把它实现一下,实现一下的话我现在也不做什么复杂的处理,我就来直接拷贝, 拷贝的话 我就直接把它打印吧,然后这个端口留下, 这里定一个边量出来吧 logo, 然后这里好,就这样,这个也不需要了,这里应该就是接收参数长这样, 接下来呢,我做一点改变,你好歹也知道方法掉进来了,然后参数有点改变,针对入场做一些简单的复制, 复制操作模拟进行了业务逻辑, 然后这里响应,我怎么处理呢?其实我比较简单, set id, 然后 set name, set 性别,我怎么来呢?呃,我就给他加一个 love pro, 然后 加上他原来的 gs id, 我就干一件这么简单的事情,然后这里是 get name, 然后这里 get sex, 好,我就这么简单粗暴。 然后接下来就是我来看我这边怎么掉呢?其实为什么这里是节省呢?这里要跟大家讲一下,就是 对于大家的业务程序来讲,呃,如果想要做到非常非常的通用的话,那么意味 使劲是一个非常友好的, 应该是一个,是一个非常万能的船舱类型, 所以呢,比如这里是某种通用的业务 功能,有这么一个,是有这么一个这样的节省 啊,比如说你解释,然后你 pose, please, 解析成什么样的呢?然后比如说你解析成, 嗯,比如说你现在是一个这样的节省,然后呢?你解析成我们的哈西麦普, 那这样的话 对你的同用功能来讲,节省是你的 一坨内容,然后你只要想办法转成一个这样的哈西麦普,那么我只要想办法把这个麦普传 到这个里面来,那是不是?那是不是我变相的把节省传到了我们监控里面去?其实我就做了一部转化,把我们的节省转成了一个这样的卖铺转到这来, 那是不是我这里是要稍微变一下,变成我的麦普?当然我如果要掉任何的接口,那我除了我得知道 你掉哪个方法之外,那我还得想办法知道你掉哪个方法的类型, 那么比如说我现在这个方法,他的方法的入场是这个类型的,那么好,那我就把这个类型复制过来, 放到这来,然后的方法明也变一下,也就说这一个变量和这一个变量是要成对存在的相,相当于这两个变量,然后绑上你这个节省, 我就能做一些简单的调研,包括板上我这个佛萨的应该这些三四,如果我有一个这么一个对象,这个对象里面有 一二三四这四个元素的话,那我其实拿着第四个元素转麦普放到这来,然后拿着第二个元素放这来,拿着第三个元素, 呃,放这来,拿着第一个元素的方法放这来,那我是不是就能完成一致减? 简单的一个赞的远程 rpc 调用?好,那这里,至于说这里是麦普的话,那我就自己构建一个赞的麦普,那比如说 我就自己构建一个 牛哈西麦虎,那我给他些什么东西呢?那比如我就把这个优势音符里面东西我都给他弄过去,比如说 id, 然后大家注意就是我这个节省里面的 这个 k 呀, 就是这个 k 一定是和这个我们 对象里面这个四段名是一样的,然后呢这个是内 six, 比如说 id g 三幺四,然后呢内幕,然后是 wy, 然后这个是,然后 f, 这样的话我通过这个往里面一传,那相当于我就能 拿到我想要的数据了,我们不妨来试一下。 嗯,我们把我们的 服务方 起一下, 然后这边的话我把消费方也给他取一下, 只要不出什么异常的话,正常来说是能拿到结果的,到时候我会在这个里面都给他拼一个这样的端口的前缀, 好发现没?就是我已经把端口拼到前面来了,这看到没? 当然我服务端看有没有,有没有答应,哎,我服务端其实也答应了,就是我服务端收到的是这样一个形式,然后呢给他响应之前,我把他端口拼接到前面去了,这里是二零八八三,然后这边呢 也是二零八八三,也就说明就是我们通过这种接生转迈普这个参数的传递,其实也是 ok 的。嗯,好,今天就讲到这,谢谢大家。