Code前端首页关于Code前端联系我们

什么是Redis? 50道Redis面试题(附答案)

terry 2年前 (2023-09-26) 阅读数 45 #数据库

1.什么是Redis?

Redis 基本上是一个 Key-Value 类型的内存数据库,就像 memcached 一样。将整个数据库加载到内存中进行操作,并通过异步操作定期将数据库数据保存到硬盘中。作为纯内存操作,Redis 具有出色的性能,每秒可以处理超过 100,000 次读写。它是最快的Key-Value DB。 Redis的卓越不仅仅在于它的性能。 Redis最大的吸引力在于它支持存储不同的数据结构。而且,单个值的最大限制是1GB,不像memcached只能保存1MB的数据。因此,很多有用的功能都可以借助Redis来实现。函数,比如使用它们的List来做一个双向链接的FIFO列表,实现一个轻量高效的消息队列服务,使用Set来做一个高效的标签系统等等。此外,Redis还可以设置过期时间。用于存储Key-Value,因此它也可以作为memcached的改进版本。 Redis的主要缺点是数据库容量受到物理内存的限制,无法高效地读写海量数据。因此,Redis适合的场景主要局限于高性能运算和较小数据量的计算。

2。 Redis有哪些数据结构?

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

如果你是Redis的高级用户,你还必须添加以下数据结构HyperLogLog、Geo和Pub/Sub。

如果你说你玩过 ​​BloomFilter、RedisSearch 和 Redis-ML 等 Redis 模块,面试官的眼睛就会开始发光。

3。 Redis相对于memcached有什么优势?

(1) 所有memcached值都是简单字符串。作为替代品,redis 支持更通用的数据类型

(2) redis 比 memcached 快得多

(3) redis 可以存储其数据

4。 Redis适合哪些场景?

(1),会话缓存(会话缓存)

(2),全页缓存(FPC)

(3),队列

❿♓❿♓(4),排名,发布/订阅

5。 Redis 有哪些数据删除策略?

noeviction:当达到内存限制并且客户端尝试执行会消耗更多内存的命令时返回错误消息(大多数写入命令,但 DEL 和少数例外)

allkeys-lru:尝试回收尽可能少的已用密钥 (LRU) 为新密钥腾出空间来添加信息。

易失性-lru:尝试回收最少使用的键(LRU),但仅回收过时集中的键,为新添加的数据腾出空间。

alkeys-random:回收随机密钥,为新添加的数据腾出空间。

易失性随机:轮换随机密钥,以便为新添加的数据留出空间,但仅限于陈旧的数据集。

易失性-ttl:从过时的密钥集中回收密钥,并优先考虑寿命 (TTL) 较短的密钥,为新添加的数据腾出空间。

6。你用过Redis分布式锁吗?它是什么?

首先使用 setnx 检查锁。拿到锁后,使用过期键为锁添加过期时间,这样您就不会忘记打开锁。

此时对方告诉你你的答案没问题,然后问如果在setnx之后、过期之前进程意外崩溃或者需要重启维护怎么办?

此时此刻我必须给出令人惊讶的反馈:哦,是的,这个锁永远不会被释放。那你就得挠挠头,假装想了一下,好像下面的结果是你自己主动的,然后回答:我记得set命令的参数很复杂。这样应该可以同时连接setnx和expipe。合并为一本用户手册!就在这时,对方笑了笑,开始在心里悄悄说道:按,这家伙还不错。

7。如果 Redis 中有 1 亿个键,并且 100,000 个键以固定的已知前缀开头,那么如何找到它们呢?

使用键盘命令扫描指定模式的按键列表。

8。继续问题7:如果这个redis为线上业务提供服务,使用keys命令会出现什么问题?

现在你需要回答redis最重要的特性之一:redis的单线程。键命令会阻塞线程一段时间,然后 Web 服务停止。命令完成之前,服务无法恢复。这时候就可以使用scan命令了。 scan命令可以无阻塞地提取指定模式的按键列表,但存在一定概率的重叠。在客户端只做一次,但是总的时间比直接使用要长。关键命令很长。

9。如果有大量的key需要同时设置过期,平时应该注意什么?

如果几个key的Expiration时间设置得太集中,Redis在过期时可能会出现短暂的延迟。一般来说,必须在时间上加上一个随机值来分配Expiration Time。

