首页 > 其他分享 >贝壳的面经!怎么好像有点简单?

贝壳的面经!怎么好像有点简单?

时间:2024-08-07 08:56:50浏览次数:7  
标签:面经 协程 贝壳 元素 列表 索引 线程 简单 节点

今天分享粉丝最新投稿的北京贝壳外包面经,我把项目相关的都去掉了,其他的问题整理下来感觉不是很难,你觉得呢?换做是你的话你答得出来吗?

面经整理如下

北京贝壳外包

  1. 自我介绍
  2. 项目拷打

Redis 跟 MySQL 以及 Kafka 之间是什么关系?

Redis 是内存数据结构存储系统,用于快速读写和高并发访问。MySQL 是关系型数据库,用于持久化存储结构化数据。Kafka 是分布式消息队列系统,用于处理大规模消息流和数据分发。

在应用中,MySQL 存主要数据,Redis 加速访问,Kafka 传递消息和解耦组件。例如电商系统中,用户信息在 MySQL,购物车数据在 Redis,订单处理消息通过 Kafka 传递。

Kafka partion的概念

在 Kafka 里,Partion 就是把一个主题的数据分成了好几个部分。 每个 Partion 都是按顺序存消息的,而且这些消息改不了。同一主题的不同 Partion 能放在不同的地方,这样就能让数据处理得更快更平衡。

Partion 有这些用处: 一是存数据,消息按顺序存进去,还给每个消息弄个编号来标明位置。 二是能同时处理,多个 Partion 能让不同的人或者组一起处理,效率高。 三是不容易出错,如果有地方坏了,也就影响那一部分,整个主题的数据不会丢。

Kafka 偏移量

在 Kafka 里边,偏移量就是个数字,专门用来表明消息在分区里处于啥位置。

打个比方,每个消息在分区里都有个独一份的编号,这就是偏移量。消费者读消息的时候,会记住自己读到哪个编号了。下次再读,就知道从哪儿接着来,不会重复读,也不会把消息给漏了。

比如说,偏移量是 5 ,那就说明这是分区里的第 6 条消息(因为偏移量从 0 开始算)。偏移量能保证 Kafka 里消息处理得有顺序,而且不会丢。

比如说有你在线上发现一条慢SQL,你怎么分析它?

使用 explain ,说明:

首先关注“type”这一项。若显示为“ALL”,意味着进行了全表扫描,这通常不是理想情况,需要寻求改进。若显示为“index”或“range”等,则相对较好。

其次留意“possible_keys”和“key”这两项。“possible_keys”表示可能能够使用的索引,而“key”表示实际使用的索引。倘若“key”这一项为空,意味着未使用索引,此时需要探究原因,例如索引创建是否正确。

再者,“rows”这一项也颇为重要,它代表预计扫描的行数。该数值越大,表明需要处理的数据量越多,可能导致查询速度变慢。

另外,“extra”这一项也值得关注。如果出现“Using filesort”或者“Using temporary”等内容,往往意味着存在问题,需要进行优化。

索引的最左前缀原则是什么意思?a > 1 and b = 1 and c = 1, 你看这个能命中这个索引吗?

索引的最左前缀原则就是在创建联合索引时,查询语句用索引的条件得从索引的最左边开始,而且得连续匹配。

对于“a > 1 and b = 1 and c = 1”这个条件,能不能命中索引得看创建的索引是啥样。

要是创建的索引是 (a, b, c) ,那这查询就能命中索引,因为是从最左边的“a”开始匹配的。 可要是创建的索引是 (b, c, a) 或者其他不是以“a”开头的组合,那这查询就不能命中索引。

Redis 常见的数据结构?他们的应用场景?

  1. 字符串(String):可以存储字符串、整数或浮点数。常用于缓存用户信息、计数器、分布式锁等。
  2. 哈希(Hash):适合存储对象,例如存储用户的详细信息。
  3. 列表(List):可以实现队列、栈等数据结构。常用于消息队列、最新文章列表等。
  4. 集合(Set):用于存储不重复的元素,可用于社交关系中的共同好友、抽奖等场景。
  5. 有序集合(Sorted Set):每个元素都有一个分数,可根据分数排序。适用于排行榜、限时活动等。 例如,在电商网站中,字符串可以存储商品库存数量,哈希存储商品详情,列表用于存储用户浏览记录,集合用于存储用户收藏的商品,有序集合用于商品销量排行。

zset 你一般在什么场景下会用?底层的数据结构是什么?

ZSet(有序集合)通常在以下场景中使用:

  1. 排行榜:例如游戏得分排行榜、商品销量排行榜等,按照分数或销量等进行排序。
  2. 优先级队列:可以根据元素的权重或优先级来处理任务。
  3. 时间序列数据:比如按照时间戳排序的事件记录。

Redis中ZSet底层实际有两种数据结构:

一、压缩列表(ziplist)

