《隔离十四天》系列 -第四天 -如何在面试中应对各种Redis问题

前言

隔离第四天,依然是起床起晚的一天,依然没发烧,身体甚好的一天,也是要好好学习的一天。

这两天接到了很多电话面试,大环境下能收到电话面试也是祈祷了,虽然都没有了下文,但是还是要好好学习啊,不然连电话面试都没有了。
好了言归正传,前两天的面试中遇到了一个这样的问题
在这里插入图片描述

Redis能够作为消息中间件吗?如果能那么是通过哪个数据结构实现的呢?

遇到这个问题,我对于Redis作为消息中间件是肯定的回单,但是对于使用哪个数据结构去实现,我对Redis的数据结构进行分析,Redis中包
含String、Map、List、Sorted Set、Set这五种我熟悉的数据结构,然后就说了一个List。然后又问

那么使用List是如何实现的呢?

我懵了,我的思路是实现消息中间件需要是一个容器,那么也应该是一个队列,就要满足队列的先进先出的原则,而对于List的如何实现我平时
没注意过这方面的知识。

所以今天就来讲一下Redis的各种问题。

在这里插入图片描述

1、如何通过Redis实现消息队列?

答:Redis有String、Map、List、Set、Sorted Set,实现消息队列的话需要使用List,因为对于List的这种数据结构是一种顺序存储的结构,符合队列的先进先出原则,所以使用List。对于实现方法来说,通过list中的lpush以及rpop进行生产数据以及消费数据,当list中没有数据的时候我们可以设定一个sleep,过一会再进行消费。

2、那有没有办法不通过sleep就实现?

答:不通过sleep实现的话还可以通过brpop或blpop来实现阻塞读,这样在没有消息的时候会进行阻塞操作。

3、平时项目中对于Redis主要做什么?

答:主要做数据的缓存以及消息中间件的功能,对于数据缓存来说,秒杀系统以及一些页面数据的缓存等。

4、请说一下缓存与DB的一致性?

答:对于缓存与数据库的一致性问题,对于查询请求,先请求缓存,判断缓存中是否有数据,没有数据再去请求数据库,然后将数据同步到缓存中。对于更新操作,先删除缓存,然后再去更新数据库,这样下次用户查询会将数据同步到缓存中。对于删除请求,也是先删除缓存再删除数据库。

5、如何在在删除缓存后查询请求发送过来,并且检测到没有缓存中没有数据,进入数据库中获取数据,这样数据是旧数据如何解决?

答:对于这个问题我们通过延时双删策略,可以先删除缓存,然后再写数据库,然后休眠一会,再删除缓存,第二种方式是可以通过设定缓存过期时间来解决,通过设定缓存过期时间,后面的请求都会从数据库中获取数据,这样也避免了这个问题。

6、通过Redis做消息队列,如果Redis宕机了消息丢失如何解决?

答:对于消息丢失的问题,Redis提供了RDB和AOF两种持久化方式。
RDB是把内存中的数据以快照的形式写入磁盘,RDB会把整个Redis 的数据保存在一个文件中,它的缺点是在快照保存之间宕机,那么这部分数据会丢失。
AOF是通过一个fork子进程以日志的方式来记录Redis的更新和删除操作,但是也有一定的缺点对于相同规模的数据,AOF在效率上低于RDB。

7、说一下缓存雪崩、穿透和击穿?

答:对于缓存雪崩,发生条件是大量的缓存失效,使请求过来的数据全部打到了DB上,造成了DB的崩溃。对于这种问题,我们可以在设定缓存过期时间时增加一个随机值,这样缓存不会大面积的丢失,还可以通过主从模式来避免缓存雪崩。
对于缓存穿透,缓存穿透是缓存中以及DB中都不存在的数据,用户频繁的发送这些数据的请求,比如我们请求id=-1的数据,在缓存和DB中都不存在,如果大量的去请求,会导致数据库压力过大,击垮数据库。对于这个问题我们可以通过布隆过滤器拦截这些请求,还可以在接口中进行判断将无效的请求拦截下来。
对于缓存击穿,缓存击穿是指大量的请求都去请求一个key,造成整个key扛着大并发,在这个key失效的瞬间,所有的请求又都会打到DB上,造成数据库的崩溃。解决缓存击穿的话可以通过分级缓存的方式,采用 一级缓存和 二级缓存的缓存方式,一级 缓存失效时间短,二级缓存失效时间长。 请求优先从 一级 缓存获取数据,如果 一级缓存未命中则加锁,只有 1 个线程获取到锁,这个线程再从数据库中读取数据并将数据再更新到到 一级 缓存和 二级 缓存中,而其他线程依旧从 二级缓存获取数据并返回。

8、在Redis中key设置同一时间过期,需要注意什么?

答:如果大量的key同时过期,会出现缓存雪崩的情况,所以我们在设置key过期时间时可以将过期时间增加一个随机数,这样使过期时间分散开来,避免缓存雪崩的情况。

如果有其它关于Redis的问题欢迎评论或私信告知,让我也学习一下。

在这里插入图片描述

以上就是自己总结的几个关于Redis的问题,并且用自己的话进行了一个解答,解答如果有问题希望大佬指正共同学习。

在这里插入图片描述

发布了59 篇原创文章 · 获赞 6 · 访问量 4537

猜你喜欢

转载自blog.csdn.net/qq_40126996/article/details/104332783