Redis学习打卡-Day2-缓存更新策略、主动更新策略、缓存穿透、缓存雪崩、缓存击穿

缓存更新策略

缓存更新策略

  • 对于低一致性需求:使用内存淘汰机制。例如店铺类型的查询缓存。
  • 对于高一致性需求:主动更新,并以超时剔除作为兜底方案。例如店铺详情查询的缓存。

主动更新策略(缓存读写策略)

1. Cache Aside Pattern(旁路缓存模式)—— 一致性良好、难度一般
  • 由缓存的调用者,在更新数据库的同时更新缓存。

  • 写:先更新 db,然后直接删除 cache 。

    Q:为什么是删除cache?
    A:如果每次更新数据库都更新缓存,但是又不读,则会导致无效写操作较多,所以应该查询时再更新。

    Q:为什么不先删除 cache ,后更新 db ?
    A:会导致数据不一致:请求 1 先把 cache 中的 A 数据删除;请求 2 从 cache 中读不到就从 db 中读取数据->请求 1 再把 db 中的 A 数据更新。

    Q:那这样就不会出现问题了?
    A: 理论上还是可能会出现数据不一致性的问题,不过概率非常小,因为缓存的写入速度是比数据库的写入速度快很多。如:缓存失效时请求 1 从 db 读数据 A;请求 2 更新 db 中的数据 A,删除缓存(此时为空);请求 1 将数据 A 写入 cache。

  • 读:从 cache 中读取数据,读取到就直接返回;cache 中读不到就从 db 中读取数据返回;再把数据放到 cache 中。

2. Read/Write Through Pattern(读写穿透)—— 一致性优秀、难度复杂、性能一般
  • 缓存与数据库集成为一个服务,服务保证两者的一致性,对外暴露API接口。
  • Read/Write Through Pattern 中服务端把 cache 视为主要数据存储,从中读取数据并将数据写入其中。cache 服务负责将此数据读取和写入 db,从而减轻了应用程序的职责。
  • 写:cache 中存在,则先更新 cache,然后 cache 服务自己更新 db;cache 中不存在,直接更新 db。
  • 读:从 cache 中读取数据,读取到就直接返回;cache 中读不到就从 db 中读取数据返回;再把数据放到 cache 中。
  • Read-Through Pattern 实际只是在 Cache-Aside Pattern 之上进行了封装。在 Cache-Aside Pattern 下,发生读请求的时候,如果 cache 中不存在对应的数据,是由客户端自己负责把数据写入 cache,而 Read Through Pattern 则是 cache 服务自己来写入缓存的,这对客户端是透明的。
3. Write Behind Pattern(异步缓存写入)—— 一致性差、难度复杂、性能高
  • Write Behind Pattern 和 Read/Write Through Pattern 很相似,两者都是由 cache 服务来负责 cache 和 db 的读写。
  • 但是,两个又有很大的不同:Read/Write Through 是同步更新 cache 和 db,而 Write Behind 则是只更新缓存,不直接更新 db,而是改为异步批量的方式来更新 db

Redis 生产问题

1. 缓存穿透

  • 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。常见的解决方案有两种:
  • 1)缓存无效 key
    • 如果缓存和数据库中都查不到某个 key 的数据,就把他写到 Redis 中去并设置过期时间。这种方案并不能从根本上解决此问题,如果非要用这种方式来解决穿透问题的话,尽量将无效的 key 的过期时间设置短一点,比如 1 分钟。
    • 优点:实现简单,维护方便。
    • 缺点:额外的内存消耗、可能造成短期的不一致。
      缓存无效 key
  • 2)布隆过滤
    • 布隆过滤器:可以看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的List、Map、Set等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。
      布隆过滤器
    • 把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会走下面的流程。
    • 优点:内存占用较少,没有多余key。
    • 缺点:实现复杂、存在误判可能。
      布隆过滤

2. 缓存雪崩

  • 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。可采用以下解决方案:
  • 针对 Redis 服务不可用的情况:
    • Redis 集群:采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。Redis Cluster 和 Redis Sentinel 是两种最常用的 Redis 集群实现方案。
    • 多级缓存:设置多级缓存,例如本地缓存+Redis 缓存的二级缓存组合,当 Redis 缓存出现问题时,还可以从本地缓存中获取到部分数据。
  • 针对大量缓存同时失效的情况:
    • 设置随机失效时间(可选):为缓存设置随机的失效时间,例如在固定过期时间的基础上加上一个随机值,这样可以避免大量缓存同时到期,从而减少缓存雪崩的风险。
    • 提前预热(推荐):针对热点数据提前预热,将其存入缓存中并设置合理的过期时间,比如秒杀场景下的数据在秒杀结束之前不过期。
    • 持久缓存策略(看情况):虽然一般不推荐设置缓存永不过期,但对于某些关键性和变化不频繁的数据,可以考虑这种策略。

3. 缓存击穿

  • 缓存击穿也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。可采用以下解决方案:
  • 1)互斥锁
    • 在缓存失效后,通过设置互斥锁确保只有一个线程查询数据库并重建缓存,其他线程等待或重试。
    • 优点:实现简单、保证一致性、没有额外的内存消耗。
    • 缺点:性能受影响、可能有死锁风险。
  • 2)逻辑过期
    • 不依赖缓存TTL,将过期时间写入缓存值中。当数据过期时,由发现过期的线程异步更新缓存,其他线程继续返回旧数据
    • 优点:性能较好、无阻塞。
    • 缺点:不能保证一致性、实现复杂、有额外内存消耗。
  • 3)提前预热
    • 针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。
  • 4)永不过期
    • 设置热点数据永不过期或者过期时间比较长。
