大家好,我是散步 coding, 最近在整顿 2022 年 Redis 最新面试题, 大家也能够通过我上面的博客地址在线浏览, 明天讲讲第 8 篇 – Redis 缓存问题。本文首发于公众号: 散步 coding
2022 年 Redis 最新面试题目录
- Redis 基础知识
- Redis 数据结构
- Redis 事务
- Redis 数据长久化
- Redis 集群
- Redis 淘汰策略
- Redis 分布式锁
- Redis 缓存问题
- 运维和部署
缓存问题
- 分布式缓存
- Redis 缓存雪崩
- Redis 缓存击穿
- Redis 缓存穿透
- 缓存预热
- 缓存降级
Redis 缓存雪崩
呈现概率: ★★★★★
这个在 Redis 面试的题目中算是出镜率特地高的问题了, 倡议认真消化一下。
1)、缓存雪崩是指 <font color=#FF000 > 大量的缓存 key</font> 无奈在 Redis 缓存中进行解决,紧接着,<font color=#FF000 > 短时间大量申请间接打到数据库层 </font>,导致数据库层的压力激增, 可能霎时就会导致数据库宕机。
缓存雪崩个别是由两个起因导致的,应答计划也有所不同,咱们一个个来看。
第一个起因是:缓存中有大量数据同时过期,比如说一些 APP 首页缓存数据,都设置了当天无效,凌晨过期,在第二天流量顶峰时, 大量用户拜访的申请,没有换成从数据库中读取数据。如果利用的并发申请量很大,那么数据库的压力也忽然变得很大,可能会造成缓存雪崩。
这种相似的问题解决思路也根本简略, 打散过期工夫, 比方设置过期工夫为 24 小时之后 + 随机 N 分钟。
另外一个起因是 Redis 宕机, 这个就须要剖析 Redis 宕机的起因了,是因为磁盘满了还是内存满了, 依据状况进行解决,或者升配置什么的。
如果是内存满了, 也须要思考是不是缓存过期回收策略的问题。
Redis 缓存击穿
呈现概率: ★★★★
缓存击穿跟缓存雪崩有点相似,缓存雪崩是大规模的 key 生效,而 <font color=#FF000 > 缓存击穿是某个热点的 key 生效 </font>,大并发集中对其进行申请,就会造成大量申请读缓存没读到数据,从而导致高并发拜访数据库,引起数据库压力剧增。这种景象就叫做缓存击穿。
解决方案:
a)、在缓存生效后,通过互斥锁或者队列来管制读数据写缓存的线程数量,比方某个 key 只容许一个线程查问数据和写缓存,其余线程期待。这种形式会阻塞其余的线程,此时零碎的吞吐量会降落
b)、热点数据缓存永远不过期。
永不过期理论蕴含两层意思:
物理不过期,针对热点 key 不设置过期工夫
逻辑过期,把过期工夫存在 key 对应的 value 里,如果发现要过期了,通过一个后盾的异步线程进行缓存的构建
Redis 缓存穿透
呈现概率: ★★★★
缓存穿透是指用户申请的数据在 <font color=#FF000 > 缓存中不存在即没有命中,同时在数据库中也不存在 </font>,导致用户每次申请该数据都要去数据库中查问一遍。
如果短时间大量相似申请落在数据库上,造成数据库压力过大,可能导致数据库承受不住而宕机解体。
解决办法:
a)、将有效的 key 寄存进 Redis 中:
当呈现 Redis 查不到数据,数据库也查不到数据的状况,咱们就把这个 key 保留到 Redis 中,设置 value=”null”,并设置其过期工夫极短,前面再呈现查问这个 key 的申请的时候,间接返回 null,就不须要再查询数据库了。但这种解决形式是有问题的,如果传进来的这个不存在的 Key 值每次都是随机的,那存进 Redis 也没有意义。
b)、应用布隆过滤器:
如果布隆过滤器断定某个 key 不存在布隆过滤器中,那么就肯定不存在,如果断定某个 key 存在,那么很大可能是存在 (存在肯定的误判率)。于是咱们能够在缓存之前再加一个布隆过滤器,将数据库中的所有 key 都存储在布隆过滤器中,在查问 Redis 前先去布隆过滤器查问 key 是否存在,如果不存在就间接返回,不让其拜访数据库,从而防止了对底层存储系统的查问压力。
Redis 缓存预热
呈现概率: ★★★
缓存预热如字面意思,当零碎上线时,缓存内还没有数据,如果间接提供给用户应用,每个申请都会穿过缓存去拜访底层数据库,如果并发大的话,很有可能在上线当天就会宕机,因而咱们须要在上线前先将数据库内的热点数据缓存至 Redis 内再提供进来应用,这种操作就成为 ” 缓存预热 ”。
缓存预热的实现形式有很多,比拟通用的形式是写个批工作,在启动我的项目时或定时去触发将底层数据库内的热点数据加载到缓存内。
Redis 缓存降级
呈现概率: ★★★
缓存降级是指当访问量剧增、服务呈现问题(如响应工夫慢或不响应)或非核心服务影响到外围流程的性能时,即便是有损局部其余服务,依然须要保障主服务可用。能够将其余主要服务的数据进行缓存降级,从而晋升主服务的稳定性。
降级的目标是保障外围服务可用,即便是有损的。如去年双十一的时候淘宝购物车无奈批改地址只能应用默认地址,这个服务就是被降级了,这里阿里保障了订单能够失常提交和付款,但批改地址的服务能够在服务器压力升高,并发量绝对缩小的时候再复原。
也欢送关注我的公众号: 散步 coding
。一起交换, 在 coding 的世界里散步, 回复: <font color=#FF000 >redis
</font>, 收费获取最新 Redis 面试题 (含答案)。