10。 Redis集群中如何处理大写键和热键?

11。 MySQL中有2000万条数据,但redis中只存储了20万条数据。如何保证redis数据是热数据?

当redis内存数据集大小增长到一定大小时,执行数据移除策略。

12。你用过Red作为异步队列吗?你是怎么用的?

通常链表结构用作队列,rpush 产生消息,lpop 消费消息。当lpop没有消息时,休眠一段时间,然后重试。如果对方问,我可以不睡觉了怎么办?列表中还有一个名为 blpop 的命令。如果没有消息,就会被阻塞,直到有消息到达。

如果对方问是否可以做一次多次食用怎么办?使用pub/sub主题的订阅者模型,可以实现1的消息队列。

如果对方问,pub/sub 有什么缺点?当消费者下线时,生成的消息就会丢失,所以需要使用rabbitmq这样专业的消息队列。

13。如果对方问,redis是如何实现延迟队列的?

现在你可能想把面试官打死。如果你手里拿着棒球棒,为什么还要问这么详细的问题呢?但你很克制,然后平静地回答:使用排序集,以时间戳为点,消息内容为key,调用zadd产生消息。消费者使用zrangebyscore命令获取N秒前的数据查询进行处理。

14。你说的是Redis哈希槽的概念吗?

Redis集群没有使用一致性压缩,而是实现了哈希区间的概念。一个Redis集群有16384个哈希槽。 CRC16 检查每个密钥并以 16384 为模确定要插入的槽。集群中的每个节点负责哈希运行的一部分。

15。 Redis中Pipeline有什么用?为什么要使用管子?

如果流水线执行的指令之间没有因果关系,那么几个IO周期的时间可以缩短为一个。使用redis benchmark进行压力测试时,可以观察到影响redis峰值QPS值的一个重要因素是管道中的批指令数量。

16。 Redis 和其他键值存储有什么区别?

Redis 具有更复杂的数据结构并为其提供原子操作。这是一条有别于其他数据库的演进路径。 Redis 数据类型基于基本数据结构,对程序员来说是透明的,无需额外的抽象。

Redis运行在内存中,但也可以存储在磁盘上,因此在对不同数据集进行快速读写时,必须权衡内存。数据量不得超过硬件内存。内存数据库的另一个优点是,与磁盘上同样复杂的数据结构相比,内存中的访问非常简单,因此Redis可以做很多内部复杂性很强的事情。另外,就圆盘形状而言,它们作为附件而设计紧凑,因为它们不需要偶尔使用。

17。 Redis和Redisson是什么关系?

Redisson是一款高级的分布式协调Redis客户端,可以帮助用户轻松实现分布式环境下的一些Java对象(Bloom filter、BitSet、Set、SetMultimap、ScoredSortedSet、SortedSet、Map、ConcurrentMap、List、ListMultimap)、阻塞、队列, 队列、Deque、BlockingDeque、信号量、Lock、ReadWriteLock、AtomicLong、CountDownLatch、发布/订阅、HyperLogLog)。

18。 Jedi和Redisson各有什么优缺点?

Jedis 是用 Java 实现的 Redis 客户端。其API对Redis命令提供了比较全面的支持; Redisson 实现了分布式且可扩展的 Java 数据结构。相比Jedi,它的功能更简单,而且不支持角色。字符串操作不支持排序、事件、滑块和分区等 Redis 功能。 Redisson的目的是促进用户关注点从Redis中分离出来,让用户可以更加专注于处理业务逻辑。

19。哪些客户端支持一致性哈希?

Redis-rb、Predis 等

20。什么是 Twemproxy?

Twemproxy 是 Twitter 维护的(缓存)代理系统,可协调 Memcached 的 ASCII 和 Redis 协议。它是一个用C语言编写的单线程程序,运行速度非常快。它是使用 Apache 2.0 许可证的开源软件。 Twemproxy 支持自动分区。如果其中一个Redis代理节点不可用,该节点会自动关闭(这会改变原来的key到实例的映射关系,所以在使用Redis作为缓存时应该只使用Twemproxy)。 Twemproxy 本身没有单一问题点,因为您可以启动多个 Twemproxy 实例,然后允许您的客户端连接到任何 Twemproxy 实例。 Twemproxy 是 Redis 客户端和服务器之间的中间层。处理配分函数不应该很复杂并且应该相对可靠。

