Redis 面试问题有哪些?

分类:编程技术 时间:2024-02-20 15:24 浏览:0 评论:0
0
本文和大家分享一下Redis面试题有哪些。小编觉得还是比较实用的,所以分享给大家,作为参考。下面就跟随小编来看看吧。

Redis面试题


1.什么是Redis?

Redis完全开源免费,遵守BSD协议,是一个高性能的键值数据库。

Redis与其他键值缓存产品具有以下三个特点:

(1)Redis支持数据持久化,可以将内存中的数据保存到磁盘上,重启后可以再次加载以供使用。使用。

(2)Redis不仅支持简单的key-value类型数据,还提供list、set、zset、hash等数据结构的存储。

(3)Redis支持数据备份,即主从模式的数据备份。

【相关推荐:Redis视频教程】

Redis优势

(1)极高的性能——Redis可以达到11万次/秒的读取速度,写入速度为110,000次/秒。速度为81000次/秒。

(2) 丰富的数据类型——Redis 支持二进制情况下的字符串、列表、哈希、集合和有序集数据类型操作。

(3)原子性——Redis的所有操作都是原子性的,这意味着它们要么执行成功,要么根本不执行。各个操作都是原子的。多个操作还支持事务,即原子性,由 MULTI 和 EXEC 指令包装。

(4)丰富的功能——Redis还支持发布/订阅、通知、密钥过期等功能。

Redis 与其他键值存储有何不同?

(1) Redis 的数据结构更加复杂,并且提供了对其的原子操作。这是一条不同于其他数据库的进化路径。 Redis的数据类型基于基本数据结构,对程序员来说是透明的,不需要额外的抽象。

(2)Redis运行在内存中,但可以持久化到磁盘,所以内存不足对不同数据集进行高速读写时要权衡,因为数据量不能大于硬件内存。内存数据库的另一个优点是,与磁盘上同样复杂的数据结构相比,它们在内存中的操作非常简单,因此 Redis 可以做很多内部复杂性很高的事情。此外,就磁盘格式而言,它们是紧凑的附加生成的,因为它们不需要随机访问。

2. Redis有哪些数据类型?

答:Redis支持五种数据类型:字符串(string)、散列(hash)、列表(list)、集合(set)和zsetsorted set:有序集)。

我们实际项目中比较常用的是string和hash。如果您是Redis高级用户,还需要添加以下数据结构:HyperLogLog、Geo和Pub/Sub。

如果你说你玩过Redis Module,比如BloomFilter、RedisSearch、Redis-ML,面试官的眼睛是生病开始发光。

3.使用Redis有什么好处?

(1)速度快,因为数据存储在内存中,类似于HashMap。 HashMap的优点是查找和操作的时间复杂度为O1)

(2)支持丰富的数据类型,支持string、list、set、Zset、hash等。

(3)支持事务,操作是原子的。所谓原子性,就是对数据的所有改变都被执行。或者全部不执行

(4) 功能丰富:可用于缓存、消息传递、按键设置过期时间,过期后自动删除

4. Redis相关相对于Memcached有什么优势?

(1)Memcached中的所有值都是简单的字符串,而redis作为其替代品,支持更丰富的数据类型

(2)Redis速度要快得多比Memcached

(3)Redis可以持久化其数据

5. Memcache 和 Redis 有什么区别?

(1)存储方式Memecache将所有数据存储在内存中。断电后会挂断。数据不能超过内存大小。 Redis部分存储在硬盘上,保证了数据的持久化。

(2)数据支持类型 Memcache支持比较简单的数据类型。 Redis 具有复杂的数据类型。

(3)使用的底层模型不同,它们之间的底层实现方法以及与客户端的通信方式不同。应用协议不同。 Redis直接构建了自己的VM机制,因为如果一般系统调用系统函数,会浪费一定的时间进行移动和请求。

6。 Redis是单进程、单线程的吗?

答:Redis是单进程、单线程。 Redis利用队列技术将并发访问转变为串行访问,消除了传统数据库串行控制的开销。

7. s的最大容量是多少tring类型的值可以存储吗?

答案:512M

8。 Redis的持久化机制是怎样的?各自的优点和缺点是什么?

Redis提供了两种持久化机制:RDB和AOF机制:

1. RDBRedis DataBase)持久化方式:

指使用数据集快照模式(半持久化模式)记录redis数据库的所有键值对,并在某个时刻将数据写入到临时文件中时间。持久化完成后,用这个临时文件来替换上次持久化的文件,实现数据恢复。

优点:

(1)只有一个文件dump.rdb,方便持久化。

