【面试宝藏】Redis 常见面试题解析其二

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
全局流量管理 GTM,标准版 1个月
简介: Redis 高级面试题涵盖了哈希槽机制、集群的主从复制、数据丢失可能性、复制机制、最大节点数、数据库选择、连通性测试、事务操作、过期时间和内存优化等。Redis 使用哈希槽实现数据分布,主从复制保障高可用,异步复制可能导致写操作丢失。集群最大支持1000个节点,仅允许单数据库。可通过 `ping` 命令测试连接,使用 `EXPIRE` 设置过期时间,`MULTI/EXEC` 等进行事务处理。内存优化包括合理数据类型、设置过期时间及淘汰策略。Redis 可用作缓存、会话存储、排行榜等场景,使用 `SCAN` 查找特定前缀键,列表实现异步队列,分布式锁则通过 `SET` 命令和 Lua 脚本实现。

Redis 高级面试题解析

20. 说说 Redis 哈希槽的机制?

Redis 集群采用哈希槽(Hash Slot)机制来分布和管理数据。整个哈希空间被划分为 16384 个槽,每个键通过 CRC16 校验后取模映射到一个哈希槽。每个节点负责一部分哈希槽,从而实现数据分片和负载均衡。

21. Redis 集群的主从复制模型是怎样的?

Redis 集群中的每个主节点(Master)可以有多个从节点(Slave)。主节点负责写操作,从节点负责读操作和数据备份。当主节点失效时,从节点可以通过投票机制提升为主节点,保证高可用性。

22. Redis 集群会有写操作丢失吗?为什么?

Redis 集群在网络分区或多数主节点失效时可能会丢失写操作。因为 Redis 集群采用异步复制,写操作在传播到从节点前,主节点可能会失效,导致数据丢失。

23. Redis 集群之间是如何复制的?

Redis 集群中的主从节点间采用异步复制机制。主节点在处理写操作后,将变更通知从节点,从节点异步地接收和应用这些变更。

24. Redis 集群最大节点个数是多少?

Redis 集群最大支持 1000 个节点。

25. Redis 集群如何选择数据库?

Redis 集群仅支持单个数据库,即数据库索引为 0。因此,所有数据都存储在同一个数据库中,无法像单节点 Redis 那样选择不同的数据库。

26. 怎么测试 Redis 的连通性?

可以使用 ping 命令测试 Redis 服务器的连通性:

redis-cli ping

如果连接正常,服务器会返回 PONG

27. 怎么理解 Redis 事务?

Redis 事务是一组原子操作的集合。事务通过 MULTIEXECDISCARDWATCH 等命令实现。事务内的所有命令按顺序执行,不会被其他命令插入。

28. Redis 事务相关的命令有哪些?

  • MULTI:开始一个事务。
  • EXEC:执行事务中的所有命令。
  • DISCARD:放弃事务中的所有命令。
  • WATCH:监视一个或多个键,若在事务执行前这些键被修改,事务将被取消。

29. Redis Key 的过期时间和永久有效分别怎么设置?

  • 设置过期时间:使用 EXPIRE 命令,如设置 10 秒后过期:
    EXPIRE key 10
    
  • 设置永久有效:使用 PERSIST 命令取消键的过期时间:
    PERSIST key
    

30. Redis 如何做内存优化?

  • 合理使用数据类型:选择适合的数据结构存储数据。
  • 压缩数据:使用合适的编码方式减少内存占用。
  • 淘汰策略:配置合适的内存淘汰策略,如 LRU(最近最少使用)。
  • 过期策略:合理设置键的过期时间,及时清理无用数据。

31. Redis 回收进程如何工作的?

Redis 回收进程通过定期和惰性删除机制清理过期键。当内存使用达到阈值时,Redis 根据配置的淘汰策略删除部分键,以腾出空间。

