《吊打面试官》系列- Redis基础

你知道的越多,你不知道的越多面试

点赞再看,养成习惯redis

前言

Redis在互联网技术存储方面使用如此普遍,几乎全部的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。做为一个在互联网公司面一次拿一次offer的面霸(请容许我使用一下夸张的修辞手法),战胜了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚,在一个寂寞难耐的夜晚,我痛定思痛,决定开始写《吊打面试官》系列,但愿能帮助各位读者之后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚铩羽而归,疯狂收割大厂offer!sql

面试开始

一个大腹便便,穿着格子衬衣的中年男子,拿着一个尽是划痕的mac向你走来,看着快秃顶的头发,心想着确定是尼玛顶级架构师吧!可是咱们腹有诗书气自华,虚都不虚。数据库

小伙子您好,看你简历上写了你项目里面用到了Redis,大家为啥用Redis?

内心忍不住暗骂,这叫啥问题,你们不都是用的这个嘛,可是你不能说出来。后端

认真回答道:帅气迷人的面试官您好,由于传统的关系型数据库如Mysql已经不能适用全部的场景了,好比秒杀的库存扣减,APP首页的访问流量高峰等等,都很容易把数据库打崩,因此引入了缓存中间件,目前市面上比较经常使用的缓存中间件有 RedisMemcached 不过中和考虑了他们的优缺点,最后选择了Redis。缓存

至于更细节的对比朋友们记得查阅Redis 和 Memcached 的区别,好比二者的优缺点对比和各自的场景,后续我有时间也会写出来。服务器

那小伙子,我再问你,Redis有哪些数据结构呀?

StringHashListSetSortedSet微信

这里我相信99%的读者都能回答上来Redis的5个基本数据类型。若是回答不出来的小伙伴咱们就要加油补课哟,你们知道五种类型最适合的场景更好。数据结构

可是,若是你是Redis中高级用户,并且你要在此次面试中突出你和其余候选人的不一样,还须要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub架构

若是你还想加分,那你说还玩过Redis Module,像BloomFilter,RedisSearch,Redis-ML,这个时候面试官得眼睛就开始发亮了,心想这个小伙子有点东西啊

注:本人在面试回答到Redis相关的问题的时候,常常提到BloomFilter(布隆过滤器)这玩意的使用场景是真的多,并且用起来是真的香,原理也好理解,看一下文章就能够在面试官面前侃侃而谈了,不香么?下方传送门 ↓

避免缓存击穿的利器之BloomFilter

若是有大量的key须要设置同一时间过时,通常须要注意什么?

若是大量的key过时时间设置的过于集中,到过时的那个时间点,Redis可能会出现短暂的卡顿现象。严重的话会出现缓存雪崩,咱们通常须要在时间上加一个随机值,使得过时时间分散一些。

电商首页常常会使用定时任务刷新缓存,可能大量的数据失效时间都十分集中,若是失效时间同样,又恰好在失效的时间点大量用户涌入,就有可能形成缓存雪崩

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

先拿setnx来争抢锁,抢到以后,再用expire给锁加一个过时时间防止锁忘记了释放。

这时候对方会告诉你说你回答得不错,而后接着问若是在setnx以后执行expire以前进程意外crash或者要重启维护了,那会怎么样?

这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你须要抓一抓本身得脑壳,故做思考片刻,好像接下来的结果是你主动思考出来的,而后回答:我记得set指令有很是复杂的参数,这个应该是能够同时把setnxexpire合成一条指令来用的!

对方这时会显露笑容,内心开始默念:嗯,这小子还不错,开始有点意思了。假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们所有找出来?

使用keys指令能够扫出指定模式的key列表。

对方接着追问:若是这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?

这个时候你要回答Redis关键的一个特性:Redis的单线程的。keys指令会致使线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可使用scan指令,scan指令能够无阻塞的提取出指定模式的key列表,可是会有必定的重复几率,在客户端作一次去重就能够了,可是总体所花费的时间会比直接用keys指令长。

不过,增量式迭代命令也不是没有缺点的: 举个例子, 使用 SMEMBERS 命令能够返回集合键当前包含的全部元素, 可是对于 SCAN 这类增量式迭代命令来讲, 由于在对键进行增量式迭代的过程当中, 键可能会被修改, 因此增量式迭代命令只能对被返回的元素提供有限的保证 。

使用过Redis作异步队列么,你是怎么用的?

通常使用list结构做为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。

若是对方追问可不能够不用sleep呢?

list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来。

若是对方接着追问能不能生产一次消费屡次呢?

使用pub/sub主题订阅者模式,能够实现 1:N 的消息队列。

若是对方继续追问 pub/su b有什么缺点?

在消费者下线的状况下,生产的消息会丢失,得使用专业的消息队列如RocketMQ等。

若是对方究极TM追问Redis如何实现延时队列?

这一套连招下来,我估计如今你很想把面试官一棒打死(面试官本身都想打死本身了怎么问了这么多本身都不知道的),若是你手上有一根棒球棍的话,可是你很克制。平复一下激动的心里,而后神态自若的回答道:使用sortedset,拿时间戳做为score,消息内容做为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒以前的数据轮询进行处理。

到这里,面试官暗地里已经对你竖起了大拇指。而且已经默默给了你A+,可是他不知道的是此刻你却竖起了中指,在椅子背后。