21。如何理解Redis事务?

事务是单个离散操作:事务中的所有命令都被序列化并按顺序执行。事务执行时,不会被其他客户端发送的命令请求中断。

事件是一个核心操作:要么执行事件中的所有命令,要么都不执行。

22。 Redis 回收过程如何进行?

客户执行了新命令并添加了新信息。

Redi 检查内存使用情况。如果大于最大内存限制,则会按照设定的策略进行回收。

新命令将被执行等等。

因此,我们通过不断达到限制然后不断回收回到限制以下来不断突破内存限制。

如果命令的结果使用大量内存(例如将大集合的交集保存到新键),那么很快该内存就会超出内存限制。

23。 Redis回收使用什么算法?

LRU 算法。

24。 Redis如何添加大量数据?

Redis-cli 开始支持一种称为管道模式的新模式,用于执行大数据输入作业。

25。为什么需要Redis分区?

分区可以让Redis管理更大的内存,Redis可以使用所有机器的内存。没有分区,就只能使用一台机器的内存。分区使得仅仅通过增加计算机就可以使Redis的计算能力增加一倍,并且Redis网络的带宽也随着计算机和网卡数量的增加而增加一倍。

26。你知道Redis分区实现方案有哪些吗?

客户端分区意味着客户端已经决定数据存储在哪个redis节点或从哪个redis节点读取。大多数客户已经实施了客户端分区。

代理分区是指客户端向代理发送请求,之后代理决定去哪个节点写入或读取数据。 Agent根据分区规则决定请求哪些Redis实例,然后根据Redis响应结果返回给客户端。 Redis 和 memcached 代理实现是 Twemproxy

查询路由是指客户端随机请求任意一个 Redis 实例,然后 Redis 将请求转发到正确的 Redis 节点。Redis Cluster 实现了一种混合形式的查询路由,但它不是将请求直接从一个 Redis 节点转发到另一个 Redis 节点,而是使用客户端直接路由到正确的 Redis 节点。

27。 Redis 分区有哪些缺点?

一般不支持多个按键的功能。例如,你不能剪切两个集合,因为它们可以存储在不同的Redis实例中(实际上有一种方法可以解决这种情况,但不能直接使用剪切命令)。

如果同时使用多个key,则无法使用Redis事务。

分区使用的精度是关键,不能使用很长的排序键来存储数据集(分区的精度是关键,所以不可能用一个巨大的分片数据集) key,就像一个非常大的排序集)。例如,为了备份,您需要同时从不同的Redis实例和主机收集RDB/AOF文件。

分区过程中的动态膨胀或收缩可能非常复杂。 Redis集群在运行时添加或删除Redis节点,可以实现对用户尽可能透明的数据平衡。但是,其他一些客户端分区或代理分区方法不支持此功能。不过,有一种预分解技术也可以更好地解决这个问题。

28。为什么Redis需要将所有数据放在内存中?

为了达到最快的读写速度,Redis将所有数据读入内存并将数据异步写入磁盘。所以redis具有速度快、数据持久化的特点。如果数据不存储在内存中,磁盘I/O速度会严重影响redis的性能。在内存越来越便宜的今天,redis也越来越受欢迎。如果设置了内存限制,现有记录数达到内存限制后就无法添加新值。

29。 Redis的内存使用情况是多少?

举个例子:100万个键值对(键是0-999999,值是字符串“hello world”)在我的32位Mac上使用100兆字节。将相同的数据添加到密钥仅需要 16 MB。这是因为键值的上限很大。在性能方面,Memcached 也有类似的结果,但开销略低于 Redis,因为 Redis 存储了类型信息、引用计数等。当然,对于大型键值对来说,两者的关系要好得多。

30。有哪些方法可以减少 Redis 内存使用?

如果你使用的是32位Redis实例,你可以利用Hash、list、sorted set、array等集合类型数据,因为通常很多小的Key-Value密钥文件可以一起存储在更紧凑的方式。

31。当 Redis 内存不足时会发生什么?