32. 有哪些办法可以降低 Redis 的内存使用情况呢?

  • 使用合适的数据结构:例如使用哈希表存储小对象。
  • 压缩和编码:利用 Redis 内置的对象编码(如 ZIPLIST、INTSET)优化存储。
  • 设置过期时间:及时清理过期数据。
  • 数据拆分:将大对象拆分成小对象存储。

33. Redis 的内存用完了会发生什么?

当 Redis 内存用完时,会根据配置的淘汰策略删除部分键。如果没有配置淘汰策略,写操作将返回错误(OOM),无法插入新数据。

34. 一个 Redis 实例最多能存放多少的 KEYS?

Redis 理论上能存储的数据量取决于可用内存和操作系统的限制。实际中,内存是主要限制因素。64 位系统下,Redis 可以支持数十亿个键。

35. MySQL 里有 2000w 数据。Redis 中只存 20w 的数据,如何保证 Redis 中的数据都是热点数据?Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

可以通过以下方法保证 Redis 中存储热点数据:

  • 设置合理的过期时间:确保长时间不访问的数据自动过期。
  • 使用 LRU 淘汰策略:淘汰最近最少使用的数据,保持热点数据在内存中。

36. Redis 最适合的场景?

  • 缓存:提高数据访问速度,减轻数据库负载。
  • 会话存储:存储用户会话数据。
  • 排行榜/计数器:实现快速排序和计数功能。
  • 消息队列:实现发布/订阅和延迟队列等功能。
  • 实时分析:处理实时数据分析和统计。

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

可以使用 SCAN 命令配合模式匹配找出指定前缀的键:

SCAN 0 MATCH prefix* COUNT 1000

注意,SCAN 命令是增量式遍历,不会阻塞 Redis。

38. 如果有大量的 Key 需要设置同一时间过期。一般需要注意什么?

  • 避免过期时间扎堆:大批量键同时过期会造成 Redis 瞬时压力增大。
  • 分批设置过期时间:将过期时间分散开,减少压力。

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

可以使用 Redis 的列表(List)结构实现异步队列:

  • 生产者使用 LPUSH 将任务加入队列。
  • 消费者使用 BRPOP 从队列中取出任务。

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

Redis 分布式锁用于在分布式环境下控制资源访问。实现方法:

  • 使用 SET key value NX PX 设置锁,NX 确保键不存在时设置,PX 设置过期时间。
  • 释放锁时,确保释放的是自己加的锁,可以使用 Lua 脚本保证原子性。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7天前
|
存储 NoSQL MongoDB
MongoDB面试专题33道解析
大家好,我是 V 哥。今天为大家整理了 MongoDB 面试题,涵盖 NoSQL 数据库基础、MongoDB 的核心概念、集群与分片、备份恢复、性能优化等内容。这些题目和解答不仅适合面试准备,也是日常工作中深入理解 MongoDB 的宝贵资料。希望对大家有所帮助!
|
12天前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
1月前
|
存储 NoSQL Java
可能是最漂亮的Redis面试基础详解
我是南哥,相信对你通关面试、拿下Offer有所帮助。敲黑板:本文总结了Redis基础最常见的面试题!包含了Redis五大基本数据类型、Redis内存回收策略、Redis持久化等。相信大部分Redis初学者都会忽略掉一个重要的知识点,Redis其实是单线程模型。我们按直觉来看应该是多线程比单线程更快、处理能力更强才对,比如单线程一次只可以做一件事情,而多线程却可以同时做十件事情。但Redis却可以做到每秒万级别的处理能力,主要是基于以下原因:(1)Redis是基于内存操作的,Redis所有的数据库状态都保存在
可能是最漂亮的Redis面试基础详解
|
12天前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
45 1
|
24天前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
1月前
|
NoSQL 算法 Redis
Redis面试篇
Redis面试篇
34 5
|
1月前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
33 1
|
11天前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
11天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
29天前
|
缓存 NoSQL 算法
面试题:Redis如何实现分布式锁!
面试题:Redis如何实现分布式锁!

推荐镜像

更多
下一篇
无影云桌面