(2)容灾性好,可以将文件保存到安全的磁盘上。

(3)为了最大化性能,fork子进程完成写操作,让主进程继续处理命令,这样IO最大化。使用单独的子进程进行持久化(4)当数据集较大时,启动效率比AOF高。

缺点:

数据安全性低。 RDB 会每隔一段时间进行持久化。如果redis在持久化之间出现故障,就会发生数据丢失。因此,当数据要求不严格时,该方法更适合

2。 AOFAppend-only文件)持久化方式:

指所有命令行记录使用redis命令请求协议格式完全持久化存储)保存为aof文件。

优点:

(1)数据安全,aof持久化可以配置appendfsync属性,用always,每个命令操作都会记录到aof文件中。

(2)通过append方式写入文件。即使服务器中途宕机,也可以使用redis-check-aof工具来解决数据一致性问题。

(3)AOF机制模式的重写。在 AOF 文件被 rew 之前ritten(文件过大时命令会合并重写),可以删除部分命令(如误删除flushall))

缺点:

(1) AOF 文件比 RDB 文件大,恢复速度较慢。

(2)当数据集较大时,启动效率低于rdb。

9. Redis常见性能问题及解决方案:

(1)Master最好不要写内存快照。如果Master写入内存快照,使用save命令调度rdbSave函数会阻塞主线程的工作。当快照比较大时,对性能的影响会很大,服务会间歇性挂起

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

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

< p>(4) 尽量避免在压力较大的主库上添加从库

(5)不要使用图结构进行主从复制。采用单向链表结构更加稳定,即:Master <- Slave1 <- Slave2 < - Slave3...这种结构有利于解决单点故障问题,实现Slave替代Master 。如果Master挂了,可以立即启用Slave1作为Master,其他不变。

10。 redis过期key的删除策略是什么?

(1)定时删除:在设置key的过期时间的同时,创建一个定时器(timer)。让定时器在key的过期时间到来时立即删除该key。操作。

(2)惰性删除:让密钥过期,但每次从密钥空间获取密钥时,检查获取的密钥是否已过期。如果已经过期,则删除该密钥;如果没有过期,只需返回密钥即可。

(3)定期删除:每隔一段时间,程序检查数据库并删除过期的密钥。由算法决定要删除多少个过期密钥以及要检查多少个数据库。

11. Redis回收策略(淘汰策略)?

volatile-lru:从设置了过期时间的数据集中(server.db[i].expires)中选择最近最少使用的数据进行淘汰

易失性-ttl:从设置了过期时间(server.db[i].expires)的数据集中剔除即将过期的数据

易失性-随机:选择任意数据集(server.db[i].expires)中要删除的数据,且设置了过期时间

allkeys-lru:从数据集(server.db[i].expires)中选择最近最少使用的数据。 dict)消除

allkeys-random:从数据集中(server.db[i].dict))

no-enviction(逐出):禁止逐出数据

注意,这里的6个机制,volatile和allkeys规定过期时间有been set for data 无论是从一个集合中消除数据,还是从所有数据集中消除数据,下面的lru、ttl和random是三种不同的消除策略,加上永不回收的no-enviction策略。

使用策略规则:

(1)如果数据呈现幂律分布,即有的数据访问频率高,有的数据访问频率低,则使用allkeys- lru

(2)如果数据分布均匀,即所有数据访问频率相同,则使用allkeys-random

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

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

13.你了解Redis的同步机制吗?

答:Redis可以使用主从同步和从从同步。第一次同步时,主节点会执行一次bgsave,并将后续的修改操作记录到内存缓冲区中。完成后,整个rdb文件将同步到副本节点。副本节点接受数据后,会将rdb镜像加载到内存中。加载完成后,通知主节点将期间修改的操作记录同步到副本节点进行重放,同步过程完成。

14.管道有什么好处?为什么要使用管道?

答:可以将多次IO往返的时间减少到一次,pr假设管道执行的指令之间不存在因果关系。使用redis-benchmark进行压力测试时,可以发现影响redis的QPS峰值的一个重要因素是流水线批量指令的数量。

15。你用过Redis集群吗?聚类的原理是什么?

(1)Redis Sentinal注重高可用性。当master宕机后,会自动将slave提升为master并继续提供服务。

(2)Redis Cluster注重可扩展性。当单个redis内存不足时,采用Cluster进行分片存储。

16. Redis集群方案什么情况下会导致整个集群不可用?

答:在A、B、C三个节点的集群中,如果没有复制模型,如果B节点故障,整个集群会认为5501-11000丢失。范围插槽不可用。