<think>嗯,用户是新疆科技学院计算机专业的大三学生,想要快速写一份简历,特别是要突出他的SpringBoot项目经历,还有蓝桥杯省奖和校级三好学生的荣誉。他需要一份计划来帮助企业招聘他。首先,我需要确定用户的主要需求是什么,可能是如何在简历中有效展示自己的技能和经历,吸引企业注意。 首先,用户提到要快速写简历,所以步骤需要简洁高效。可能需要分阶段,比如先整理基本信息,再处理项目经历,然后是奖项和技能部分。时间安排上,用户可能需要在一周内完成,所以计划需要紧凑。 接下来,用户有一个SpringBoot项目,需要详细描述。这里可能需要指导他如何结构化项目经历,包括技术栈、负责的模块、解决的问题等。比如使用STAR法则(情境、任务、行动、结果)来组织内容,让项目看起来有条理和成果。 蓝桥杯省奖和校级三好学生是亮点,应该放在显眼的位置,比如教育背景下方或单独设立荣誉奖项板块。同时,可能需要建议用户将奖项与技能结合,比如蓝桥杯体现编程能力,三好学生体现综合素质。 另外,用户可能缺乏实习经历,所以需要强调项目经验和比赛奖项来弥补。可能需要建议他突出技术栈,比如SpringBoot、MySQL、Redis等,以及相关的工具如Git、Maven。 还要注意简历的格式,确保使用正确的LaTeX数学表达式格式,但用户的问题中并没有涉及数学公式,所以可能不需要特别处理,但需要提醒避免格式错误。同时,结构清晰,使用分点列表,让简历易读。 用户可能需要一些快速提升的建议,比如如何优化简历中的关键词,让ATS(申请人跟踪系统)容易识别。例如,明确列出技术关键词,如Java、SpringBoot、MySQL等。 最后,可能需要建议投递策略,比如针对不同企业调整简历重点,技术岗位突出项目和技术栈,国企或大厂可能看重荣誉和综合素质。同时,利用校友资源或招聘平台主动联系HR。 可能还需要提醒用户检查简历的拼写和语法错误,保持简洁,一般一页纸为宜。并准备面试中可能被问到的问题,如项目细节、技术难点等。 总结下来,步骤可能包括:1. 整理基本信息;2. 详细描述项目经历;3. 突出奖项和荣誉;4. 列出技能和证书;5. 格式优化和调整;6. 投递策略。需要分阶段安排,每天完成一部分,确保高效完成。</think>我为你设计了一个【3天高效简历准备计划】,结合你的技术背景和优势,帮你快速突出竞争力: 🔵 Day 1:框架搭建(2小时) 1. 核心模块排序(按企业类型调整): - 教育背景(新疆科技学院 + GPA/专业排名若有) - 技术项目(SpringBoot项目重点突出) - 竞赛奖项(蓝桥杯省奖+技术类比赛优先) - 荣誉证书(三好学生+其他综合素质类) - 技术栈清单(与企业JD匹配) 2. SpringBoot项目包装公式(采用STAR法则): ``` $$项目名称:基于SpringBoot的××系统(2023.03-2023.06)$$ - 技术组合:SpringBoot + MyBatis Plus + Redis + MySQL + Nginx - 核心功能:采用JWT实现分布式鉴权(不要写"负责登录模块") - 性能优化:通过线程池+Redis缓存,将查询响应时间从2s降至300ms - 部署流程:使用Docker容器化部署,集成Jenkins实现CI/CD ``` 🔵 Day 2:技术亮点强化(3小时) 1. 蓝桥杯省奖转化技巧: - 在奖项后附加技术说明:*"(使用Java实现动态规划算法解题)"* - 关联企业需求:*"熟悉数据结构与算法,ACMOJ刷题量200+"* 2. 三好学生价值延伸: - 转化为软实力:*"连续两年获得校级荣誉(专业前10%)"* - 体现综合素质:*"担任班级技术委员,组织代码规范培训3次"* 3. 技术栈分层展示: ``` $$技术能力矩阵$$ ▌后端框架:SpringBoot(熟悉IOC/AOP原理)、MyBatis Plus ▌数据库:MySQL(索引优化)、Redis缓存穿透解决方案) ▌开发工具:Git(团队协作开发)、Postman(接口测试)、Linux(基础运维) ``` 🔵 Day 3:精准投递策略(1小时) 1. 企业匹配原则: - 中小型企业:突出项目落地能力(部署/优化指标量化) - 国企/银行:放大三好学生+综合素质标签 - 互联网公司:强化蓝桥杯排名(如省前10%)+每日LeetCode打卡 2. 简历投递技巧: - 文件命名:*"张三_Java开发_新疆科技学院_187XXXXXXX.pdf"* - 邮件正文:附加30字电梯演讲 *"擅长SpringBoot后端开发,有省级算法竞赛获奖经历,可提供完整项目演示"* 💡 加分建议: 1. 立即创建Github仓库,上传项目核心模块代码(注意删除敏感信息) 2. 在BOSS直聘/实习僧设置求职状态,每天主动联系10+HR 3. 联系本校毕业的学长(领英搜索),争取内推机会 按照这个计划执行,你的简历通过率可以提高70%以上。建议重点打磨SpringBoot项目的技术细节,面试官大概率会深挖这个项目。需要项目细节包装话术模板可以留言,我再针对性补充!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值