Redis是怎么持久化的?服务主从数据怎么交互的?

RDB作镜像全量持久化,AOF作增量持久化。由于RDB会耗费较长时间,不够实时,在停机的时候会致使大量丢失数据,因此须要AOF来配合使用。在redis实例重启时,会使用RDB持久化文件从新构建内存,再使用AOF重放近期的操做指令来实现完整恢复重启以前的状态。

这里很好理解,把RDB理解为一整个表全量的数据,AOF理解为每次操做的日志就行了,服务器重启的时候先把表的数据所有搞进去,可是他可能不完整,你再回放一下日志,数据不就完整了嘛。不过Redis自己的机制是 AOF持久化开启且存在AOF文件时,优先加载AOF文件;AOF关闭或者AOF文件不存在时,加载RDB文件;加载AOF/RDB文件城后,Redis启动成功; AOF/RDB文件存在错误时,Redis启动失败并打印错误信息

对方追问那若是忽然机器掉电会怎样?

取决于AOF日志sync属性的配置,若是不要求性能,在每条写指令时都sync一下磁盘,就不会丢失数据。可是在高性能的要求下每次都sync是不现实的,通常都使用定时sync,好比1s1次,这个时候最多就会丢失1s的数据。

对方追问RDB的原理是什么?

你给出两个词汇就能够了,fork和cow。fork是指redis经过建立子进程来进行RDB操做,cow指的是copy on write,子进程建立后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。

注:回答这个问题的时候,若是你还能说出AOF和RDB的优缺点,我以为我是面试官在这个问题上我会给你点赞,二者其实区别仍是很大的,并且涉及到Redis集群的数据同步问题等等。想了解的伙伴也能够留言,我会专门写一篇来介绍的。

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

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

Redis的同步机制了解么?

Redis可使用主从同步,从从同步。第一次同步时,主节点作一次bgsave,并同时将后续修改操做记录到内存buffer,待完成后将RDB文件全量同步到复制节点,复制节点接受完成后将RDB镜像加载到内存。加载完成后,再通知主节点将期间修改的操做记录同步到复制节点进行重放就完成了同步过程。后续的增量数据经过AOF日志同步便可,有点相似数据库的binlog。

是否使用过Redis集群,集群的高可用怎么保证,集群的原理是什么?

Redis Sentinal 着眼于高可用,在master宕机时会自动将slave提高为master,继续提供服务。

Redis Cluster 着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。

面试结束

小伙子你能够的,何时有时间来上班啊,要不明天就来吧?

你强装镇定,这么急啊我还须要租房,要不下礼拜一吧。

好的 心想这小子这么NB是否是不少Offer在手上,不行我得叫hr给他加钱。

能撑到最后,你本身都忍不住本身给本身点个赞了!

暗示点赞,每次都看了不点赞,大家想白嫖我么?大家好坏喲,不过我喜欢)。

总结

在技术面试的时候,无论是Redis仍是什么问题,若是你能举出实际的例子,或者是直接说本身开发过程的问题和收获会给面试官的印象分会加不少,回答逻辑性也要强一点,不要东一点西一点,容易把本身都绕晕的。

还有一点就是我问你为啥用Redis你不要一上来就直接回答问题了,你能够这样回答:

帅气的面试官您好,首先咱们的项目DB遇到了瓶颈,特别是秒杀和热点数据这样的场景DB基本上就扛不住了,那就须要缓存中间件的加入了,目前市面上有的缓存中间件有 RedisMemcached ,他们的优缺点……,综合这些而后再结合咱们项目特色,最后咱们在技术选型的时候选了谁。

若是你这样有条不紊,有理有据的回答了个人问题并且还说出这么多我问题外的知识点,我会以为你不仅是一个会写代码的人,你逻辑清晰,你对技术选型,对中间件对项目都有本身的理解和思考,说白了就是你的offer有戏了。

最后说一下服务器,最近双十一,阿里云的服务器对新用户很友好(老用户悄悄用爸妈手机注册),贼便宜!

经过个人连接购买,一年最低仅需86块(新用户专享,若是不是新用户的能够用家里人的帐号购买),80一年,200三年我以为跟白嫖差很少,我直接用老妈帐号买了三年的,准备搭建一个小项目玩玩。你们能够买来玩玩,想看服务器文章的朋友留言给我,能够的话我会写一期怎么利用服务器的文章。

点个人连接去买有优惠哟

好了各位,以上就是这篇文章的所有内容了,我后面会每周都更新几篇《吊打面试官》系列和Java技术栈相关的文章。若是你有什么想知道的,也能够留言给我,我一有时间就会写出来,咱们共同进步。

很是感谢您能看到这里,若是这个文章写得还不错的话 求点赞 求关注 求分享 求留言 (对我很是有用)各位的支持和承认,就是我创做的最大动力,咱们下篇文章见!

敖丙 | 文 【原创】


后面会持续更新《吊打面试官》系列能够关注个人公众号 JavaFamily 第一时间阅读,也会有朋友一线大厂的内推机会不按期推出(字节跳动,阿里,网易,PDD,滴滴,蘑菇街等),就业上有什么问题也能够直接微信滴滴我,我也是个新人,不过不影响咱们一块儿进步,做为渣男,我给不了你工做,还给不了你温暖嘛?

相关文章
相关标签/搜索