使用条件(以下两个条件需同时满足) 12:

  1. 存储的元素数量较少(通常规定是小于配置参数 zset-max-ziplist-entries ,一般默认是128 ,但可以修改配置)。
  2. 所有元素长度都比较小(规定是小于配置参数 zset-max-ziplist-value ,一般默认是64字节,但可以修改配置)。

结构特点:

  • 是一种为节省内存而设计的特殊编码结构,将所有的元素和分数紧凑地存储在一起。
  • 元素和它的分数在压缩列表中是交替存储,即第一个元素是成员,第二个元素是分数,第三个元素是成员,第四个元素是分数,以此类推1。
  • 在redis的源代码中,压缩列表(ziplist)的结构并没有直接定义为一个C结构体,而是通过一系列的宏和函数来操作一段连续的内存1。其结构大致包含以下部分 1:
    • zlbytes:一个4字节的整数,表示整个压缩列表占用的字节数量,包括它自身的大小。
    • zltail :一个4字节的整数,表示压缩列表中最后一个元素的偏移量(相对于整个压缩列表的起始地址)。
    • zllen:一个2字节的整数,表示压缩列表中的元素数量。如果元素数量超过65535,那么这个值就会被设定为65535,需要遍历整个压缩列表才能获取到实际的元素数量。
    • entry:压缩列表中的元素,每个元素都由一个或多个字节组成。每个元素的第一个字节(又称为 "entry header")用于表示这个元素的长度以及编码方式。
    • zlend:一个字节,值为255,表示压缩列表的结束。

二、跳跃表(skiplist)

使用条件(只要有一个不满足上述ziplist条件就会切换到跳跃表)12 : 当ZSet存储的元素数量较多,或者元素的字符串长度较长时。

结构特点:

  • 在Redis的源代码中,跳跃表的结构定义如下2:
    • 有一个 zskiplist 结构体表示整个跳跃表:
      • header:指向跳跃表的表头节点,通过这个指针程序定位表头节点的时间复杂度是O(1)。
      • tail :指向跳跃表的表尾节点,通过这个指针程序定位表尾节点的时间复杂度为O(1)。
      • length:记录跳跃表的长度,就是跳跃表目前包含节点的数量(表头节点不算在内)。
      • level:记录在目前的跳跃表内,层数最大的那个节点的层数(表头节点的层数不计算在内)。
    • 跳跃表节点 zskiplistnode
      • obj:成员对象。
      • score:分值(用于排序)。
      • backward:后退指针,指向位于当前节点的前一个节点(程序从表尾向表头遍历时使用,每个节点只有一个后退指针 )。
      • level:是一个可变长数组结构(C99标准引入),里面包含:
        • forward:前进指针,用于访问位于表尾方向的其他节点。
        • span:这个层跨越的节点数量(记录前进指针所指向节点和当前节点的距离跨度越大、距离越远 )。

跳跃表通过维护多级索引来实现快速查找和高效的插入、删除、更新元素等操作2 。它的时间复杂度平均为O(log n) ,性能比较高。

在Redis中ZSet元素的存储和访问等操作过程中:

  • 当使用跳跃表时,元素的成员和分值等信息存储在跳跃表节点中,同时还有一个哈希表(在整个ZSet结构层面,不是跳跃表结构内部)用于快速通过成员查找其分值等操作2 。
  • 当使用压缩列表时,直接在压缩列表中操作元素和分值等数据。

JWT 是什么东西?

JWT(JSON Web Token)是一种用于在网络应用环境中进行安全信息传递的开放标准。

它由三部分组成:

头部(Header),通常包含令牌的类型和使用的加密算法;

载荷(Payload),包含声明,比如用户身份信息、权限等;

签名(Signature),用于验证消息的完整性和真实性,防止被篡改。

JWT 的主要优点是无状态,服务器不需要保存会话信息,减轻了服务器的存储负担。它常用于身份验证和授权,比如在单点登录、微服务架构等场景中。用户在登录成功后获取 JWT 令牌,后续的请求携带该令牌,服务器通过验证令牌的有效性来确认用户身份和权限。

协程了解吗?和线程对比

协程和线程是在编程中常见的概念,它们有一些明显的区别。

线程是操作系统层面的概念,由操作系统进行调度和管理。多个线程可以在同一进程中并发执行,它们共享进程的资源。线程的切换通常由操作系统控制,开销相对较大。 协程则是在用户态实现的轻量级线程。协程的切换由程序自身控制,不需要操作系统的干预,因此协程切换的开销通常比线程小得多。协程更适用于协作式的任务调度,多个协程可以在同一个线程中运行,通过主动让出控制权来实现任务的切换。

在资源消耗方面,线程由于需要操作系统进行管理和调度,会占用较多的系统资源,如内存等。而协程相对来说资源消耗较少。

在编程模型上,线程的并发模型相对较为复杂,需要处理线程安全、同步等问题。协程的编程模型通常更简单直观,更容易理解和实现复杂的逻辑控制。

一道算法题

找到具有最大和的连续子数组,并返回该子数组

