10个常见的Redis面试"刁难"问题

2023-10-27

导读:在程序员面试过程中Redis相关的知识是常被问到的话题。作为一名在互联网技术行业打击过成百上千名的资深技术面试官,本文作者总结了面试过程中经常问到的问题。十分值得一读。

作者简介:钱文品(老钱),互联网分布式高并发技术十年老兵,目前任掌阅科技资深后端工程师。熟练使用 Java、Python、Golang 等多种计算机语言,开发过游戏,制作过网站,写过消息推送系统和MySQL 中间件,实现过开源的 ORM 框架、Web 框架、RPC 框架等

Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行各种刁难。作为一名在互联网技术行业打击过成百上千名【请允许我夸张一下】的资深技术面试官,看过了无数落寞的身影失望的离开,略感愧疚,故献上此文,希望各位读者以后面试势如破竹,永无失败!

Redis有哪些数据结构?

字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。

如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。

如果你说还玩过Redis Module,像BloomFilter,RedisSearch,Redis-ML,面试官得眼睛就开始发亮了。

使用过Redis分布式锁么,它是什么回事?

先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。

这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?

这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!对方这时会显露笑容,心里开始默念:摁,这小子还不错。

假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?

使用keys指令可以扫出指定模式的key列表。

对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?

这个时候你要回答redis关键的一个特性:redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。

使用过Redis做异步队列么,你是怎么用的?

一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。

如果对方追问可不可以不用sleep呢?list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来。

如果对方追问能不能生产一次消费多次呢?使用pub/sub主题订阅者模式,可以实现1:N的消息队列。

如果对方追问pub/sub有什么缺点?在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。

如果对方追问redis如何实现延时队列?我估计现在你很想把面试官一棒打死如果你手上有一根棒球棍的话,怎么问的这么详细。但是你很克制,然后神态自若的回答道:使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理。

到这里,面试官暗地里已经对你竖起了大拇指。但是他不知道的是此刻你却竖起了中指,在椅子背后。

如果有大量的key需要设置同一时间过期,一般需要注意什么?

如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。

Redis如何做持久化的?

bgsave做镜像全量持久化,aof做增量持久化。因为bgsave会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要aof来配合使用。在redis实例重启时,优先使用aof来恢复内存的状态,如果没有aof日志,就会使用rdb文件来恢复。

 

如果再问aof文件过大恢复时间过长怎么办?你告诉面试官,Redis会定期做aof重写,压缩aof文件日志大小。如果面试官不够满意,再拿出杀手锏答案,Redis4.0之后有了混合持久化的功能,将bgsave的全量和aof的增量做了融合处理,这样既保证了恢复的效率又兼顾了数据的安全性。这个功能甚至很多面试官都不知道,他们肯定会对你刮目相看。

 

如果对方追问那如果突然机器掉电会怎样?取决于aof日志sync属性的配置,如果不要求性能,在每条写指令时都sync一下磁盘,就不会丢失数据。但是在高性能的要求下每次都sync是不现实的,一般都使用定时sync,比如1s1次,这个时候最多就会丢失1s的数据。

Pipeline有什么好处,为什么要用pipeline?

可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是pipeline批次指令的数目。

Redis的同步机制了解么?

Redis可以使用主从同步,从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。

是否使用过Redis集群,集群的原理是什么?

Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。

Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。

 

相关阅读:

 

 

 

