2021年Redis面试题

目录

前言

作为应届生,处于找工作中ing。今年2月份刚刚整理出来的面试题,时间比较赶就没有按照模块分类排序了。总而言之,顺序比较乱,希望大家耐着性子 看。如果实在介意,评论告知,我会视情况作修改的。另外如果大家觉得我找的答案不够清晰,欢迎私信或者评论只出,我看到都会去修改的!


面试题系列文章传送门

2021年后端开发面试题整理合集


Redis面试题内容

1. 谈谈你对Redis的理解?

Redis是一种基于键值对的内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。
提供了多种功能应用
数据缓存功能,减少对数据库的访问压力,比如优化网站性能和一些不经常变动的数据
消息队列功能: Redis提供了发布订阅功能和阻塞队列功能
计数器-应用保存用户凭证比如计算浏览数,如果每次操作都要做数据库的对应更新操作,那将会给数据库的性能带来极大的挑战
redis的应用场景场景有:
缓存数据服务器比如SSO单点登录
应对高速读写的场景比如秒杀高可用
分布式锁比如秒杀数据一致性
数据共享比如库存数据

2. 为什么Redis要使用缓存?

Redis使用缓存是为了实现高性能和高并发。
Redis操作缓存就是直接操作内存,速度相当快,用户下一次再访问这些数据时可以直接从缓存中获取,以达到高性能的目的。
缓存能够承受的请求数量是远远大于直接访问数据库的,数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存而不用经过数据库,以达到高并发的目的。

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

如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。

4. Redis的常见数据类型以及使用场景?

String:用于需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。
List:用于发布与订阅或者说消息队列、慢查询
hash:用于系统中对象数据的存储
Set:用于需要存放的数据不能重复以及需要获取多个数据源交集和并集等场景
sorted set(有序集合):用于需要对数据根据某个权重进行排序的场景。比如在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息。
bitmap:用于需要保存状态信息和需要进一步对这些信息进行分析的场景,比如用户签到情况、活跃用户情况、用户行为统计。

5. 使用Redis有哪些好处?

速度快,因为数据存在内存中.
支持丰富数据类型,支持String,list,set,sorted set,hash 等
支持事务,操作都是原子性
应用场景丰富

6. Redis为什么不适应多线程?

单线程编程容易并且更容易维护;
Redis的性能瓶颈不在CPU上,主要在内存和网络;
多线程就会存在死锁、线程上下文切换等问题,甚至会影响性能。
Redis在6.0之后引入了多线程

7. Redis的同步机制了解么?

Redis可以使用主从同步,从从同步。第一次同步时,主节点做一次 bgsave,并同时将后续修改操作记录到内存中,待完成后将rdb文件同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放。

8. Redis 的持久化机制是什么?

Redis 提供两种持久化机制RDB和AOP机制:
RDB持久化机制:是对redis中的数据执行周期性的持久化。
AOP持久化机制: 是指所有的命令行记录以redis命令请求协议的格式完全持久化存储,保存为aof文件。

9. 是否使用过Redis集群,集群的原理是什么?

Redis Sentinal着眼于高可用,在maste 宕机时会自动将slave提升为master,继续提供服务。
Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。

10. 说说Redis的缓存穿透?

缓存穿透就是大量请求的key根本不存在于缓存中,导致请求直接到了数据库上,没有经过缓存。缓存穿透的处理流程是:用户发送请求,系统首先判断缓存中是否存在对应的数据,如果缓冲中不存在,则到数据库中判断是否存在对应的数据,如果数据库没有数据则返回空。

11. 说一下Redis和Memcached的区别和共同点

共同点 :
都是基于内存的数据库,一般都用来当做缓存使用。
都有过期策略。
两者的性能都非常高。
区别 :
数据类型支持方面:Redis不仅仅支持简单的key/value类型的数据,同时还提供 list、set、sorted set、hash等数据结构的存储;Memcached只支持最简单的key/value数据类型。
存储方式方面:Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用;Memecache把数据全部存在内存之中。
线程方面:Redis使用单线程的多路IO复用模型;Memcached是多线程,非阻塞IO复用的网络模型。
应用场景方面:Redis支持发布订阅模型、会话存储、排行榜等功能,而Memcached不支持。

12. Redis的回收策略(淘汰策略)?

volatile-lru方式:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-ttl方式:从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random方式:从已设置过期时间的数据集中任意选择数据淘汰
allkeys-lru方式:从数据集中挑选最近最少使用的数据淘汰
allkeys-random方式:从数据集中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据

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

Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。

14. Redis常见性能问题和解决方案:

Master 最好不要写内存快照,如果 Master 写内存快照,save 命令调度 rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务
如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一
为了主从复制的速度和连接的稳定性,Master 和 Slave 最好在同一个局域网
尽量避免在压力很大的主库上增加从
主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1<- Slave2 <- Slave3…这样的结构方便解决单点故障问题,实现 Slave 对 Master的替换。如果 Master 挂了,可以立刻启用 Slave1 做 Master,其他不变。

15. Jedis与Redisson对比有什么优缺点?

Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;
Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。
Redisson 的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

16. Redis如何判断数据是否过期的?

Redis通过过期字典来保存数据过期的时间,过期字典的键指向Redis数据库中的某个key,过期字典的值是一个long long类型的整数,这个整数保存了key所指向的数据库键的过期时间。
(辅助理解:过期字典可以看作是 hash 表)

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

Redisson、Jedis、lettuce等等,官方推荐使用Redisson。

