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

news/2024/11/12 19:42:27/文章来源:https://www.cnblogs.com/bkbk123/p/18538608

岗位职责
负责公司旗下产品的全新需求开发

负责公司中台系统管理系统开发

开发临时性工具和数据处理工作

设计开发可复用模块,提高开发效率节省维护成本

保质保量的完成上级领导安排的技术相关工作

任职要求
本科以上学历,计算机相关专业优先,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 从数据库中删除,但实际的内存释放工作会在后台线程中进行,不会阻塞主线程。

示例:

UNLINK my_large_key

分批删除:

使用SCAN、HSCAN、SSCAN、ZSCAN等命令分批删除大 key 中的元素,减少每次操作的负载。

示例:

SCAN 0 MATCH my_large_hash:* COUNT 100

这个命令会返回100个匹配的key,然后你可以逐个删除这些key。

选择在业务低峰期执行删除操作:

在业务低峰期执行删除操作,可以减少对正常业务的影响。

例如,可以选择在夜间或周末进行大 key 的删除操作。

使用RENAME命令:

先将大 key 重命名,使其不再被业务访问,然后再逐步删除。

示例:

RENAME my_large_key my_large_key_to_delete
DEL my_large_key_to_delete
  1. MySQL 什么时候会回表
    问题背景:在 MySQL 中,回表是指在查询过程中,如果索引不能完全覆盖查询所需的所有列,MySQL 需要通过主键索引回表获取完整的行数据。

具体场景:

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

示例:

SELECT name, age FROM users WHERE id = 1;

如果id上有索引,但nameage不在索引中,MySQL需要回表获取nameage

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

示例:

SELECT * FROM users WHERE email = 'example@example.com';

如果email上有非唯一索引,MySQL需要回表确认是否有多个用户具有相同的email

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

示例:

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

  1. MySQL explain type 类型 ref 和 index 的区别
    问题背景:EXPLAIN命令用于显示 MySQL 如何执行查询计划,其中type列显示了访问类型。

具体区别:

ref:

表示使用了非唯一索引或唯一索引的一部分。

对于每个索引值,MySQL 需要进行一次查询,以找到符合条件的行。

适用于等值查询(如=、IN、<=>)。

示例:

EXPLAIN SELECT * FROM users WHERE email = 'example@example.com';

如果email上有索引,type列会显示为ref

index:

表示全索引扫描,即 MySQL 会遍历整个索引来查找匹配的行。

这通常用于索引覆盖查询,即查询的所有列都包含在索引中,无需回表。

适用于范围查询(如>、<、BETWEEN、LIKE)。

示例:

EXPLAIN SELECT email FROM users ORDER BY email;

如果email上有索引,type列会显示为index

  1. 对已经关闭的 chan 进行读写会怎么样?
    问题背景:在 Go 语言中,channel 是一种同步机制,用于在 goroutine 之间传递数据。

具体行为:

读取已关闭的 channel:

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

向已关闭的 channel 写入数据:

向已关闭的 channel 写入数据会触发 panic,因为不允许向已关闭的 channel 写入数据。

  1. 如何保证多个 goroutine 的全部执行
    问题背景:在 Go 语言中,goroutine 是轻量级的线程,用于并发执行任务。确保多个 goroutine 全部执行完毕是常见的需求。

具体方法:

使用sync.WaitGroup :

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

使用通道:

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

使用上下文:

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

  1. string 转 bytes 是否会重新分配内存
    问题背景:在 Go 语言中,字符串是不可变的,而字节切片是可变的。

具体行为:

转换过程:

[]byte(s)将字符串转换为字节切片时,通常不会重新分配内存,而是共享字符串的底层内存。

例如:

s := "hello"
b := []byte(s)

在这个例子中,bs共享同一块内存。

修改字节切片:

如果对字节切片进行了修改,会触发内存拷贝,因为字符串是不可变的。

例如:

s := "hello"
b := []byte(s)
b[0] = 'H' // 这会触发内存拷贝
  1. goframe 和 gozero 的区别
    问题背景:goframe 和 gozero 都是 Go 语言的开发框架,但它们有不同的设计理念和应用场景。

具体区别:

goframe:

特点:企业级开发框架,提供了一整套的 Web 开发、数据库操作、缓存、日志等组件。

适用场景:适合快速构建企业级应用,特别是需要复杂功能和高性能的应用。

优势:

完善的文档和社区支持。

提供丰富的中间件和插件。

支持多种数据库和缓存系统。

gozero:

特点:轻量级的微服务框架,专注于微服务架构,提供了 API 生成器、服务注册与发现、配置中心等功能。

适用场景:适合构建微服务应用,特别是需要高可扩展性和高可用性的应用。

优势:

轻量级,启动速度快。

内置了服务发现和配置管理功能。

支持自动代码生成,提高开发效率。

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

具体场景:

全局变量:

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

函数返回值:

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

闭包:

如果一个函数返回了一个闭包,而闭包引用了外部函数的局部变量,那么这些变量需要逃逸到堆上。

例如:

func createClosure() func() int {x := 10return func() int {return x // x 逃逸到堆上}
}

循环中的变量:

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

  1. Kafka 如何实现有序
    问题背景:Kafka 是一个分布式流处理平台,用于构建实时数据管道和流应用。

具体实现:

分区:

每个主题可以被划分为多个分区,每个分区内的消息是有序的。

生产者可以指定消息的分区键,确保相同键的消息被发送到同一个分区。

单一消费者:

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

事务:

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

  1. 项目中常用的设计模式
    问题背景:设计模式是解决常见问题的模板,可以帮助开发者编写更高效、更可维护的代码。

单例模式:

描述:确保一个类只有一个实例,并提供一个全局访问点。

优点:节省资源,避免重复创建对象。

缺点:单例对象通常是全局可访问的,容易引起耦合。

工厂模式:

描述:提供一个创建对象的接口,但由子类决定实例化哪一个类。

优点:将对象的创建和使用分离,提高代码的灵活性。

缺点:增加了代码的复杂性。

观察者模式:

描述:定义了对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知。

优点:实现了对象之间的松耦合。

缺点:如果观察者数量过多,通知过程可能会变得复杂。

策略模式:

描述:定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。

优点:算法的变化独立于使用算法的客户。

缺点:增加了代码的复杂性。

装饰者模式:

描述:动态地给一个对象添加一些额外的职责,而不必修改对象结构。

优点:增加了代码的灵活性和可扩展性。

缺点:增加了代码的复杂性。
cqih.sxjnbw.com
cqih.sheanxf.com
cqih.fsyqd.com
cqih.ygjxjgc.com
cqih.cq-mba.com
cqih.boni168.com
cqih.kan-mei.com
cqih.gxqiangli.com
cqih.lzwgdn.com
cqih.gz-jianyou.com
cqih.zhongzhengja.com
cqih.cshszgyy.com
cqih.shengheyiyuan.com
cqih.ybgamer.com
cqih.hebeixinjinghua.com
cqih.hnlrst.com
cqih.gdrjzcgl.com
cqih.boyuanyiren.com
cqih.whxsdnhs.com
cqih.sdcehb.com
cqih.aisheng120.com
cqih.xiekur.com
cqih.wannianqngjanzhann.com
cqih.whxmlyyy.com
cqih.njcongchong.com
cqih.newpaint-tech.com
cqih.hyxxlx.com
cqih.kangjishengyuan.com
cqih.lidich.com
cqih.dianhaoguan.com
cqih.hczycb.com
cqih.mayunfuren.com
cqih.qianyanjs.com
cqih.punoche.com
cqih.daozhewang.com
cqih.yangzhie322.com
cqih.cdjycm.com
cqih.ltsshoes.com
cqih.mxksl.com
cqih.cdyhjj.com
cqih.zmndyy.com
cqih.cgglsb.com
cqih.china-epal.com
cqih.wxgbxt.com
cqih.cchhny.com
cqih.fmzddz.com
cqih.du-hopegbw.com
cqih.gzchanghe.com
cqih.lewzmy.com
cqih.nandunlv.com
代理模式:

描述:为其他对象提供一种代理以控制对这个对象的访问。

优点:增加了安全性和灵活性。

缺点:增加了代码的复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/830840.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js 构建命令行工具:实现 ls 命令的 -a 和 -l 选项

在日常的前端开发中,我们常常借助各种基于 Node.js 的脚手架工具来加速项目搭建和维护,比如 create-react-app 可以一键初始化一个 React 项目,eslint 则帮助我们保持代码的整洁和一致。而在公司内部,为了更好地满足特定业务的需求,我们往往会构建自己的脚手架工具,如自定…

法律行业内部知识库构建:重要性与实施步骤

这里是ai元启航,最近在学习ai相关知识,所以来分享一些这周学习的一些知识点,今天分享的是涉及法律行业的知识库搭建内容。 在当今信息爆炸的时代,法律行业面临着前所未有的挑战。法规的不断更新、案例的日益复杂以及客户需求的多样化,都要求法律从业者能够快速、准确地获取…

视野修炼第109期 | VSCode主题定制

① VS Code 主题定制生成 ② skellyCSS - 轻量级的CSS骨架屏方案 ③ npmpackage.info ④ create-vue 实现性集成 Oxlint ⑤ 英:从 URL 输入到页面渲染的过程 ⑥ 使用 JS 生成随机迷宫 ⑦ gounfaked - 免费的AI图片欢迎来到第 109 期的【视野修炼 - 技术周刊】,下面是本期的精…

网址封装(带苹果免签/安卓apk/苹果ipa)仿第八区H5APP封装打包分发系统源码

此封装系统可以无限封装,也可以给用户开后台让别人无限封装多个“苹果免签”文件 市面上一个苹果免签封装价格70到150rmb之间,自己拥有一个封装系统还是特别划算 分发网站功能如下: 1、苹果免签封装带绿标签名功能(可设置自己的域名显示) 免签封装时候任意网址/网页,不跳…

星际战甲 - 指挥官

001 || 青春无敌美少女头部数据衣服 002 || 御姐头部数据

2024.11.2(MyBatis)

MyBatis免除了几乎所有的jdbc代码以及设置参数和获取结果集的工作

黑马PM- B端产品-CRM产品模式

CRM行业概述CRM产品分类 部署方式行业匹配服务对象功能侧重

2024.11.10 鲜花

Triple 扩展Triple 扩展像神一样呐 愛のネタバレ 「別れ」っぽいな 人生のネタバレ 「死ぬ」っぽいな なにそれ意味深で かっこいいじゃん それっぽい単語集で踊ってんだ 失敬 とぅ とぅる とぅ とぅ とぅる “風” とぅ とぅる とぅ とぅ とぅる “風” とぅ とぅる とぅ とぅ…

Python decimal模块用法

decimal 模块:decimal意思为十进制,这个模块提供了十进制浮点运算支持1.可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。在Python中,将变量声明为 Decimal 类型通常用于需要高精度和小数运算的场合。Decimal 类型属于 decimal 模块,提…

使用Visual Studio Code 快速新建Net项目

前言最近,总是听大家说Visual Studio Code写后端代码非常好用,蓝后,就自己亲身体验了一下,还是很香的。正文1.首先需要安装Dotnet SDK,我这里安装的8.0版本,如下图:2.安装完DotNet SDK,就可以使用命令创建控制台应用了,如下图:3.新建的控制台应用如下图,有一丢丢的简…

20222402 2024-2025-1《网络与系统攻防技术》实验四实验报告

一、实验内容 本周学习内容 计算机病毒(Virus):通过感染文件(可执行文件、数据文件、电子邮件等)或磁盘引导扇区进行传播,一般需要宿主程序被执行或人为交互才能运行 蠕虫(Worm):一般为不需要宿主的单独文件,通过网络传播,自动复制通常无需人为交互便可感染传播 恶意移动代码…