如果达到设定的上限,Redis写命令会返回错误信息(但读命令仍然可以正常返回。)或者可以使用配置清除机制作为Redis缓存。当 Redis 达到其内存限制时,旧的内存将被刷新。内容。

32。 Redis如何优化内存?

尽可能使用密封剂。哈希表(即哈希表中存储的量很小)使用的内存非常少,因此您应该尽可能将数据模型抽象为哈希表。例如,如果您的网络系统有一个用户对象,则不要为用户的名字、姓氏、电子邮件地址和密码设置单独的密钥。相反,您应该将所有用户信息存储在哈希表中。

33。 Redis是如何实现持久化的?

bgsave 保持图像的完全持久化,aof 做渐进式持久化。由于bgsave耗时较长,实时性不够,而且关机时会造成大量数据丢失,所以必须与aof配合使用。当redis实例重启时,使用bgsave持久化文件构建内存,然后使用aof文件重复最新的操作,以完全恢复重启前的状态。

对方问机器突然断电怎么办?根据aof日志同步属性的配置,如果对性能要求不高,每次写命令都会同步磁盘,不会丢失数据。然而,在性能要求较高的情况下,每次都同步是不现实的。通常使用定时同步,例如每秒一次。目前,数据丢失最多 1 秒。

34。还有一方问bgsave的原理是什么?

就说两个字,叉子和牛。 fork表示redis通过创建子进程来执行bgsave操作,cow表示copy on write。子进程一旦创建,父子进程共享数据段,父进程继续提供读写服务。写入脏页的数据逐渐脱离子进程。快点。

35。 Redis提供了哪些持久化方法?

RDB 持久化模式可以按特定时间间隔保存数据快照。

AOF持久化将每个写操作保存到服务器中,并且当服务器重新启动时重新执行这些命令以恢复原始数据,AOF命令使用redis协议将每个写操作追加到文件末尾。 。 Redis还可以在后台重写AOF文件,使AOF文件的大小不会太大。

如果你只是希望数据在服务器运行时存在并且不需要使用任何持久化方法。

您还可以同时启用两种持久性方法。这样的话,再次重启时,会先加载AOF文件。恢复原始数据,因为正常情况下,AOF文件保存的数据集比RDB文件保存的数据集更完整。

最重要的是要了解RDB和AOF持久化方式的区别。让我们从使用 RDB 持久化如何开始。

36。如何选择合适的持久化方式?

一般来说,如果你想实现与PostgreSQL相当的安全性,你应该同时使用这两种持久化特性。如果您非常关心数据,但仍然可以承受在几分钟内丢失数据的损失,则可以使用 RDB 持久性。

很多用户只使用AOF持久化,但不推荐这种方法:因为定期创建RDB快照对于数据库备份非常方便,而且数据集的RDB恢复速度也比AOF恢复快。迅速地。另外,使用RDB还可以避免前面提到的AOF程序的缺点。

37。 Redis 是单线程的。如何提高多核处理器的利用率?

您可以将多个Redis实例部署到同一台服务器上,并将它们用作不同的服务器。然而,在某些时候一台服务器是不够的,所以如果你想使用多个CPU,你可以考虑分片。

38。常见的Redis性能问题及解决方案?

(1)Master最好不要做RDB内存快照、AOF日志文件之类的连续工作

(2)如果数据重要,Slave启用AOF备份数据,策略设置为每秒同步一次

(3)为了主从复制速度和连接稳定性,主从最好在同一个局域网

(4)尽量避免在高亮库的主库中添加从库

( 5)不要使用图结构进行主从复制。采用单向链表结构比较稳定,即:Master >- Slave1 >- Slave2 >- Slave3...

这种结构方便解决单点故障问题,实现替换从主人的奴隶。如果master挂了,可以立即启用Slave1作为master,其他一切不变。

39。更改设置是否会在不重新启动Redis的情况下实时生效?

正在运行的实例有许多配置选项,可以使用 CONFIG SET 命令进行修改,而无需重新启动。从 Redis 2.2 开始,可以从 AOF 切换到 RDB 快照持久化或其他方式,而无需重新启动 Redis。检索 CONFIG GET * 命令以获取更多信息。

但有时需要重新启动,例如将Redis更新到新版本或需要更改CONFIG命令当前不支持的某些配置参数时。

40。你了解Redis同步机制吗?