18. Redis如何实现延时队列?

使用sorted set,将时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理。

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

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

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

expire命令设置过期时间,persist命令移除某个键的过期时间,也就是永久有效。

21. Redis中RDB持久化机制的优缺点?

优点:
只有一个文件dump.rdb方便持久化,可以用来做数据的冷备。
rdb对redis的读写服务性能影响较小, 因为redis可以启动一个fork子进程来进行数据的持久化;
rdb数据恢复更快, 因为rdb是一个数据文件, 恢复时直接放到内存里。
缺点:
rdb 因为保存数据的时间间隔比较大,因此会丢失更多的数据;
如果数据量过大,由于需要进行数据保存, 可能服务会暂停较长时间

22. Redis过期键的删除策略?

定时删除:在设置键的过期时间时创建一个定时器timer,让定时器在键过期的同时执行对键的删除操作。
惰性删除:放任键过期不管,每次从键空间中获取键时,都检查取得的键是否过期,如果过期就删除该键,如果没有过期就返回该键。
定期删除:每隔一段时间就对数据库进行一次检查,删除里面的过期键。

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

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有 N-1 个复制品.

24. Redis中AOP持久化机制的优缺点?

优点:
保存数据时间间隔为1 秒,数据丢失少;
aof日志文件以append-only模式写入, 没有任何寻址开销,所以写入性能很快,即使文件尾部被破坏也可以很容易修复;
aof有rewrite功能, 可以将容量大的aof文件进行压缩;
缺点:
AOF文件比RDB文件大,且恢复速度慢,当数据集大的时候,比rdb启动效率低。

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

Redis 集群目前无法做数据库选择,默认在 0 数据库。

26. Redis6.0之后为何引入了多线程?

Redis6.0引入多线程主要是为了提高网络IO读写性能,但只在网络数据的读写这类耗时操作上使用, 执行命令仍然是单线程顺序执行,因此不需要担心线程安全问题。
Redis6.0的多线程默认是禁用的,只使用主线程,开启需要修改redis配置文件redis.conf
开启多线程后,还需要设置线程数,否则是不生效的

27. Redis集群之间是如何复制的,最大节点个数是多少?

Redis集群之间通过异步复制,最大节点个数为16384。

28. Redis回收进程如何工作的?

一个客户端运行了新的命令,添加了新的数据。
Redis检查内存使用情况,如果大于最大内存的限制, 则根据设定好的策略进行回收。
一个新的命令被执行,不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。
如果一个命令的结果导致大量内存被使用,不用多久内存限制就会被这个内存使用量超越。

29. Redis集群会有写操作丢失吗?为什么?

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

30. Redis的内存用完了会发生什么?

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

31. Redis有哪些应用场景?

最简单的就是缓存、用户登陆和校验码
Redis提供的有序集合数据能构造排行榜功能,比如文章访问排行榜,月度销售排行榜等。
Redis提供的incr命令可以用来实现计数器功能,比如视频的播放量,文章的浏览量等。
Redis提供的发布/订阅和阻塞队列功能可以实现一个简单的聊天室。

32. Redis缓冲穿透的解决办法?

先进行参数校验,一些不合法的参数请求直接抛出异常信息返回给客户端
如果Redis缓存和数据库都查不到某个key,就将这个key写到Redis中并设置过期时间。
使用布隆过滤器

33. 怎么理解Redis事务?

Redis 可以通过 MULTI,EXEC,DISCARD、WATCH等命令来实现事务功能,它提供了一种将多个命令请求打包的功能。然后再按顺序执行打包的所有命令,并且不会被中途打断。Redis的事务不支持rollback,因此不能满足原子性。

34. 说说Redis的单线程模型?

Redis基于Reactor模式开发了文件事件处理器,该处理器使用I/O多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
当被监听的套接字准备好执行连接应答、读取、写入、关闭等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。
文件事件处理器以单线程方式运行,实现了高性能的网络通信模型,可以很好地与Redis中的其他单线程模块进行对接。

35. 如果Redis正在给线上的业务提供服务,那使用keys指令会有什么问题?

redis是单线程的,keys指令会导致线程阻塞一段时间,线上服务会停顿直到指令执行完毕,服务才能恢复。也可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。

36.什么是Redis缓存雪崩?

缓存雪崩有两个场景Redis服务器不可用和热点缓存失效:
Redis服务器不可用:缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求而出现宕机。
热点缓存失效:热点缓存在某一时刻大面积失效,导致对应的请求直接落到了数据库上。
(辅助理解:被大量访问的数据=热点缓存)

37. Redis如何保证缓存和数据库数据的一致性?

让缓存数据的过期时间变短,这样就会从数据库中加载数据,但是不推荐,因为这种方式治标不治本。
如果因为缓存服务当前不可用而导致缓存删除失败,可以隔一段时间进行重试,重试次数可以随意。如果多次重试还是失败的话,可以把当前更新失败的key存入队列中,等缓存服务可用之后,再将缓存中对应的key删除。

38. Redis缓存雪崩的解决方案?

针对Redis服务不可用的情况,可以采用Redis集群和限流来解决。
针对热点缓存失效的情况,可以设置不同的失效时间或者设置缓存永不失效来解决。

39. Redis事务相关的命令有哪几个?

MULTI、EXEC、DISCARD、WATCH

40. Redis如何做内存优化?

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


有问题欢迎私信/评论指出,谢谢您的观看,希望对您有帮助哦!
https://lianghongbin.blog.csdn.net/

  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个巨大的怪兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值