2019年Redis最新面试题集合全面解答

本文深入探讨Redis的优点与缺点,解析其高效单线程工作原理,详细介绍RDB与AOF两种持久化方式。涵盖Redis分布式锁、队列实现、缓存穿透、雪崩及击穿解决方案。同时提供Redis面试常见问题及解答,助力技术提升。

前言

秋天又到了粮食丰收的季节,大部分得不到理想工资的程序员开始蠢蠢欲动了。如何从大部队中脱颖而出,通过心仪公司的面试拿到offer。当然还是需要不断学习。下面是我为大家准备的Redis面试题以及答案,以及文末还有大量面试资料。希望通过这些资料可以让大家更优秀。更快走在别人前面,超越更多同龄阶层的人。

Redis面试题

Redis有什么优点?

1. 速度快:数据存储在内存中,类似于HashMap,操作和查找的时间复杂度都是O(1);

2. 支持数据类型丰富:有字符串string,字典hash,列表list,集合set,有序集合zset

3. 支持持久化

Redis有什么缺点?

1. 存储受内存大小限制;

2. 持久化时占用cpu较高

为什么redis单线程的效率这么高?

1. 操作的内存,本身速度快;

2. 使用单线程,避免了上下文切换。

Redis有几种持久化方式?

有全量RDB持久化和增量AOF持久化。

1. 全量RDB持久化,在指定时间,fork一个子进程,将数据写入到临时文件,完成后替换之前的文件,用二进制压缩存储。

1.1 可以灵活设置备份频率和周期,适合冷备份,恢复快,性能最大化。

1.2 在完成持久化之前宕机,会丢失数据;fork子进程占用资源。

2. 增量AOF持久化,将每一个非读操作,记录到文件中,使用操作恢复。

2.1 使用追加模式,不会影响以前的数据;丢失数据量少;文件过大会重写压缩;生成的文件格式清晰,易于理解;

2.2 生成的文件要大,恢复速度慢于RDB;运行效率低于RDB;操作回放更加脆弱。

如何从一亿个key中找到以某个固定前缀开头的key?

使用keys指令,匹配固定前缀;

Redis是单线程的,keys指令会导致阻塞,是服务停顿,指令执行完毕才可以恢复。

可以使用scan指令,但是可能有一定的重复,需要客户端去重,划分时间。

redis如何实现分布式锁?

使用setnx来争抢锁,再用expire加一个过期时间,防止忘记释放锁;

如果在执行setnx之后,expire之前发生异常,就会死锁;可以将setnx和expire合成一条指令;

redis如何做队列?

list是双端操作的,可以使用list作为队列,一端作为生产者入队rpush,另一端作为消费者出队lpop;

实现延迟队列,可以使用zortedset,使用时间作为score,zadd生产消息,zrangbyscore指定获取描述的数据。

如何生产一次,消费多次? 可以使用发布订阅模式;缺点是消费者下线,消息会丢失。

如果大量的key在同一时间过期,需要注意什么?

过期时间过于集中,可能会出现短暂卡顿,可以加一个随机值,使过期时间分散一些。

什么是缓存穿透?如何解决?

查询一个一定不存在的数据,缓存中不存在,则会去数据库中查询,数据库中不存在则不会写入缓存,这导致每次查询都会查询数据库,使缓存失去意义。

可以使用空对象,当查询为空时,设置一个特殊的值,和真正合法数据区分开,要有一个较短的过期时间。

使用过滤器,先查缓存,缓存存在key则返回;不存在则查询过滤器,过滤器存在则说明不存在值,直接返回空,否则查询数据库。

什么是缓存雪崩?如何解决?

缓存无法使用导致请求全部到达数据库,导致数据库崩溃。

缓存高可用,减少缓存不可用时间;数据库限流;服务降级;

什么是缓存击穿?如何解决?

某个key失效时,大量的请求进入,将数据库瞬间压垮。

使用锁,确保只有一个线程去查询数据库;手动过期,不设置过期时间,所有key手动过期。

redis默认有多少数据库,如何指定?

默认有16个数据库,下标默认从0开始。可以通过配置database选项指定。

可以通过select 下标 切换数据库。

过期键删除策略?

主动删除:

1. 定时删除:创建定时器,在键过期的时候,删除键;占用cpu。

2. 定期删除:每隔一段时间,删除过期键。

被动删除:

惰性删除:在取出键的时候检查是否过期;有些键不被使用,永远无法删除。

save和bgsave的区别?

save:由于redis是单线程的,save会造成阻塞,在rdb文件创建完成期间不处理任何请求。

bgsave:会创建子线程,完成rdb文件的创建工作,主线程正常执行。

在执行bgsave期间,主线程会拒绝save和bgsave命令;bgrewriteaof命令会延迟到bgsave命令结束之后执行。

旧版Redis复制过程是怎样的?

1. 同步

1.1 从服务器向主服务器发送sync指令

1.2 主服务器收到sync命令,执行bgsave,生成rdb文件,并使用一个缓冲区记录备份开始后 执行的所有命令。

1.3 主服务器bgsave执行完成后,将rdb文件发送给从服务器,从服务器接受rdb文件并载入。

1.4 主服务器将缓冲区中的所有写命令发送给从服务器,从服务器执行命令。

2. 命令传播

2.1 主服务器会将自己的写命令同步给从服务器,从服务器执行命令。

旧版同步可能的问题是什么?

同步分为初次同步和断线后同步。

初次同步,并没有任何问题,可以很好的完成任务。

断线后同步,从服务器会再次发送sync指令,重新进行一次完整的同步。

但是从服务器和主服务器之间的差异,只是断线期间的差异,进行完全同步,耗费资源。

新版复制如何解决问题?

新本复制psync分为完整重同步和部分重同步。

完整重同步和sync的同步过程一致。

部分重同步用于断线情况,主服务器只将断线期间的写命令发送给从服务器执行。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值