Redis可以使用主从同步和从从同步。第一次同步时,主机节点执行bgsave函数,将后续的编辑操作保存在内存缓冲区中。完成后,整个RDB文件同步到副本节点。副本节点接受数据后,会将 RDB 映像加载到内存中。下载完成后,提示主节点将会话期间修改的活动记录同步到副本节点进行回放,同步过程完成。

41。你用过Redis集群吗?集群原理是什么?

Redis Sentinal 专注于高可用性。当master宕机时,它会自动接替作为slave的master并继续提供服务。

Redis Cluster 专注于扩展。当单个redis内存不够时,采用分片的方式使用集群。

42。 Redis集群解决方案应该做什么?有什么计划?

,大体概念就是类似代理方式,用法和常规redis没有什么区别。在其下配置多个redis实例后,使用时连接twemproxy而不是连接它。它作为代理接收请求,并使用一致的哈希算法将请求转发到特定的redis系统,并将结果返回给twemproxy。使用方便(相比redis,只需要修改连接端口),是扩展遗留项目的首选。问题:由于Twemproxy自身单口实例的压力,使用一致性哈希系统后,当redis节点数量变化时,计算值发生变化,数据无法自动传输到新节点。目前最常用的集群解决方案

基本上与twemproxy效果相同,但支持在节点数量变化时将旧节点数据恢复到新的哈希节点。

3。 Redis cluster3.0自带的集群特点是它的分布式算法,不是一致的hash值,而是compaction间隔的概念以及本身对slave节点的节点设置的支持。请参阅官方文档以获取更多信息。

4。在业务代码层实现,创建多个不相关的redis实例。在代码层,对key进行哈希计算,然后使用对应redis实例中的数据。这种方法对哈希层代码的要求比较高。需要考虑的选项包括节点故障后的替代算法解决方案、数据冲击后的自动脚本恢复、实例监控等。

43。 Redis集群方案在什么情况下会导致整个集群不可用?

在 A、B、C 三个节点的集群中,在没有复制模型的情况下,如果 B 节点出现故障,整个集群都会认为它缺少 5501 到 11000 之间的槽位,不可用。

44。 Redis集群的主从复制模型是什么?

为了在部分节点故障或大多数节点无法通信时保持集群可用,集群采用主从复制模型,每个节点有 N-1 个副本。

44、Redis集群方案有什么区别,优缺点是什么?

主从复制Setinal Cluster

45.写操作是否到Redis集群?为什么?

Redis 不保证数据的强一致性,这意味着在实际应用中,集群在某些情况下可能会丢失写操作。

46。 Redis集群是如何复制的?

异步复制

47。 Redis集群的最大节点数是多少?

16384。

48。 Redis 实例最多可以存储多少个键? List、Set 和 Sorted Set 最多可以存储多少个元素?

理论上Redis最多可以处理232个key,并且经过了实践的检验。每个实例至少存储 2.5 亿个密钥。我们将测试一些更高的值。

任何列表、数组和排序数组都可以容纳 232 个元素。

也就是说,Redis存储限制是系统中可用内存的值。

49。如何扩展Redis持久数据和缓存?

如果使用Redis作为缓存,则使用一致性压缩来实现动态扩缩容。

如果使用Redis作为持久化存储,key和节点之间必须采用固定的比例,并且配置后节点数量不能改变。否则(即当Redis节点需要动态改变时),你需要使用一个可以在运行时重新平衡数据的系统,目前只有Redis集群可以做到这一点。

50。当规模增大时,分布式Redis应该早做还是晚做?为什么?

由于Redis非常轻量(一个实例仅使用1M内存),因此防止未来扩展的最好方法就是从头开始启动多个实例。即使您只有一台服务器,您也可以从一开始就通过使用分区在同一服务器上启动多个实例来以分散的方式使用 Redis。

一开始,多配置几个Redis实例,比如32个或64个。这对于大多数用户来说可能不方便,但从长远来看这是值得的。

在这种情况下,当你的数据不断增长,需要更多的Redis服务器时,你所需要做的就是将Redis实例从服务移至另一台服务器(不管重新分区)。当您添加另一台服务器时,您需要将一半的​​ Redis 实例从第一台计算机移动到第二台计算机。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门