1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Redis 常见面试题(带答案)110道

Redis 常见面试题(带答案)110道

时间:2023-11-14 13:49:29

相关推荐

Redis 常见面试题(带答案)110道

最新Redis面试题【附答案解析】Redis面试题及答案,Redis最新面试题及答案,Redis面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案难免会存在一些错误,仅供大家参考。如果发现错误还望大家多多包涵,不吝赐教,谢谢~

如果不背Redis面试题的答案,肯定面试会挂!

这套Redis面试题大全,希望对大家有帮助哈~

博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的

1、为什么 edis 需要把所有数据放到内存中?

Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 Redis 具有快速和数据持久化的特征。如果不将数据放在内存中, 磁盘 I/O 速度为严重影响 Redis 的性能。在内存越来越便宜的今天, Redis 将会越来越受欢迎。如果设置了最大使用的内存, 则数据已有记录数达到内存限值后不能继续插入新值。

2、MySQL里有2000w数据,Redis中只存20w的数据

如何保证Redis中的数据都是热点数据?

Redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

其实面试除了考察Redis,不少公司都很重视高并发高可用的技术,特别是一线互联网公司,分布式、JVM、spring源码分析、微服务等知识点已是面试的必考题。我自己整理收集了一套系统的架构技术体系,针对当前互联网公司的技术需求以及结合主流技术,这些东西可能你们平时在工作中接触过,但是缺少的全面系统的学习,加入

3、Reids6种淘汰策略:

noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。大多数写命令都会导致占用更多的内存(有极少数会例外。

allkeys-lru:所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。

volatile-lru:只限于设置了 expire 的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。

allkeys-random:所有key通用; 随机删除一部分 key。

volatile-random: 只限于设置了expire的部分; 随机删除一部分 key。

volatile-ttl: 只限于设置了expire的部分; 优先删除剩余时间(time to live,TTL) 短的key。

4、Redis还提供的高级工具

像慢查询分析、性能测试、Pipeline、事务、Lua自定义命令、Bitmaps、HyperLogLog、/订阅、Geo等个性化功能。

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

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

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

有 A, B, C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了, 那么整个集群就会以为缺少 5501-11000 这个范围的槽而不可用。

7、Redis 的内存用完了会发生什么?

如果达到设置的上限,Redis 的写命令会返回错误信息( 但是读命令还可以正常返回。) 或者你可以将 Redis 当缓存来使用配置淘汰机制, 当 Redis 达到内存上限时会冲刷掉旧的内容。

8、删除key

del key1 key2 ...

9、Redis集群最大节点个数是多少?

16384个。

10、Redis 到底是怎么实现“附近的人”

GEOADD key longitude latitude member [longitude latitude member ...]

将给定的位置对象(纬度、经度、名字)添加到指定的key。其中,key为集合名称,member为该经纬度所对应的对象。在实际运用中,当所需存储的对象数量过多时,可通过设置多key(如一个省一个key)的方式对对象集合变相做sharding,避免单集合数量过多。

成功插入后的返回值:

(integer) N

其中N为成功插入的个数。

11、MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?

Redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

12、Redis 过期键的删除策略?

1、定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时, 立即执行对键的删除操作。

2、惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是 否过期, 如果过期的话, 就删除该键;如果没有过期, 就返回该键。

3、定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至 于要删除多少过期键, 以及要检查多少个数据库, 则由算法决定。

13、mySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据

相关知识:Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。

14、Redis key的过期时间和永久有效分别怎么设置?

EXPIRE和PERSIST命令。

15、请用Redis和任意语言实现一段恶意登录保护的代码,

限制1小时内每用户Id最多只能登录5次。具体登录函数或功能用空函数即可,不用详细写出。

用列表实现:列表中每个元素代表登陆时间,只要最后的第5次登陆时间和现在时间差不超过1小时就禁止登陆.用Python写的代码如下:

#!/usr/bin/env python3import Redis import sys import time r = Redis.StrictRedis(host=’127.0.0.1′, port=6379, db=0) try: id = sys.argv[1]except:print(‘input argument error’) sys.exit(0) if r.llen(id) >= 5 and time.time() – float(r.lindex(id, 4)) <= 3600:print(“you are forbidden logining”)else: print(‘you are allowed to login’) r.lpush(id, time.time()) # login_func()

16、,或是关注

17、怎么理解Redis事务?

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

18、Redis key 的过期时间和永久有效分别怎么设置?

EXPIRE 和 PERSIST 命令。

19、Redis中海量数据的正确操作方式

利用SCAN系列命令(SCAN、SSCAN、HSCAN、ZSCAN)完成数据迭代。

20、什么是Redis?简述它的优缺点?

Redis的全称是:Remote Dictionary.Server,本质上是一个Key-Value类型的内存数据库,很像Memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。

因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。

Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 Memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。

比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。

另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的Memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

21、Redis如何做内存优化?

尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面.

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

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

23、Redis常用管理命令

# dbsize 返回当前数据库 key 的数量。# info 返回当前 Redis 服务器状态和一些统计信息。# monitor 实时监听并返回Redis服务器接收到的所有请求信息。# shutdown 把数据同步保存到磁盘上,并关闭Redis服务。# config get parameter 获取一个 Redis 配置参数信息。(个别参数可能无法获取)# config set parameter value 设置一个 Redis 配置参数信息。(个别参数可能无法获取)# config resetstat 重置 info 命令的统计信息。(重置包括:keyspace 命中数、# keyspace 错误数、 处理命令数,接收连接数、过期 key 数)# debug object key 获取一个 key 的调试信息。# debug segfault 制造一次服务器当机。# flushdb 删除当前数据库中所有 key,此方法不会失败。小心慎用# flushall 删除全部数据库中所有 key,此方法不会失败。小心慎用

24、Redis持久化数据和缓存怎么做扩容?

如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。

25、Twemproxy是什么?

Twemproxy是Twitter维护的(缓存)代理系统,代理Memcached的ASCII协议和Redis协议。它是单线程程序,使用c语言编写,运行起来非常快。它是采用Apache 2.0 license的开源软件。 Twemproxy支持自动分区,如果其代理的其中一个Redis节点不可用时,会自动将该节点排除(这将改变原来的keys-instances的映射关系,所以你应该仅在把Redis当缓存时使用Twemproxy)。 Twemproxy本身不存在单点问题,因为你可以启动多个Twemproxy实例,然后让你的客户端去连接任意一个Twemproxy实例。 Twemproxy是Redis客户端和服务器端的一个中间层,由它来处理分区功能应该不算复杂,并且应该算比较可靠的。

26、Redis没有直接使用C字符串

(即以空字符’\0’结尾的字符数组)作为默认的字符串表示,而是使用了SDS。SDS是简单动态字符串(Simple Dynamic String)的缩写。

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

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

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

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

28、Redis如何设置密码及验证密码?

设置密码:config set requirepass 123456

授权密码:auth 123456

29、一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set 他们最多能存放多少元素?

理论上 Redis 可以处理多达 232 的 keys,并且在实际中进行了测试,每个实例至少存放了 2 亿 5 千万的 keys。我们正在测试一些较大的值。任何 list、set、和 sorted set 都可以放 232 个元素。换句话说, Redis 的存储极限是系统中的可用内存值。

30、Redis有哪些适合的场景?

会话缓存(Session Cache)

最常用的一种使用Redis的情景是会话缓存(sessioncache),用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?

幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。

全页缓存(FPC)

除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。

再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。

此外,对WordPress的用户来说,Pantheon有一个非常好的插件wp-Redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

队列

Reids在内存存储引擎领域的一大优点是提供list和set操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。

如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。

排行榜/计数器

Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(SortedSet)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。

所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:

当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。

发布/订阅

最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!

31、Redis集群方案应该怎么做?都有哪些方案?

1、codis。

目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 节点数量改变情况下,旧节点数据可恢复到新hash节点。

2、Redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。具体看官方文档介绍。

3、在业务代码层实现,起几个毫无关联的Redis实例,在代码层,对key 进行hash计算,然后去对应的Redis实例操作数据。 这种方式对hash层代码要求比较高,考虑部分包

32、Reids支持的语言:

java、C、C#、C++、php、Node.js、Go等。

33、怎么测试Redis的连通性?

ping

34、Redis 集群会有写操作丢失吗?为什么?

Redis 并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。

35、Redis回收使用的是什么算法?

LRU算法

37、Redis的并发竞争问题如何解决?

单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,利用setnx实现锁。

38、AOF常用配置总结

下面是AOF常用的配置项,以及默认值;前面介绍过的这里不再详细介绍。

1、appendonly no:是否开启AOF

2、appendfilename "appendonly.aof":AOF文件名

3、dir ./:RDB文件和AOF文件所在目录

4、appendfsync everysec:fsync持久化策略

5、no-appendfsync-on-rewrite no:AOF重写期间是否禁止fsync;如果开启该选项,可以减轻文件重写时CPU和硬盘的负载(尤其是硬盘),但是可能会丢失AOF重写期间的数据;需要在负载和安全性之间进行平衡

6、auto-aof-rewrite-percentage 100:文件重写触发条件之一

7、auto-aof-rewrite-min-size 64mb:文件重写触发提交之一

8、aof-load-truncated yes:如果AOF文件结尾损坏,Redis启动时是否仍载入AOF文件

39、Redis 管道 Pipeline

在某些场景下我们在一次操作中可能需要执行多个命令,而如果我们只是一个命令一个命令去执行则会浪费很多网络消耗时间,如果将命令一次性传输到Redis中去再执行,则会减少很多开销时间。但是需要注意的是pipeline中的命令并不是原子性执行的,也就是说管道中的命令到达Redis服务器的时候可能会被其他的命令穿插

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

有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。

更多Redis 面试题 70 道

01、为什么Redis需要把所有数据放到内存中?

02、查看Redis使用情况及状态信息用什么命令?

03、后端开发群:943918498

04、修改配置不重启Redis会实时生效吗?

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

06、缓存并发问题

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

08、Reids主从复制

09、Redis与Memcached相比有哪些优势?

10、Redis 最适合的场景?

11、Redis集群最大节点个数是多少?

12、Reids的特点

13、Redis最适合的场景?

14、使用Redis有哪些好处?

16、、为什么edis需要把所有数据放到内存中?

06、Redis的内存用完了会发生什么?

17、Redis 的回收策略(淘汰策略)

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

19、Memcached 与Redis 的区别?

20、Redis 常见性能问题和解决方案:

21、一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?

22、为什么要做Redis分区?

23、定时删除

24、怎么理解Redis事务?

25、什么是Redis?

26、Redis分布式锁实现

27、Redis做异步队列

28、Reids常用5种数据类型

29、Redis 事务相关的命令有哪几个?

30、WATCH命令和基于CAS的乐观锁:

31、Redis集群方案应该怎么做?都有哪些方案?

32、Reids支持的语言:

33、怎么测试Redis的连通性?

34、Redis 集群会有写操作丢失吗?为什么?

35、Redis回收使用的是什么算法?

36、Redis的并发竞争问题如何解决?

37、AOF常用配置总结

38、Redis 管道 Pipeline

39、微信公众号:Java资讯库,回复“架构”

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

41、Redis如何做内存优化?

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

43、Redis常用管理命令

44、Redis持久化数据和缓存怎么做扩容?

45、Twemproxy是什么?

46、Redis没有直接使用C字符串

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

48、Redis如何设置密码及验证密码?

49、一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set 他们最多能存放多少元素?

50、Redis有哪些适合的场景?

51、MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?

52、Redis 过期键的删除策略?

53、mySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据

54、Redis key的过期时间和永久有效分别怎么设置?

55、请用Redis和任意语言实现一段恶意登录保护的代码,

56、,或是关注

57、怎么理解Redis事务?

58、Redis key 的过期时间和永久有效分别怎么设置?

59、Redis中海量数据的正确操作方式

60、什么是Redis?简述它的优缺点?

61、为什么 edis 需要把所有数据放到内存中?

62、MySQL里有2000w数据,Redis中只存20w的数据

63、Reids6种淘汰策略:

64、Redis还提供的高级工具

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

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

67、Redis 的内存用完了会发生什么?

68、删除key

69、Redis集群最大节点个数是多少?

70、Redis 到底是怎么实现“附近的人”

如果不背 Redis面试题的答案,肯定面试会挂!

这套SpringBoot面试题大全,希望对大家有帮助哈~

博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。