https://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=2653549993&idx=1&sn=27240c1aa611c352a487ecee8ded050b&chksm=813a6431b64ded27fd43bd07d5245b672a6e03e7b7d4482ccef58510d97dfadc39d82d257416&mpshare=1&scene=1&srcid=0724Qkekl9HISeiURBax38nH#rd

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10个常见的Redis面试"刁难"问题 的相关文章

  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • 使用Redis从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • 无法启动redis.service:单元redis-server.service被屏蔽

    我在 ubuntu 16 04 上安装了 Redis 服务器 但是当我尝试使用启动redis服务时 sudo systemctl start redis 我收到消息 Failed to start redis service Unit re
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • 为什么 Redis TimeSeries 不捕获聚合中的最后一个元素?

    我试图了解 Redis 的时间序列规则创建的工作原理 但我很困惑为什么 Redis 会忽略聚合中的最后一项 并想知道这是否是预期的行为 我在中创建了示例代码redis cli为了显示 127 0 0 1 6379 gt FLUSHALL O
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • 有没有办法用Lettuce自动发现Redis集群中新的集群节点IP

    我有一个Redis集群 3主3从 运行在一个库伯内斯簇 该集群通过Kubernetes 服务 Kube 服务 我将我的应用程序服务器连接到 Redis 集群 使用Kube 服务作为 URI 通过 Redis 的 Lettuce java 客
  • Spring Data JPA Redis:无法编写基于自定义方法的查询

    我已经使用 Redis 配置了 Spring Data JPA 并使用RedisRepositorieswith 提供了类似的方法find findAll 所有这些方法似乎都工作得很好 但我无法编写我的自定义方法 RedisEntity f
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • Spring Redis删除不删除key

    我正在尝试删除一个 Redis 键 但由于某种原因它没有删除 但也没有抛出异常 这是我要删除的代码 import com example service CustomerService import com example model Cu
  • 节点应用程序之间共享会话?

    我目前有两个独立的节点应用程序在两个不同的端口上运行 但共享相同的后端数据存储 我需要在两个应用程序之间共享用户会话 以便当用户通过一个应用程序登录时 他们的会话可用 并且他们似乎已登录到另一个应用程序 在本例中 它是一个面向公众的网站和一
  • 在 Spring 4 中干掉通用的 RedisTemplate

    我读到你可以拥有 Autowired从 Spring 4 开始泛型 这太棒了 我有一个摘要RedisService我想参加的课程 Autowired一个通用的 RestTemplate 如下所示 public abstract class
  • 如何配置Lettuce Redis集群异步连接池

    我正在配置我的生菜重新分配池 当我按照官方文档配置时 连接池无法正常初始化 无法获取连接 官方文档指出 RedisClusterClient clusterClient RedisClusterClient create RedisURI
  • 使用 Redis 中的键

    我是 Redis 和键值数据库的新手 你能告诉我如何在redis中正确实现这种关系方法吗 我有一个关系表 其中两个键对应一个值 master id slave id 价值 Example 主站 ID 从属ID 价值 1 1 值1 2 1 值
  • 无法使用 ASP.NET 会话状态提供程序连接到 Redis 服务器

    一段时间以来 我一直在尝试用 Redis 替换 ASP NET Session 多个小时与适用于 Redis 的 Microsoft ASP NET 会话状态提供程序 http blogs msdn com b webdev archive
  • 在 Rails 应用程序上将 HASH 保存到 Redis

    我刚刚开始使用 Redis 和 Rails 所以这可能是一个愚蠢的问题 我试图将哈希值保存到 Redis 服务器 但是当我检索它时 它只是一个字符串 IE hash field gt value field2 gt value2 redis
  • 使用通配符查找键

    我已经使用分号保存了数据 redis gt keys party 1 party congress president 2 party bjp president 3 party bjp 4 party sena 是否有任何命令可以列出所有
  • JedisPoolConfig 不可分配给 GenericObjectPoolConfig

    我有一个基于 Spring 的 Java Web 应用程序托管在 Heroku 上 我正在尝试使用 Redis 实现来利用 Spring 缓存抽象 当服务器启动时 我收到一条错误消息 Type redis clients jedis Jed
  • Microsoft.Extensions.Caching.Redis 选择与 db0 不同的数据库

    一个关于了解使用哪个redis数据库以及如何配置它的问题 我有一个默认值ASP NET Core Web 应用程序和默认配置的本地redis服务器 含15个数据库 通过包管理控制台我已经安装了 Install Package Microso

