自身经验--Redis的秋招面经(一)

今天去一家公司面试,由于在简历里面有写到项目中使用到了Redis,所以面试官就抓着这个问题问了好多知识点,我每个问题都有回答到,但是自己是觉得有的答案不太完整,所以面试结束,针对问题,整理一份文档。

主要分成三个部分:
第一是面试问到的问题。
第二个是根据面试过程中的体验总结的一些面试经验,可能有的不太正确,请大家见谅和改正。
第三部分就是问题的相关答案。

-----------------------------------------开始表演了-------------------------------------------------

一、你的项目中使用到了Redis,为什么要使用这个?

问题解析:一般这种问题就是在问,Redis相比较其他的数据库有什么好处,使用Redis对你的项目有什么帮助,一定要结合项目来说,这样子显得对Redis的体验更深。面试官的问题回答完之后可以再稍微表现一下自己,说一些关于Redis的其他特征。

面试答案:我的项目是一个类似于当当网的图书平台【结合自身项目去说】,里面每个页面都有好多的图片需要进行快速加载,对性能要求很高,但数据量大,大概有30000+【好像也不太多】,如果纯粹使用数据库,性能会有问题,使用redis来分担部分性能压力,将图片数据存储到redis中,页面展示等依旧是数据库,需要高效查询的部分使用redis,提高效率。除此之外,在接触到Redis之后,还发现了Redis其他的优势,比如:
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
(2) 支持丰富数据类型,有5个不同的数据类型
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

二、说一下Redis的数据结构?

问题解析:我刚听到这个问题,第一反应是key-value,但是想想在上一个问题里面说过了,不可能是问这个,所以就回答了Redis的五种数据类型,结果看面试官的反应,我的猜测是正确的。【如果不放心的宝宝可以先回答Redis的key-value,再回答五种类型,以防万一

面试答案:脑子里面记住这张图,大概说一下,就没什么问题了。
在这里插入图片描述

三、Redis的持久化了解过没有?

问题解析:这个问题就很显而已懂,阐述一下Redis的持久化。但是如果可以从Redis存在持久化特征的原因开始说起,再到怎么去实现持久化,会更好一点。

面试答案:由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁 盘上,当redis重启后,可以从磁盘中恢复数据。
redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时 dump到磁盘上),另外一种是AOF持久化(原理是将Reids的操作日志以追加的方式写入文件)。

四、那你说的这两个方式分别是怎么实现的?

问题解析:问到这个问题,有种自己挖坑给面试官跳,结果他还跳进去感觉,感觉贼爽了【前提是对于这两种方式,是真的可以说出来中间的过程和不同点,不然就是自己挖坑自己跳,还给里面放了毒针
如果想更深一点了解这个问题,可以看看这个链接,觉得写的不错

面试答案:RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是单独分一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。个人觉得这个比较省事。

五、在项目中遇到redis性能问题了吗?

问题解析:我的项目不大,虽然上线了,但是访问的人也不多,人贵在自知之明嘛,所以也不太可能出现什么性能问题,但是该了解的还是需要了解的,资料得看呀。建议各位宝宝面试中实话实说,没有遇到就没有遇到,知道的就知道,不知道就说我了解的就这么多了,千万不能乱说,面试官都是抗战一线的,当然一眼就可以看出来了。
面试答案:我的项目中暂时没有遇到性能问题,不过我下来之后在学习Redis的时候,看到过一篇博客,写的很好,大概内容就是:

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

(4) 尽量避免在压力很大的主库上增加从库

(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…

这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

六、Redis的应用Key很大,如何取出特定的key呢?

问题解析:个人觉得这种问题是一个分界点,如何在大量的数据中取出特定的一位,不仅和算法有关系也和数据结构有关系,所以这个问题一般问的挺多的,朋友遇到过几个,我没遇到过,可能运气不太好。由于Redis的数据结构有五种,所以就应该从五种不同的角度出发去说这个问题,还可以显得思维严谨。
面试答案:一般取出特定的key,每个数据结构都有各自的特色,所以我打算从五个方面分贝说起。【能说多少说多少】
(一)Sting字符串 Redis Get 命令用于获取指定 key 的值。如果 key 不存在,返回 nil 。如果key 储存的值不是字符串类型,返回一个错误。
(二)hash Redis Hget 命令用于返回哈希表中指定字段的值。如果给定的字段或 key 不存在时,返回 nil 。
(三)list列表 Redis Lindex 命令用于通过索引获取列表中的元素。 如果指定索引值不在列表的区间范围内,返回 nil 。还可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
(四)Set集合 Redis Sinter 命令返回给定所有给定集合的交集。 不存在的集合 key 被视为空集。 当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
(五)ZSet 有序集合 如果成员是有序集 key 的成员,返回 member 的排名。 如果成员不是有序集 key 的成员,返回 nil 。

-----------------------------------------拜拜------------------------------------------------------------
好啦,今天的分享就先写到这里,因为真的面试官就转到数据结构哪里去了,开始问HashMap
如果想看看,这里有一个链接,也是关于面试经验的。