3道Redis高频面试题详细解析

3道Redis高频面试题详细解析_第1张图片

随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点。而缓存的使用成为一个重点。redis 作为缓存中间件的一个佼佼者,成为了面试必问项目。本文分享一下Redis几道常见的面试题:

缓存雪崩

1.1什么是缓存雪崩?

如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了。

3道Redis高频面试题详细解析_第2张图片

我们都知道Redis不可能把所有的数据都缓存起来(内存昂贵且有限),所以Redis需要对数据设置过期时间,并采用的是惰性删除+定期删除两种策略对过期键删除。

如果缓存数据设置的过期时间是相同的,并且Redis恰好将这部分数据全部删光了。这就会导致在这段时间内,这些缓存同时失效,全部请求到数据库中。

这就是缓存雪崩:Redis挂掉了,请求全部走数据库。

缓存雪崩如果发生了,很可能就把我们的数据库搞垮,导致整个服务瘫痪!

1.2如何解决缓存雪崩?

在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期。

对于“Redis挂掉了,请求全部走数据库”这种情况,我们可以有以下的思路:

事发前:实现Redis的高可用(主从架构+Sentinel 或者Redis Cluster),尽量避免Redis挂掉这种情况发生。

事发中:万一Redis真的挂了,我们可以设置本地缓存(ehcache)+限流(hystrix),尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)

事发后:redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。

缓存穿透

2.1什么是缓存穿透

缓存穿透是指查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。

3道Redis高频面试题详细解析_第3张图片

这就是缓存穿透:

请求的数据在缓存大量不命中,导致请求走数据库。

缓存穿透如果发生了,也可能把我们的数据库搞垮,导致整个服务瘫痪!

2.1如何解决缓存穿透?

解决缓存穿透也有两种方案:

由于请求的参数是不合法的(每次都请求不存在的参数),于是我们可以使用布隆过滤器(BloomFilter)或者压缩filter提前拦截,不合法就不让这个请求到数据库层!

当我们从数据库找不到的时候,我们也将这个空对象设置到缓存里边去。下次再请求的时候,就可以从缓存里边获取了。

这种情况我们一般会将空对象设置一个较短的过期时间。

缓存与数据库双写一致

3.1对于读操作,流程是这样的

如果我们的数据在缓存里边有,那么就直接取缓存的。

如果缓存里没有我们想要的数据,我们会先去查询数据库,然后将数据库查出来的数据写到缓存中。最后将数据返回给请求。

3.2什么是缓存与数据库双写一致问题?

如果仅仅查询的话,缓存的数据和数据库的数据是没问题的。但是,当我们要更新时候呢?各种情况很可能就造成数据库和缓存的数据不一致了。

这里不一致指的是:数据库的数据跟缓存的数据不一致

3道Redis高频面试题详细解析_第4张图片

从理论上说,只要我们设置了键的过期时间,我们就能保证缓存和数据库的数据最终是一致的。因为只要缓存数据过期了,就会被删除。随后读的时候,因为缓存里没有,就可以查数据库的数据,然后将数据库查出来的数据写入到缓存中。

除了设置过期时间,我们还需要做更多的措施来尽量避免数据库与缓存处于不一致的情况发生。

--完--

如果需要Redis视频,可以在公众号后台聊天框回复【Redis视频】,可以免费获取编程视频 。

Redis其它推荐阅读:

Redis 零基础入门视频教程

Linux 安装 Redis 图文教程

刚接触学Redis,看这一篇就够了!

再来聊聊Redis到底是什么?

说说 Redis 数据结构和常用命令

Redis最常见面试问题,附答案!

Redis的字符串是怎么实现的?

阿里巴巴官方 Redis 开发规范!

如何借助 Redis 实现秒杀系统?

如何用Redis实现微博关注关系?

史上最全Redis总结,干货满满!

史上最全 Redis 高可用解决方案总结

如何借助 Redis 实现实现排行榜功能?

10 个正确使用 Redis 的技巧

Redis 分布式锁的正确实现方式

Redis 源码学习之 Redis 事务

详解Redis的内存淘汰策略

Redis 的各项功能,都解决了哪些问题?

为什么单线程的Redis却能支撑高并发?

Redis应用场景,实现功能 “附近的人”

超详细揭秘 Redis 持久化,建议收藏!

详解 Redis AOF 持久化

Redis RDB 持久化详解

后端开发都应该掌握的Redis基础

Redis是如何实现点赞、取消点赞的?

Redis实践:网站搜索的热搜词

如何用 Redis 做实时订阅推送的?

Redis 主从复制以及主从复制原理

如何访问 Redis 中的海量数据?

一文深入了解Redis内存模型!

Redis 导致应用卡死 bug 全过程

Redis常见的几种缓存模式

玩转Redis集群的搭建、命令

Python操作Redis的最佳实践

如何优雅地在Redis中使用Lua脚本

一个基于 Redis 的限流系统的设计!

长按加入10W+朋友的IT圈

觉得内容还不错的话,给我点个“在看”呗

你可能感兴趣的:(数据库,redis,编程语言,java,缓存)