口试官:Redis中大Key怎么删除?

打印 上一主题 下一主题

主题 1761|帖子 1761|积分 5283

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
起首来看一下该岗位的职责和要求:
岗位职责


  • 负责公司旗下产物的全新需求开发
  • 负责公司中台系统管理系统开发
  • 开发暂时性工具和数据处理工作
  • 设计开发可复用模块,提高开发效率节流维护成本
  • 保质保量的完成上级领导安排的技术相关工作
任职要求


  • 本科以上学历,计算机相关专业优先,3年左右 Golang 开发经验,有 PHP 转 Go 项目经验者优先
  • 熟练把握 Golang/PHP 语言,熟悉至少一种 Golang 框架
  • 熟练把握关系型数据库 Mysql 及部分 Nosql
  • 熟练把握 Redis 缓存技术及 Rabbitmq 等常用消息队列
  • 熟悉 Svn/Git,熟悉 Shell,Python 等至少一种脚本语言
  • 基础扎实,对数据结构有较为深刻的明确
  • 具备良好的分析办理问题能力,能独立承担使命和有系统进度把控能力,留意效果导向
  • 良好的代码誊写、注释习惯,能写出高质量的代码,对自己开发的代码负责
口试问题



  • 自我介绍
  • 项目介绍
  • 八股
1. Redis 大key 删除

问题配景
在Redis中,删除大key(如大型哈希表、列表、集合或有序集合)时,直接使用DEL下令会导致Redis阻塞,影响性能。
办理方案


  • 使用UNLINK下令

    • UNLINK下令从Redis 4.0开始引入,它的工作原理是异步删除key。UNLINK下令会立即将key从数据库中删除,但现实的内存释放工作会在背景线程中进行,不会阻塞主线程。
    • 示例:
      1. UNLINK my_large_key
      复制代码

  • 分批删除

    • 使用SCAN、HSCAN、SSCAN、ZSCAN等下令分批删除大key中的元素,减少每次操作的负载。
    • 示例:
      1. SCAN 0 MATCH my_large_hash:* COUNT 100
      复制代码
      这个下令会返回100个匹配的key,然后你可以逐个删除这些key。

  • 选择在业务低峰期实行删除操作

    • 在业务低峰期实行删除操作,可以减少对正常业务的影响。
    • 例如,可以选择在夜间或周末进行大key的删除操作。

  • 使用RENAME下令

    • 先将大key重命名,使其不再被业务访问,然后再徐徐删除。
    • 示例:
      1. RENAME my_large_key my_large_key_to_delete
      2. DEL my_large_key_to_delete
      复制代码

2. MySQL 什么时间会回表

问题配景
在MySQL中,回表是指在查询过程中,如果索引不能完全覆盖查询所需的所有列,MySQL必要通过主键索引回表获取完整的行数据。
详细场景


  • 非覆盖索引:当查询条件命中了索引,但查询效果必要的列不在索引中时,MySQL必要回表获取这些列的数据。

    • 示例:
      1. SELECT name, age FROM users WHERE id = 1;
      复制代码
      如果id上有索引,但name和age不在索引中,MySQL必要回表获取name和age。

  • 非唯一索引:纵然查询条件能够唯一确定一行,但如果使用的是非唯一索引,MySQL也必要回表确认这一行是否满足查询条件。

    • 示例:
      1. SELECT * FROM users WHERE email = 'example@example.com';
      复制代码
      如果email上有非唯一索引,MySQL必要回表确认是否有多个用户具有相同的email。

  • 多表联接:在多表联接查询中,如果使用了非覆盖索引,MySQL大概必要回表获取额外的数据。

    • 示例:
      1. SELECT u.name, o.order_id FROM users u JOIN orders o ON u.id = o.user_id WHERE u.id = 1;
      复制代码
      如果users表的id上有索引,但name不在索引中,MySQL必要回表获取name。

3. MySQL explain type类型 ref 和 index的区别

问题配景
EXPLAIN下令用于表现MySQL怎样实行查询计划,其中type列表现了访问类型。
详细区别


  • ref

    • 表现使用了非唯一索引或唯一索引的一部分。
    • 对于每个索引值,MySQL必要进行一次查询,以找到符合条件的行。
    • 实用于等值查询(如=、IN、<=>)。
    • 示例:
      1. EXPLAIN SELECT * FROM users WHERE email = 'example@example.com';
      复制代码
      如果email上有索引,type列会表现为ref。

  • index

    • 表现全索引扫描,即MySQL会遍历整个索引来查找匹配的行。
    • 这通常用于索引覆盖查询,即查询的所有列都包含在索引中,无需回表。
    • 实用于范围查询(如>、<、BETWEEN、LIKE)。
    • 示例:
      1. EXPLAIN SELECT email FROM users ORDER BY email;
      复制代码
      如果email上有索引,type列会表现为index。

4. 对已经关闭的chan进行读写会怎么样?

问题配景
在Go语言中,channel是一种同步机制,用于在goroutine之间传递数据。
详细行为


  • 读取已关闭的channel

    • 从已关闭的channel读取数据时,会立即返回零值,并且关闭标志位会被设置,表明channel已经关闭。

  • 向已关闭的channel写入数据

    • 向已关闭的channel写入数据会触发panic,由于不允许向已关闭的channel写入数据。

