admin管理员组文章数量:1794759
100道Redis面试题及答案(2021最新)
在网上看到有关Redis的120道面试题,但是没有给出答案,之前我也在寻找这份Redis面试题的答案,今天特地把答案分享出来。
花了大量时间整理了这套Redis面试题及答案,希望对大家有帮助哈~
弄明白了这些Redis面试题基本上就可以成为面霸了,吊打面试官,哈哈~
如果不背 Redis面试题的答案,肯定面试会挂!
这套Redis面试题大全,希望对大家有帮助哈~ 博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的 1、Redis集群最大节点个数是多少?16384个
2、Reids的特点Redis本质上是一个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适合的场景主要局限在较小数据量的高性能操作和运算上。
3、Redis最适合的场景?1、 会话缓存(Session Cache)
最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信全部丢失,大部分人都会不高兴的,现在,他们还会这样吗? 幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。
2、 全页缓存(FPC)
除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。 再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。 此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-Redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。
3、队列
Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。 如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。
4,排行榜/计数器
Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可: 当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行: ZRANGE user_scores 0 10 WITHSCORES Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。
5、 发布/订阅
最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!
4、使用Redis有哪些好处?1、 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
2、 支持丰富数据类型,支持string,list,set,sorted set,hash
3、 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
4、 丰富的特性:可用于缓存,消,按key设置过期时间,过期后将会自动删除
5、为什么edis需要把所有数据放到内存中?Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以Redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响Redis的性能。在内存越来越便宜的今天,Redis将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。
6、Redis的内存用完了会发生什么?如果达到设置的上限,Redis的写命令会返回错误信(但是读命令还可以正常返回。)或者你可以将Redis当缓存来使用配置淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。
7、Redis 的回收策略(淘汰策略)volatile-lru:从已设置过期时间的数据集( server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-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( 驱逐) : 禁止驱逐数据
注意这里的 6 种机制,volatile 和 allkeys 规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据, 后面的 lru、ttl 以及 random 是三种不同的淘汰策略, 再加上一种 no-enviction 永不回收的策略。
使用策略规则:
1、 如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率 低, 则使用 allkeys-lru
2、 如果数据呈现平等分布, 也就是所有的数据访问频率都相同, 则使用allkeys-random
8、假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?使用keys指令可以扫出指定模式的key列表。
对方接着追问:如果这个Redis正在给线上的业务提供服务,那使用keys指令会有什么问题?
这个时候你要回答Redis关键的一个特性:Redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。
9、Memcached 与Redis 的区别?1、 Redis 不仅仅支持简单的 k/v 类型的数据,同时还提供 list,set,zset, hash 等数据结构的存储。而 memcache 只支持简单数据类型,需要客户端自己处理复杂对象
2、 Redis 支持数据的持久化, 可以将内存中的数据保持在磁盘中, 重启的时候可以再次加载进行使用( PS: 持久化在 rdb、aof)。
10、Redis 常见性能问题和解决方案:1、 Master 最好不要写内存快照,如果 Master 写内存快照,save 命令调度 rdbSave函数, 会阻塞主线程的工作, 当快照比较大时对性能影响是非常大的, 会间断性暂停服务
2、 如果数据比较重要, 某个 Slave 开启 AOF 备份数据, 策略设置为每秒同步一
3、 为了主从复制的速度和连接的稳定性, Master 和 Slave 最好在同一个局域网
4、 尽量避免在压力很大的主库上增加从
5、 主从复制不要用图状结构, 用单向链表结构更为稳定, 即:Master <- Slave1
<- Slave2 <- Slave3… 这样的结构方便解决单点故障问题,实现 Slave 对 Master 的替换。如果 Master 挂了, 可以立刻启用 Slave1 做 Master, 其他不变。
11、为什么Redis需要把所有数据放到内存中?Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以Redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响Redis的性能。在内存越来越便宜的今天,Redis将会越来越受欢迎。
如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。
12、查看Redis使用情况及状态信用什么命令?info
14、修改配置不重启Redis会实时生效吗?针对运行实例,有许多配置选项可以通过 CONFIG SET 命令进行修改,而无需执行任何形式的重启。 从 Redis 2.2 开始,可以从 AOF 切换到 RDB 的快照持久性或其他方式而不需要重启 Redis。检索 ‘CONFIG GET *’ 命令获取更多信。
但偶尔重新启动是必须的,如为升级 Redis 程序到新的版本,或者当你需要修改某些目前 CONFIG 命令还不支持的配置参数的时候。
15、是否使用过 Redis 集群,集群的原理是什么?1、 Redis Sentinal 着眼于高可用, 在 master 宕机时会自动将 slave 提升为master, 继续提供服务。
2、 Redis Cluster 着眼于扩展性, 在单个 Redis 内存不足时, 使用 Cluster 进行分片存储。
16、缓存并发问题这里的并发指的是多个Redis的client同时set key引起的并发问题。比较有效的解决方案就是把Redis.set操作放在队列中使其串行化,必须的一个一个执行,具体的代码就不上了,当然加锁也是可以的,至于为什么不用Redis中的事务,留给各位看官自己思考探究。
17、使用过Redis分布式锁么,它是什么回事?先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回我记得set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!对方这时会显露笑容,心里开始默念:摁,这小子还不错。
18、Reids主从复制复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用的。复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。
19、Redis与Memcached相比有哪些优势?1、 Memcached所有的值均是简单的字符串,Redis作为其替代者,支持更为丰富的数据类型
2、 Redis的速度比Memcached快很多Redis的速度比Memcached快很多
3、 Redis可以持久化其数据Redis可以持久化其数据
20、Redis 最适合的场景?1、 会话缓存( Session Cache)
最常用的一种使用 Redis 的情景是会话缓存( session cache)。用 Redis 缓存会话比其他存储( 如 Memcached)的优势在于:Redis 提供持久化。当维护一个不是严格要求一致性的缓存时, 如果用户的购物车信全部丢失, 大部分人都会不高兴的, 现在, 他们还会这样吗? 幸运的是, 随着 Redis 这些年的改进, 很容易找到怎么恰当的使用 Redis 来缓存会话的文档。甚至广为人知的商业平台Magento 也提供 Redis 的插件。
2、 全页缓存( FPC)
除基本的会话 token 之外, Redis 还提供很简便的 FPC 平台。回到一致性问题, 即使重启了 Redis 实例, 因为有磁盘的持久化, 用户也不会看到页面加载速度的下降,这是一个极大改进,类似 PHP 本地 FPC。 再次以 Magento 为例,Magento 提供一个插件来使用 Redis 作为全页缓存后端。 此外, 对 WordPress 的用户来说, Pantheon 有一个非常好的插件 wp-Redis, 这个插件能帮助你以最快速度加载你曾浏览过的页面。
3、队列
Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作, 这使得 Redis 能作为一个很好的消队列平台来使用。Redis 作为队列使用的操作,就类似于本地程序语言( 如 Python)对 list 的 push/pop 操作。 如果你快速的在 Google 中搜索“ Redis queues”, 你马上就能找到大量的开源项目, 这些项目的目的就是利用 Redis 创建非常好的后端工具, 以满足各种队列需求。例如, Celery 有一个后台就是使用 Redis 作为 broker, 你可以从这里去查看。
4, 排行榜/计数器
Redis 在内存中对数字进行递增或递减的操作实现的非常好。集合( Set) 和有序集合( Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis 只是正好提供了这两种数据结构。所以, 我们要从排序集合中获取到排名最靠前的 10 个用户– 我们称之为“ user_scores”, 我们只需要像下面一样执行即可: 当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数, 你需要这样执行: ZRANGE user_scores 0 10 WITHSCORES Agora Games 就是一个很好的例子, 用 Ruby 实现的, 它的排行榜就是使用 Redis 来存储数据的, 你可以在这里看到。
5、 发布/订阅
最后( 但肯定不是最不重要的)是 Redis 的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用, 还可作为基于发布/订阅的脚本触发器, 甚至用 Redis 的发布/订阅功能来建立聊天系统!
21、一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?理论上Redis可以处理多达232的keys,并且在实际中进行了测试,每个实例至少存放了2亿5千万的keys。我们正在测试一些较大的值。任何list、set、和sorted set都可以放232个元素。换句话说,Redis的存储极限是系统中的可用内存值。
22、为什么要做Redis分区?分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。
23、定时删除优点:对内存友好,定时删除策略可以保证过期键会尽可能快地被删除,并释放国期间所占用的内存
缺点:对cpu时间不友好,在过期键比较多时,删除任务会占用很大一部分cpu时间,在内存不紧张但cpu时间紧张的情况下,将cpu时间用在删除和当前任务无关的过期键上,影响服务器的响应时间和吞吐量
24、怎么理解Redis事务?事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
25、什么是Redis?Redis本质上是一个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适合的场景主要局限在较小数据量的高性能操作和运算上。
26、Redis分布式锁实现先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!
27、Redis做异步队列一般使用list结构作为队列,rpush生产消,lpop消费消。当lpop没有消的时候,要适当sleep一会再重试。缺点:在消费者下线的情况下,生产的消会丢失,得使用专业的消队列如rabbitmq等。能不能生产一次消费多次呢?使用pub/sub主题订阅者模式,可以实现1:N的消队列。
28、Reids常用5种数据类型string,list,set,sorted set,hash
29、Redis 事务相关的命令有哪几个?MULTI、EXEC、DISCARD、WATCH
30、WATCH命令和基于CAS的乐观锁:在Redis的事务中,WATCH命令可用于提供CAS(check-and-set)功能。假设我们通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Null multi-bulk应答以通知调用者事务
执行失败。例如,我们再次假设Redis中并未提供incr命令来完成键值的原子性递增,如果要实现该功能,我们只能自行编写相应的代码。其伪码如下:
val = GET mykey val = val + 1 SET mykey $val以上代码只有在单连接的情况下才可以保证执行结果是正确的,因为如果在同一时刻有多个客户端在同时执行该段代码,那么就会出现多线程程序中经常出现的一种错误场景--竞态争用(race condition)。
比如,客户端A和B都在同一时刻读取了mykey的原有值,假设该值为10,此后两个客户端又均将该值加一后set回Redis服务器,这样就会导致mykey的结果为11,而不是我们认为的12。为了解决类似的问题,我们需要借助WATCH命令的帮助,见如下代码:
WATCH mykey val = GET mykey val = val + 1 MULTI SET mykey $val EXEC和此前代码不同的是,新代码在获取mykey的值之前先通过WATCH命令监控了该键,此后又将set命令包围在事务中,这样就可以有效的保证每个连接在执行EXEC之前,如果当前连接获取的mykey的值被其它连接的客户端修改,那么当前连接的EXEC命令将执行失败。这样调用者在判断返回值后就可以获悉val是否被重新设置成功。
更多 Redis 面试题 70道01、 为什么 edis 需要把所有数据放到内存中?02、 MySQL里有2000w数据,Redis中只存20w的数据03、 Reids6种淘汰策略:04、 Redis还提供的高级工具05、 Pipeline 有什么好处,为什么要用pipeline?06、 Redis 集群方案什么情况下会导致整个集群不可用?07、 Redis 的内存用完了会发生什么?08、 删除key09、 Redis集群最大节点个数是多少?10、 Redis 到底是怎么实现“附近的人”
11、 MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?12、 Redis 过期键的删除策略?13、 mySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据14、 Redis key的过期时间和永久有效分别怎么设置?15、 请用Redis和任意语言实现一段恶意登录保护的代码,16、 ,或是关注17、 怎么理解Redis事务?18、 Redis key 的过期时间和永久有效分别怎么设置?19、 Redis中海量数据的正确操作方式20、 什么是Redis?简述它的优缺点?
21、 Redis如何做内存优化?22、 Pipeline有什么好处,为什么要用pipeline?23、 Redis常用管理命令24、 Redis持久化数据和缓存怎么做扩容?25、 Twemproxy是什么?26、 Redis没有直接使用C字符串27、 使用过 Redis 分布式锁么,它是什么回事?28、 Redis如何设置密码及验证密码?29、 一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set 他们最多能存放多少元素?30、 Redis有哪些适合的场景?
31、 Redis集群方案应该怎么做?都有哪些方案?32、 Reids支持的语言:33、 怎么测试Redis的连通性?34、 Redis 集群会有写操作丢失吗?为什么?35、 Redis回收使用的是什么算法?36、 Redis的并发竞争问题如何解决?37、 AOF常用配置总结38、 Redis 管道 Pipeline39、 微信公众号:Java资讯库,回复“架构”40、 Redis集群方案什么情况下会导致整个集群不可用?
41、 一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?42、 为什么要做Redis分区?43、 定时删除44、 怎么理解Redis事务?45、 什么是Redis?46、 Redis分布式锁实现47、 Redis做异步队列48、 Reids常用5种数据类型49、 Redis 事务相关的命令有哪几个?50、 WATCH命令和基于CAS的乐观锁:
51、 Redis集群最大节点个数是多少?52、 Reids的特点53、 Redis最适合的场景?54、 使用Redis有哪些好处?55、 为什么edis需要把所有数据放到内存中?56、 Redis的内存用完了会发生什么?57、 Redis 的回收策略(淘汰策略)58、 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?59、 Memcached 与Redis 的区别?60、 Redis 常见性能问题和解决方案:
61、 为什么Redis需要把所有数据放到内存中?62、 查看Redis使用情况及状态信用什么命令?63、 后端开发群:94391849864、 修改配置不重启Redis会实时生效吗?65、 是否使用过 Redis 集群,集群的原理是什么?66、 缓存并发问题67、 使用过Redis分布式锁么,它是什么回事?68、 Reids主从复制69、 Redis与Memcached相比有哪些优势?70、 Redis 最适合的场景?
如果不背 Redis面试题的答案,肯定面试会挂!
这套Redis面试题大全,希望对大家有帮助哈~ 博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的版权声明:本文标题:100道Redis面试题及答案(2021最新) 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686565655a82566.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论