17. Redis支持哪些Java客户端?官方推荐哪一款?

答:Redisson、Jedis、Lettuce等,官方推荐使用Redisson。

18. Jedis和Redisson各有什么优缺点?

答:Jedis是Redis的Java实现的客户端,其API对Redis命令提供了比较全面的支持; Redisson 实现了分布式、可扩展的 Java 数据结构,与 Jedis 相比,功能相对简单,并且不支持字符串操作、排序、事务、管道、分区等 Redis 功能。

Redisson的目的是促进用户的关注点与Redis的分离,让用户可以更加专注于处理业务逻辑。

19.如何在Redis中设置密码和验证密码?

设置密码:config set requirepass 123456

授权密码:auth 123456

20。谈谈Redis哈希槽的概念?

答:Redis集群并没有使用一致性哈希,而是引入了哈希槽的概念。 Redis集群有16384个哈希槽。每个密钥都会通过 CRC16 校验和模 16384 来确定放置哪个槽。集群中的每个节点负责一部分哈希槽。

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

答:为了在部分节点故障或者大部分节点无法通信时集群仍然可用,集群采用主从复制模型。每个节点将有 N-1 复制。

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

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

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

答案:异步复制

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

答案:16,384。

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

解答:Redis集群当前无法选择数据库,默认为数据库0。

26。如何测试Redis的连通性?

答:使用ping命令。

27.如何理解Redis事务?

答案:

(1) 事务是单个孤立的操作:事务中的所有命令都会被序列化并按顺序执行。事务执行过程中,不会被其他客户端发送的命令请求打断。

(2)事务是一个原子操作:要么执行事务中的所有命令,要么都不执行。

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

答案:MULTI、EXEC、DISCARD、WATCH

29。如何分别设置Redis key的过期时间和永久有效?

答案:EXPIRE 和 PERSIST 命令。

30。 Redis如何优化内存?

答:尽可能使用散列(hashes),哈希表(就是说哈希表中存储的数字很小)并且使用的内存很小,所以你应尽可能将数据模型抽象为哈希表。例如,如果您的 Web 系统中有一个用户对象,则不要为该用户的姓名、电子邮件和密码设置单独的密钥。相反,将所有用户信息存储在哈希表中。

31. Redis 回收过程如何进行?

答案:客户端运行了新命令并添加了新数据。 Redi 检查内存使用情况。如果大于maxmemory限制,则会按照设定的策略进行回收。执行一个新命令,等等。所以我们不断地跨越内存限制的边界不断地到达边界,然后不断地循环回到边界以下。如果命令的结果导致使用大量内存(例如将大集合的交集保存到新键),则此内存使用量很快就会超出内存限制。

32.有哪些方法可以减少Redis的内存占用?

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

33.当 Redis 内存不足时会发生什么?

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

34。一个Redis实例最多可以存储多少个key? List、Set、Sorted Set 最多可以存储多少个元素?

答:理论上,Redis最多可以处理232个key,在实际测试中,每个实例至少存储2.5亿个key。我们正在测试一些更大的值。任何列表、集合和排序集合都可以容纳 232 个元素。换句话说,Redis的存储限制是系统可用的内存量。

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

答:当Redis内存数据集大小增大到一定大小时,就会执行数据淘汰策略。

相关知识:Redis提供了6种数据淘汰策略:

volatile-lru:选择最近设置了过期时间的数据集(server.db[i].expires)淘汰掉最少使用的数据

易失性-ttl:选择已设置过期时间的数据集(server.db[i].expires)中即将过期的数据

volatile-random:从数据集(server.db[i])中随机选择数据进行淘汰.expires),设置过期时间

allkeys-lru:从数据集中(server.db[i].dict)中选择最近最少使用的数据进行淘汰

allkeys-random :从数据集(server.db[i].dict)中选择任意数据进行淘汰

no-enviction(逐出):禁止逐出数据

36. Redis最适合什么场景?

1.会话缓存(Session Cache)

使用Redis最常用的场景之一就是会话缓存(session cache)。与 Memcached 等其他存储相比,使用 Redis 缓存会话的优势在于 Redis 提供持久性。当维护一个不严格要求一致性的缓存时,如果用户的所有购物车信息都丢失了,大多数人都会不高兴。现在,他们还会这样吗?幸运的是,正如雷迪多年来,Redis 已经有所改进,很容易弄清楚如何正确使用 Redis 来缓存会话文档。就连著名的商业平台Magento也提供了Redis的插件。

2.全页缓存(FPC)

