最新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、一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?

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

12、为什么要做Redis分区?

分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。

13、定时删除

优点:对内存友好,定时删除策略可以保证过期键会尽可能快地被删除,并释放国期间所占用的内存

缺点:对cpu时间不友好,在过期键比较多时,删除任务会占用很大一部分cpu时间,在内存不紧张但cpu时间紧张的情况下,将cpu时间用在删除和当前任务无关的过期键上,影响服务器的响应时间和吞吐量

14、怎么理解Redis事务?

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

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

15、什么是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适合的场景主要局限在较小数据量的高性能操作和运算上。

16、Redis分布式锁实现

先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!

17、Redis做异步队列

一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。缺点:在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。能不能生产一次消费多次呢?使用pub/sub主题订阅者模式,可以实现1:N的消息队列。

18、Reids常用5种数据类型

string,list,set,sorted set,hash

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

MULTI、EXEC、DISCARD、WATCH

20、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是否被重新设置成功。

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持久化数据和缓存怎么做扩容?

  1. 如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。
  2. 如果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的发布/订阅功能来建立聊天系统!

更多 Redis 面试题 70道

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

02、Redis的持久化机制是什么?各自的优缺点?

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

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

05、多节点 Redis 分布式锁:Redlock 算法

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

07、Redis缓存被击穿处理机制

08、Reids常用5种数据类型

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

10、怎么理解Redis事务?

11、怎么理解 Redis 事务?

12、Jedis 与 Redisson 对比有什么优缺点?

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

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

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

16、Reids的特点

17、Redis回收进程如何工作的?

18、缓存和数据库间数据一致性问题

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

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

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

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

23、Redis做异步队列

24、你知道有哪些Redis分区实现方案?

25、使用Redis有哪些好处?

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

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

08、Redis还提供的高级工具

29、Redis 最适合的场景?

30、Redis如何做内存优化?

31、Redis 如何做内存优化?

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

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

34、Redis相比Memcached有哪些优势:

35、Redis常见性能问题和解决方案?

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

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

38、怎么理解Redis事务?

39、Redis分布式锁实现

40、Redis的内存占用情况怎么样?

41、持久化策略选择

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

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

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

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

46、Redis持久化的几种方式

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

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

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

50、AOF常用配置总结

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

52、Redis的同步机制了解么?

53、Redis 支持的Java 客户端都有哪些?官方推荐用哪个?

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

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

56、Redis和Redisson有什么关系?

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

58、Redis支持的Java客户端都有哪些?官方推荐用哪个?

59、Redis如何做大量数据插入?

60、什么是Redis?

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

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

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

更多推荐

110道 Redis面试题及答案(最新整理)