缓存系统设计:缓存击穿,缓存雪崩,缓存穿透,缓存预热

本文深入探讨了缓存系统中常见的三大问题:缓存击穿、缓存雪崩及缓存穿透,分析了其产生的原因及对系统的影响,并提出了有效的应对策略,包括互斥锁、永不过期、逻辑过期、随机过期时间、缓存不存在的值及BloomFilter等。

缓存击穿

假设一个缓存系统中存在一个热Key,每分每秒都有大量的请求访问这个key,那么当这个热key因为过期而失效,一瞬间所有的请求直接打到DB上,这种场景称做缓存击穿。

 

为了避免这种问题业界一般有如下解决方案

1.互斥锁

当缓存过期时,常见的逻辑是直接请求DB,然后再set回缓存中。为了避免缓存击穿的问题,可以在请求DB的地方加一个锁(如果是分布式系统就需要使用分布式锁),争取到锁的就去访问DB,没争取到的就阻塞一段时间再请求缓存,减少直接打到DB的请求。

2.永不过期

不给key设置有效期,让key永不过期,然后以定时任务的形式,主动去更新缓存。

3.逻辑过期

同样不给key设置有效期,而是将expired值作为缓存数据的一个字段放入缓存中,取出来时校验一下是否过期,如果过期了则重新设置有效期,并起一个异步线程去更新这缓存。

 

缓存雪崩

假设一个缓存系统中,大量的key用的都是同一个expired值,那么在某一瞬间,这些key可能会集体全部失效,所有的请求直接打到DB上,这种场景称作缓存雪崩

如何解决?

1.随机过期时间

将数据写入缓存时往往会设置一个expired值,为了避免在某一时间统统全部过期,可以在expired值的基础上加上1~5min的随机值,避免这种情况。这样缓存就不会在某一瞬间突然全部过期了。

 

缓存穿透

当用户访问一个不存在的key时,缓存取不到,按逻辑就是从库里面取,这种请求一多,打到DB的请求也就增加了,这种场景称作缓存击穿。

如下,用户不断请求用户信息,但ID都为无效的负数,缓存里面没有,所有请求可能直接打到DB上,如果是恶意请求的话,危害颇大。

GET /user/-1

GET /user/-2

....

GET /user/-3

1.缓存不存在的值

如果查询到一个空的结果时,可以仍然将这个空的结果进行缓存,下次在请求的话就会这就返回这个空的结果而不是请求DB。当然,如果这种请求一多,存储里就会存储大量这种无效值,对缓存的空间也是一种压力,所以推荐使用下面BloomFilter的方式。

2.BloomFilter

BloomFilter的特性就是当BloomFilter认为有数据时,是可能有,当认为没有数据时,那就是真没有。故可以利用BloomFilter的特性,挡掉这些不存在的请求。

 

缓存预热 

系统刚启动,缓存还未完全构建,但是用户不会管这么多,直接一股脑的访问过来,请求又直接打到DB了。如果遇到这种场景,可以利用缓存预热的思想,在系统启动时调用一个后台接口,构建一遍缓存。

转载于:https://www.cnblogs.com/fudashi233/p/10706750.html

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值