编程题

用两个协程、两个channel循环打印1, 2

package main

import (
   "fmt"
   "sync"
)

func Print1(ch1 chan bool, ch2 chan bool, wg *sync.WaitGroup) {
   defer wg.Done()
   for {
      <-ch1
      fmt.Print("1")
      ch2 <- true
   }
}

func Print2(ch1 chan bool, ch2 chan bool, wg *sync.WaitGroup) {
   defer wg.Done()
   for {
      <-ch2
      fmt.Print("2")
      ch1 <- true
   }
}

func main() {
   var wg sync.WaitGroup
   ch1 := make(chan bool)
   ch2 := make(chan bool)

   wg.Add(2)
   go Print1(ch1, ch2, &wg)
   go Print2(ch1, ch2, &wg)

   ch1 <- true
   wg.Wait()
}

欢迎关注 ❤

我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。

没准能让你能刷到自己意向公司的最新面试题呢。

感兴趣的朋友们可以加我微信:wangzhongyang2024,备注:博客园面试群。

标签:面经,协程,贝壳,元素,列表,索引,线程,简单,节点
From: https://www.cnblogs.com/wangzhongyang/p/18346335

相关文章

  • Spring Security 简单使用教程
    SpringSecurity是一个强大的、安全性框架,用于保护Spring应用程序。本文将详细介绍如何在一个SpringBoot项目中使用SpringSecurity,从基础配置到自定义安全需求。创建SpringBoot项目首先,我们需要创建一个SpringBoot项目。可以通过SpringInitializr快速生......
  • c#12 实验特性Interceptor如何使用的一个简单但完整的示例
    一直有很多转载dotnet对Interceptor说明文档的,但鲜有说明Interceptor如何使用的,这里写一篇简单示例来展示一下c#12实验特性Interceptor是什么?官方解释如下(其实简单说就是语言特性中内置的静态编织方式的aop功能,不同于其他il修改代码的方式,使用上得结合sourcegenerater来生......
  • 一个小学生蒟蒻对简单排列组合的认知和了解
    一个小学生蒟蒻对简单排列组合的认知和了解呃呃呃呃呃....可能写的有点不咋好...呃呃呃神马是排列组合神马是排列组合呢?我感觉我也不太清楚排列组合是组合数学中的基础。排列就是指从给定个数的元素中取出指定个数的元素进行排序;组合则是指从给定个数的元素中仅仅取出指定个......
  • 一个蒟蒻对简单距离的简单理解
    一个蒟蒻对简单距离的简单理解:呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃,写的简单粗暴,如有不对的,欢迎纠正神马是距离?在数学中,距离是泛函分析中最基本的概念之一。它所定义的距离空间连接了拓扑空间与赋范线性空间等其他空间,是学习泛......
  • 英语简单句
    五种基本简单句: 陈述句疑问句祈使句感叹句简单句1疑问句1.1一般疑问句 概念: 用“yes”或“no”来回答的句子. 结构: [系动词be/助动词/情态动词主语谓语?]1.2特殊疑问句 概念: 以疑问词开头,对句中某一成分提问的句子叫特殊疑问句。常用的疑问词有:whatwhowhosewhi......
  • 关于简单的部分数学函数用python求导的示例
    1.求常数的导数题目代码1.求常数的导数:$f(x)=c$ 运行代码fromsympyimport*x,c=symbols('xc')c.diff(x)结果 2.求幂函数导数:题目代码2.求幂函数导数:$$f(x)=x^\mu$$运行代码fromsympyimport*x,mu=symbols('xmu')(x**mu).diff(x)结果  3.求三角......
  • 有效的括号(简单)
    有效的括号给定一个只包括‘(’,‘)’,‘{’,‘}’,‘[’,‘]’的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。示例1:输入:s=“()”输出:true示例2:输入......
  • WordPress 简单吗?
     是的,WordPress对于初学者来说非常简单易用。WordPress是一个开源的网站构建平台,专为简单性和用户友好性而设计,使其非常适合初学者和技术水平较低的用户。以下是几个使WordPress易于使用的原因:1.直观的用户界面:WordPress拥有一个干净且直观的界面,菜单和选项清晰易懂。......
  • 汇川EC总线伺服简单使用只要关注这几个参数就够了
    目录H02基本控制参数H03端子输入参数H04端子输出参数H09自调整参数这些参数都可以通过汇川的伺服调试软件,或者是伺服驱动器面板上的按键来进行设置H02基本控制参数H02-01绝对值系统选择根据当前系统选择是增量模式还是绝对值模式H02-02旋转方向选择选择......
  • 自注意力机制最简单的示例
    自注意力机制示例自注意力机制示例1.输入序列假设我们有一个简单的输入序列,包含三个词(向量表示),每个词的维度是4: x1x2x3x4词11010词20101词311112.查询(Q)、键(K)和值(V)矩阵我们定义查询、键和值的权重矩阵如下: QKV权重矩阵......