随机推荐

  • C++学习记录———容器的简单整理

    1 容器的概念 容器是用来批量存储数据的集合 数据元素可以是用户自定义类型 也可以是C 预定定义类型 容器类的对象自动申请和释放内存 无需new和delete操作 容器 顺序容器 和关联容器 顺序容器 元素之间是顺序关系 元素有固定的位置
  • LaTeX技巧1:加粗、斜体

    对一般字母加粗 mathbf 对希腊字母加粗 usepackage bm bm 斜体 emph
  • github项目自荐(django项目)

    这篇文章来介绍一下我的一个GitHub项目 如果对这个项目有什么建议或者这个项目有什么bug请大家在评论区或者在Github issues给我建议 谢谢 1 首先先上GitHub项目的链接 GitHub first coding djang
  • CPU如何知道当前运行的是操作系统还是一般应用软件

    CPU如何知道当前运行的是操作系统还是一般应用软件 有赖于处理器状态的标识
  • python_if练习2:猜拳游戏

    题目要求 1 从控制台输入你要出的拳 石头 1 剪刀 2 布 3 2 电脑随即出拳 3 比较胜负 脚本内容 import random 1 从控制台输入要出的拳 player int input 请输入您要出的拳 石头1 剪刀2 布3 2
  • 使用nwjs-builder-phoenix构建跨平台桌面应用程序

    原文地址 使用nwjs builder phoenix构建跨平台桌面应用程序 BIGTREE whwtree com NW js应用自动打包的两种方式 nwjs builder phoenix 推荐 nw builder 本文主要讲述使用n
  • Centos7.9安装k8s图文详解

    Kubernetes用两种部署方式 1 kubeadm Kubeadm是一个k8s部署工具 提供kubeadm inint和 kubeadm join 用于快速部署Kubenetes集群 2 二进制部署 从github下载二进制包 手动部署
  • 服务器硬盘指示灯的显示说明

    硬盘驱动器活动指示灯 绿色 硬盘驱动器状态指示灯 绿色和琥珀色 下表针对配置了RAID 阵列的HD 指示灯不同显示对应的状态说明 驱动器状态指示灯显示方式 仅适用于 RAID 状态 每秒呈绿色闪烁两次 正在识别驱动器或准备卸下 不亮 准备插
  • 【spring mvc】Spring MVC拦截器+注解方式实现防止表单重复提交

    方法很多 先转载下 后面一个个实验 获得最优方案 原理 在新建页面中Session保存token随机码 当保存时验证 通过后删除 当再次点击保存时由于服务器端的Session中已经不存在了 所有无法验证通过 1 新建注解 java view
  • 贪心算法解决最小集合覆盖问题

    AVL自平衡树 关键就是对于递归的每一步插入都要进行判断 而不是对于root节点进行判断 ac代码 include
  • Web 前端开发技术 ——html

    Web 前端开发技术 html 文章目录 Web 前端开发技术 html 一 html 文件结构 二 文本 三 图片 四 音频和视频 五 超链接 六 表单 七 列表 八 表格 九 语义标签 一 html 文件结构 html的所有标签为树型结
  • Mybatis-Plus代码自动生成器

    代码自动生成器 public class EasyCode public static void main String args 需要构建一个 代码自动生成器 对象 AutoGenerator mpg new AutoGenerator
  • Qt程序的发布

    QT相关技术问题 一 QT程序的发布 1 在程序中运行debug或者release 占用较少的内存 之后 复制release中的exe文件 放在新的文件夹中 比如 我的第一个QtAPP发布 2 部署环境设置 部署依赖 找到安装目录下的win
  • Lattice学习总结中……

    1 Lattice官网 http www latticesemi com 2 需要注册一下 sign in 按要求填写一下 3 注册完之后 在官网的首页 Products 下载Lattice的设计环境 ispLEVER classic 4
  • C++ STL --哈希表

    目录 1 unordered系列关联式容器 1 1 unordered map 1 1 1 unordered map的文档介绍 1 1 2 unordered map的接口说明 1 2 unordered set 1 3 在线OJ 2 底
  • java grid动态行合并,CSS Grid布局:合并单元格布局

    CSS Grid布局 网格单元格布局 一文中通过一些简单的实例介绍了如何给容器定义网格 并且怎么使用网格线或者网格区域来实现单元格这样的简单的布局 在文章结尾之处也提到过 这样的单元格如同表格一样 仅仅一个个独立的单元格是无法满足一些复杂的
  • nestjs 优秀的ORM框架sequelize操作数据库

    奉上最新代码 nestjs服务demo代码 gitee地址 github地址 nodejs的ORM sequelize 笔者在使用koa2开发后端服务的时候用的ORM框架是sequelize 觉得挺好用的 也做了分享 node从入门到放弃系
  • 安卓psp模拟器哪个好_更完美!安卓PSP模拟器PPSSPP 0.9.9发布

    PConline 资讯 最好的安卓PSP模拟器PPSSPP 0 9 9新版发布下载了 PPSSPP是最强的PSP模拟器 在PC 安卓和iOS上均有对应版本 笔者曾经简单介绍过PPSSPP安卓版的用法 详情可以点此查看PPSSPP教程 现在
  • HiveSQL:求累计访问量

    数据 userId visitDate visitCount u01 2017 1 21 5 u02 2017 1 23 6 u03 2017 1 22 8 u04 2017 1 20 3 u01 2017 1 23 6 u01 2017
  • 10个常见的Redis面试"刁难"问题

    导读 在程序员面试过程中Redis相关的知识是常被问到的话题 作为一名在互联网技术行业打击过成百上千名的资深技术面试官 本文作者总结了面试过程中经常问到的问题 十分值得一读 作者简介 钱文品 老钱 互联网分布式高并发技术十年老兵 目前任掌阅