admin管理员组

文章数量:1794759

Redis面试题及答案(2021年Redis面试题大全带答案)

Redis面试题及答案(2021年Redis面试题大全带答案)

最近梳理2021最新 Redis面试题【附答案解析】,包含了 Java基础、并发、JVM、数据库、Spring、SpringMVC、Redis、SpringCloud、设计模式、MQ、Linux、Redis等多个类型。

今天这篇是关于 Redis,总结了 110 道经典问题。

这套Redis面试题大全,希望对大家有帮助哈~ 博主已将以下这些面试题整理成了一个Redis面试手册,是PDF版的 1、一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?

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

2、为什么要做Redis分区?

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

3、定时删除

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

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

4、怎么理解Redis事务?

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

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

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

6、Redis分布式锁实现

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

7、Redis做异步队列

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

8、Reids常用5种数据类型

string,list,set,sorted set,hash

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

MULTI、EXEC、DISCARD、WATCH

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

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

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

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

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

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

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

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

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

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

EXPIRE和PERSIST命令。

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

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

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

#!/usr/bin/env python3 import 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、为什么 edis 需要把所有数据放到内存中?

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

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

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

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

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

23、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。

24、Redis还提供的高级工具

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

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

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

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

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

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

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

28、删除key

del key1 key2 ...

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

16384个。

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

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

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

成功插入后的返回值:

(integer) N

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

Redis 面试题更多70道

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

02、Reids支持的语言:

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

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

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

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

07、AOF常用配置总结

08、Redis 管道 Pipeline

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

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

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

12、为什么要做Redis分区?

13、定时删除

14、怎么理解Redis事务?

15、什么是Redis?

16、Redis分布式锁实现

17、Redis做异步队列

18、Reids常用5种数据类型

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

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

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

22、Reids的特点

23、Redis最适合的场景?

24、使用Redis有哪些好处?

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

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

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

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

29、Memcached 与Redis 的区别?

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

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

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

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

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

36、缓存并发问题

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

38、Reids主从复制

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

40、Redis 最适合的场景?

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

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

43、Reids6种淘汰策略:

44、Redis还提供的高级工具

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

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

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

48、删除key

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

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面试题大全,希望对大家有帮助哈~ 博主已将以下这些面试题整理成了一个Redis面试手册,是PDF版的

本文标签: 面试题答案大全Redis