5. 怎样包管多个goroutine的全部实行

问题配景
在Go语言中,goroutine是轻量级的线程,用于并发实利用命。确保多个goroutine全部实行完毕是常见的需求。
详细方法


  • 使用sync.WaitGroup

    • 在启动goroutine前增加WaitGroup的计数,goroutine完成后调用Done()方法减少计数,最后在主goroutine中调用Wait()等待所有goroutine完成。

  • 使用通道

    • 可以创建一个通道,每个goroutine完成使命后向通道发送一个信号,主goroutine吸收这些信号直到所有goroutine完成。

  • 使用上下文

    • 通过context管理goroutine的生命周期,可以取消或超时等待。

6. string 转bytes 是否会重新分配内存

问题配景
在Go语言中,字符串是不可变的,而字节切片是可变的。
详细行为


  • 转换过程

    • []byte(s)将字符串转换为字节切片时,通常不会重新分配内存,而是共享字符串的底层内存。
    • 例如:
      1. s := "hello"
      2. b := []byte(s)
      复制代码
      在这个例子中,b和s共享同一块内存。

  • 修改字节切片

    • 如果对字节切片进行了修改,会触发内存拷贝,由于字符串是不可变的。
    • 例如:
      1. s := "hello"
      2. b := []byte(s)
      3. b[0] = 'H' // 这会触发内存拷贝
      复制代码

7. goframe和gozero的区别

问题配景
goframe和gozero都是Go语言的开发框架,但它们有不同的设计理念和应用场景。
详细区别


  • goframe

    • 特点:企业级开发框架,提供了一整套的Web开发、数据库操作、缓存、日志等组件。
    • 实用场景:得当快速构建企业级应用,特别是必要复杂功能和高性能的应用。
    • 上风

      • 完善的文档和社区支持。
      • 提供丰富的中心件和插件。
      • 支持多种数据库和缓存系统。


  • gozero

    • 特点:轻量级的微服务框架,专注于微服务架构,提供了API天生器、服务注册与发现、配置中心等功能。
    • 实用场景:得当构建微服务应用,特别是必要高可扩展性和高可用性的应用。
    • 上风

      • 轻量级,启动速度快。
      • 内置了服务发现和配置管理功能。
      • 支持自动代码天生,提高开发效率。


8. 逃逸分析有哪些场景

问题配景
逃逸分析是编译器的一种优化技术,用于确定变量的作用域和生命周期,以决定变量是否可以在栈上分配,从而减少堆上的内存分配,提高程序性能。
详细场景


  • 全局变量

    • 作用域超出函数范围的变量。

  • 函数返回值

    • 如果函数返回了局部变量的引用或指针,该变量必要逃逸到堆上。

  • 闭包

    • 如果一个函数返回了一个闭包,而闭包引用了外部函数的局部变量,那么这些变量必要逃逸到堆上。
    • 例如:
      1. func createClosure() func() int {
      2.     x := 10
      3.     return func() int {
      4.         return x // x 逃逸到堆上
      5.     }
      6. }
      复制代码

  • 循环中的变量

    • 在循环中创建的变量,如果在循环外被引用,也会逃逸到堆上。

9. Kafka怎样实现有序

问题配景
Kafka是一个分布式流处理平台,用于构建及时数据管道和流应用。
详细实现


  • 分区

    • 每个主题可以被分别为多个分区,每个分区内的消息是有序的。
    • 生产者可以指定消息的分区键,确保相同键的消息被发送到同一个分区。

  • 单一消费者

    • 对于每个分区,如果有多个消费者订阅了同一个消费者组,那么每个分区的消息只会被一个消费者消费,确保了消息的次序。

  • 事务

    • Kafka支持事务,可以确保消息的生产者发送的消息按照发送次序被提交。

10. 项目中常用的设计模式

问题配景
设计模式是办理常见问题的模板,可以帮助开发者编写更高效、更可维护的代码。


  • 单例模式

    • 描述:确保一个类只有一个实例,并提供一个全局访问点。
    • 长处:节流资源,避免重复创建对象。
    • 缺点:单例对象通常是全局可访问的,容易引起耦合。

  • 工厂模式

    • 描述:提供一个创建对象的接口,但由子类决定实例化哪一个类。
    • 长处:将对象的创建和使用分离,提高代码的灵活性。
    • 缺点:增加了代码的复杂性。

  • 观察者模式

    • 描述:定义了对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到关照。
    • 长处:实现了对象之间的松耦合。
    • 缺点:如果观察者数量过多,关照过程大概会变得复杂。

  • 策略模式

    • 描述:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。
    • 长处:算法的变化独立于使用算法的客户。
    • 缺点:增加了代码的复杂性。

  • 装饰者模式

    • 描述:动态地给一个对象添加一些额外的职责,而不必修改对象结构。
    • 长处:增加了代码的灵活性和可扩展性。
    • 缺点:增加了代码的复杂性。

  • 代理模式

    • 描述:为其他对象提供一种代理以控制对这个对象的访问。
    • 长处:增加了安全性和灵活性。
    • 缺点:增加了代码的复杂性。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表