除了基本的会话令牌之外,Redis还提供了一个非常简单的FPC平台。回到一致性问题,即使Redis实例重启,用户也不会因为磁盘持久化而看到页面加载速度的下降。这是一个很大的改进,类似于PHP本地FPC。再次以Magento为例,Magento提供了一个插件来使用Redis作为全页缓存后端。另外,对于WordPress用户来说,Pantheon有一个非常好的插件wp-redis,它可以帮助你以最快的速度加载你浏览过的页面。

3.队列

Reids在内存存储引擎领域的一大优势就是它提供了列表和集合操作,这使得Redis成为一个很好的消息队列平台。 Redis作为队列使用的操作e类似于本地编程语言(例如Python)对列表的push/pop操作。如果你在Google中快速搜索“Redis队列”,你会立即发现大量的开源项目。这些项目的目的是利用Redis创建非常好的后端工具来满足各种队列需求。例如,Celery 有一个使用 Redis 作为代理的后端。您可以从这里查看。

4.排名列表/计数器

Redis很好地实现了内存中数字递增或递减的操作。集合和有序集合也使我们执行这些操作变得非常简单。 Redis仅仅提供了这两种数据结构。因此,要从排序集中获取前 10 位用户 - 让我们将它们称为“user_scores”,我们就这样做:当然,这假设您正在根据用户的分数进行递增排序。如果要返回用户和用户的分数,需要这样执行: ZRANGE user_scores 0 10WITHSCORES Agora Games 就是一个很好的例子,用 Ruby 实现,它的排名使用 Redis 来存储数据,你可以在这里看到。

5.发布/订阅

最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅确实有很多用例。我见过人们在社交网络连接中使用它,作为基于发布/订阅的脚本的触发器,甚至使用 Redis 的发布/订阅功能构建聊天系统!

37。如果 Redis 中有 1 亿个键,其中 100,000 个以固定的已知前缀开头。如果全部都查出来了呢?

答:使用keys命令扫描出指定模式的按键列表。

对方接着问:如果这个redis是给线上业务提供服务的话,使用keys命令有什么问题吗?

这时候你就得回答redis的一个关键特性:redis是单线程的。 key指令会导致线程阻塞一段时间,并且t他的在线服务将暂停。该指令执行后,服务才能恢复。这时候就可以使用scan命令,scan命令可以无阻塞地提取指定模式的键列表,但是会有一定的重复概率。在客户端做一次重复数据删除就足够了,但总体花费的时间会比直接使用keys命令更长。

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

答:如果大量key的过期时间设置得太集中,redis在过期时可能会出现短暂的滞后。一般需要在时间上加上一个随机值,使过期时间分散。

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

答:一般使用链表结构作为队列,rpush produces 消息,lpop 消费消息。当lpop没有消息时,休眠一段时间,然后重试。如果对方问是否可以使用sleep怎么办? list中还有一个命令叫blpop。当没有消息时,就会阻塞,直到消息到达。如果对方问是否可以生产一次,多次消费怎么办?使用pub/sub主题订阅者模型,可以实现1:N的消息队列。

如果对方问pub/sub有什么缺点?

当消费者下线时,产生的消息将会丢失,所以必须使用专业的消息队列,例如RabbitMQ。

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

我猜你现在是想把面试官打死吧。如果你手里拿着棒球棒,为什么还要问这么详细的问题呢?但你很克制,然后平静地回答:使用sortedset,使用时间戳作为分数,消息内容作为key,c所有zadd产生消息,消费者使用zrangebyscore指令获取N秒前轮询的数据进行处理。此时,面试官已经暗暗对你竖起大拇指了。但他不知道的是,此时你正在椅子后面竖起中指。

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

首先使用setnx来抢锁。抢到之后,使用expire给锁添加一个过期时间,防止锁忘记释放。

这时候对方会告诉你,你的回答不错,然后问如果在setnx之后执行expire之前进程意外崩溃或者需要重启维护怎么办?这时候你必须给出令人惊讶的反馈:哦,是的,这个锁永远不会被释放。那么你需要挠头假装思考一下,好像下一个结果是你自己主动的,然后回答:我r请记住,set 指令具有非常复杂的参数。这样应该就可以同时将setnx和expire合并成一条指令了!这个时候,对方就会微笑着,开始在心里默默地说:按,这家伙还不错。

相关知识点总结成思维导图


感谢您的阅读!这篇关于《Redis面试题有哪些》的文章就分享到这里。希望以上内容能够给大家带来一些帮助,让大家能够学到更多的知识。如果您觉得文章不错,可以分享出去,让更多的人知道。人们看到了!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > Redis 面试问题有哪些?

用户评论