Redis之缓存更新策略

缓存更新策略

在这里插入图片描述

文章目录

  • 缓存更新策略
    • 一、策略对比
    • 二、常见的缓存更新策略
    • 三、如何选择策略
    • 四、实际应用示例
    • 五、使用 Cache-Aside + TTL 的方式,实现缓存商铺信息详情
      • 1.引入StringRedisTemplate
      • 2.将查询商铺信息加入缓存
      • 3.更新商铺信息时移除缓存
      • 总结
    • 六、注意事项

一、策略对比

内存淘汰超时剔除主动更新
说明不用自己维护,
利用Redis的内存淘汰机制,
当内存不足时自动淘汰部分数据。下次查询时更新缓存。
给缓存数据添加TTL时间,
到期后自动删除缓存。
下次查询时更新缓存。
编写业务逻辑,
在修改数据库的同时,更新缓存
一致性一般
维护成本

业务场景

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

二、常见的缓存更新策略

  1. Cache Aside Pattern旁路缓存模式):由缓存的调用者,在更新数据库的同时更新缓存。
    • 原理
      • 读操作:先查询缓存,若命中则直接返回;未命中则从数据库加载数据并写入缓存。
      • 写操作:先更新数据库,再删除缓存(或更新缓存)。
    • 优点:简单易实现,适用于大多数场景。
    • 缺点:可能存在短暂的数据不一致(如并发写入导致脏数据)。
    • 场景:读多写少、对一致性要求不高的场景。
  2. Read / Write Through Pattern读穿/写穿):缓存与数据库整合为一个服务,由服务来维护一致性。调用者调用该服务,无需关心缓存一致性问题。
    • 读穿透(Read-Through)
      • 当缓存未命中时,由缓存服务自动从数据库加载数据并回填缓存 。
    • 写穿透(Write-Through)
      • 数据更新时,同时写入缓存和数据库,保证两者同步。
    • 优点:对业务透明,数据一致性高。
    • 缺点:写操作延迟较高,依赖缓存服务的可靠性。
    • 场景:强一致性要求的场景。
  3. Write Behind Caching Pattern异步写回):调用者只操作缓存,由其他线程异步地将缓存数据持久化到数据库,保证最终一致性。
    • 原理
      • 写操作仅更新缓存,异步批量将数据持久化到数据库。
    • 优点:写性能极高,减少数据库压力。
    • 缺点:存在数据丢失风险(如系统崩溃时为同步完成的数据)。
    • 场景:允许短暂不一致、写密集型场景(如日志系统)。
  4. 被动更新(TTL刷新)
    • 原理
      • 为缓存设置过期时间(Time-To-Live,TTL),到期后自动失效并从数据库重新加载。
    • 优点:实现简单,避免长期脏数据。
    • 缺点:无法主动控制更新实际,可能出现缓存雪崩(大量缓存同时失效)。
    • 场景:数据变动频率较低的场景。
  5. 主动更新(事件驱动)
    • 原理
      • 当数据库数据变更时(如通过消息队列或出发期),主动通知应用层更新或删除对应缓存。
    • 优点:实时性高,减少无效查询。
    • 缺点:依赖外部系统协同,复杂度较高。
    • 场景:分布式系统中强一致性要求的场景(如电商库存更新)。

注意在使用Cache Aside Pattern方式的工程中,操作缓存和数据库时有三个问题需要考虑

  1. 删除缓存还是更新缓存?
    • 更新缓存:每次更新数据库都更新缓存,无效写操作较多
    • 删除缓存【推荐】:更新数据库时让缓存失效,查询时再更新缓存
  2. 如何保证缓存与数据库的操作同时成功或同时失败?
    • 单体系统:将缓存与数据库操作放在一个事务
    • 分布式系统,利用TCC等分布式事务方案
  3. 先操作缓存还是先操作数据库
    • 先删除缓存,再操作数据库
    • 先操作数据库,再删除缓存 【推荐】

三、如何选择策略

  • 数据一致性要求:强一致性选 Write-Through 或主动更新;弱一致性可选 Cache-Aside 或 TTL。
  • 读写比例:读多写少优先 Cache-Aside;写多考虑 Write-Behind。
  • 系统复杂度:简单场景用 TTL 或 Cache-Aside;复杂场景用事件驱动。
  • 性能需求:高频写入可用 Write-Behind 降低延迟。

四、实际应用示例

  • 电商商品详情页:使用 Cache-Aside + TTL,配合消息队列主动更新热点商品。
  • 社交点赞数统计:采用 Write-Behind 异步更新数据库,保证快速响应。
  • 全局配置信息:Read-Through 确保每次读取都是最新配置。

五、使用 Cache-Aside + TTL 的方式,实现缓存商铺信息详情

1.引入StringRedisTemplate

    @Resourceprivate StringRedisTemplate stringRedisTemplate;

2.将查询商铺信息加入缓存

命中
未命中
存在
不存在
开始
提交商铺id
从Redis查询商铺缓存
判断缓存是否命中
返回商铺信息
结束
根据id查询数据库
判断商铺是否存在
将商铺数据写入Redis
返回404
    @Overridepublic Result queryById(Long id) {// 1.从redis查询商铺缓存String key = CACHE_SHOP_KEY + id;String shopJson = stringRedisTemplate.opsForValue().get(key);// 2.判断是否存在if (StrUtil.isNotBlank(shopJson)) {// 3.存在,直接返回Shop shop = JSONUtil.toBean(shopJson, Shop.class);return Result.ok(shop);}// 4.不存在,根据id查询数据库Shop shop = getById(id);if (shop == null) {// 5.数据库不存在,返回错误return Result.fail("店铺不存在!");}// 6.存在,写入redis,加入过期时间stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop), CACHE_SHOP_TTL, TimeUnit.MINUTES);return Result.ok(shop);}

3.更新商铺信息时移除缓存

    @Overridepublic Result update(Shop shop) {if (shop.getId() == null) {return Result.fail("店铺id不能为空!");}// 1.更新数据库updateById(shop);// 2.删除缓存stringRedisTemplate.delete(CACHE_SHOP_KEY + shop.getId());return Result.ok();}

总结

使用 Cache-Aside + TTL 缓存更新策略的最佳实践方案:

  1. 低一致性需求:使用Redis自带的内存淘汰机制
  2. 高一致性需求:主动更新,并以超时剔除作为兜底方案
    • 读操作:
      • 缓存命中则直接返回
      • 缓存未命中则查询数据库,并写入缓存,设定超时时间
    • 写操作:
      • 先写数据库,然后再删除缓存
      • 要确保数据库与缓存操作的原子性

六、注意事项

  • 缓存穿透:恶意请求不存在的 key,可通过布隆过滤器防御。
  • 缓存雪崩:大量 Key 同时失效,需设置随机 TTL 或禁用失效时间。
  • 缓存击穿:热点 Key 失效瞬间高并发,可用互斥锁(Mutex Luck)保护。

缓存更新策略的选择需结合业务场景、数据特点和技术架构综合权衡,没有绝对的最优解,只有最适合的方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工具变量】各地级市人口集聚及多中心程度数据集(2000-2023年)

多中心程度描述的是一个城市或区域内多个功能性中心的存在和分布情况;人口集聚度是指一定区域内人口的集中程度,它反映了区域内人口分布的不均衡性,这两个概念相互关联,通过分析地级市的多中心程度及人口集聚度可以帮助研究者理解…

函数对象-C++

1.定义 2.特点 、 1.解释第一句 #include<stdio.h> using namespace std; #include<string> #include<map> #include <iostream> class print { public:void operator()(string s){cout << s << endl;} }; int main() {print print;pri…

Apifox下载安装与使用

一、Apifox下载 官网地址:Apifox 点击"免费下载",即可进行下载。 二、Apifox安装 双击安装文件即可安装。

Python与图像处理:从基础操作到智能应用的全面解析

目录 一、Python图像处理的三大核心优势 1.1 生态库矩阵支撑 1.2 开发效率革命 1.3 跨领域协同能力 二、六大核心处理技术详解 2.1 图像基础操作 2.2 图像增强技术 2.3 特征提取算法 2.4 目标检测技术 2.5 图像分割技术 2.6 图像生成技术 三、实战案例&#xff1a;智…

双 Token 与 单 Token 优缺点

双Token与单Token认证机制对比 在Web应用开发中&#xff0c;身份认证和授权是保障系统安全的核心环节。随着技术演进&#xff0c;基于Token的认证机制逐渐取代传统Session方案&#xff0c;而双Token与单Token架构的选型争议也日益成为开发者关注的焦点。本文将从技术原理、优缺…

Spring Boot管理Spring MVC

Spring Boot真正的核心功能是自动配置和快速整合&#xff0c;通常Spring Boot应用的前端MVC框架依然使用Spring MVC。Spring Boot提供的spring-boot-starter-web启动器嵌入了Spring MVC的依赖&#xff0c;并为Spring MVC提供了大量自动配置&#xff0c;可以适用于大多数Web开发…

1.凸包、极点、极边基础概念

目录 1.凸包 2.调色问题 3.极性(Extrem) 4.凸组合(Convex Combination) 5.问题转化(Strategy)​编辑 6.In-Triangle test 7.To-Left-test 8.极边&#xff08;Extream Edges&#xff09; 1.凸包 凸包就是上面蓝色皮筋围出来的范围 这些钉子可以转换到坐标轴中&#xff0…

《如何用 Function 实现动态配置驱动的处理器注册机制?》

大家好呀&#xff01;&#x1f44b; 今天我们来聊聊一个超实用的技术话题 - 如何用Java的Function接口实现动态配置驱动的处理器注册机制。听起来很高大上&#xff1f;别担心&#xff0c;我会用最简单的方式讲清楚&#xff01;&#x1f60a; 一、为什么要用Function实现处理器…

【最新版】芸众商城独立版源码 425+插件 全新后台框架

一.系统介绍 芸众商城系统最新版 已经更新425全插件版&#xff0c;一套系统支持各种新零售、商城、模式&#xff0c;天天美丽链动商城。不要相信那些外面的旧版本。旧版本等于是废品&#xff0c;无法小程序运营的&#xff0c;框架还是旧的&#xff01; 芸众系统最新版 服务器可…

java 设计模式之单例模式

简介 单例模式&#xff1a;一个类有且仅有一个实例&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有一个对象被创建。 特点&#xff1a;类构造器私有、持有自己实例、对外提供获取实例的静态方法。 单例模式的实现方式 饿汉式 类被加载时&#xff0c;就会实例…

Milvus 索引如何选择

以下是几种索引类型的特点及适用场景&#xff0c;可据此选择&#xff1a; AUTOINDEX 特点&#xff1a;数据库自动选择合适索引类型&#xff0c;无需深入了解索引细节。适用场景&#xff1a;对索引知识了解有限&#xff0c;或不确定哪种索引适合当前数据和查询需求&#xff0c…

CentOS 7 安装教程

准备&#xff1a; 软件&#xff1a;VMware Workstation 镜像文件&#xff1a;CentOS-7-x86_64-bin-DVD1.iso &#xff08;附&#xff1a;教程较为详细&#xff0c;注释较多&#xff0c;故将操作的选项进行了加粗字体显示。&#xff09; 1、文件–新建虚拟机–自定义 2、硬盘…

TAS启动与卸载

3. 启动TAS&#xff08;Thin-Agent服务&#xff09; TAS在安装完成后通常会自动启动&#xff0c;并在系统重启时自启。如需手动启动&#xff0c;请按以下步骤操作&#xff1a; &#xfffc; 3.1 在Windows上启动TAS 1. 打开 Windows服务管理器&#xff1a; ◦ 按下 Win R&…

Redis面试——数据结构

一、SDS如何防止缓冲区溢出&#xff1f; Redis 的 String 类型通过 SDS&#xff08;Simple Dynamic String&#xff09;来防止缓冲区溢出&#xff0c;具体机制如下&#xff1a; Redis 的 String 类型底层采用 SDS 实现&#xff0c;即 Simple Dynamic StringSDS 底层维护的数据…

Doris的向量化执行如何支撑分布式架构和复杂查询

Doris 的向量化执行能力与其 分布式架构 和 复杂查询优化 深度结合&#xff0c;通过 批处理 列式计算 分布式调度 的协同设计&#xff0c;解决传统分布式数据库在复杂查询场景下的性能瓶颈。以下是具体原理展开&#xff1a; 一、向量化如何适配分布式架构&#xff1f; Doris…

DataInputStream 终极解析与记忆指南

DataInputStream 终极解析与记忆指南 一、核心本质 DataInputStream 是 Java 提供的数据字节输入流,继承自 FilterInputStream,用于读取基本数据类型和字符串的二进制数据。 作用:1.专门用来读取使用DataOutputStream流写入的文件 注意:读取的顺序要和写入的顺序一致(…

云转型(cloud transformation)——不仅仅是简单的基础设施迁移

李升伟 编译 云转型不仅仅是迁移基础设施&#xff0c;更是重塑企业运营、创新及价值交付的方式。它具有战略性、持续性&#xff0c;并影响着人员、流程和平台。 ☁️ 云转型涉及以下内容&#xff1a; &#x1f504; 应用现代化——从单体架构转向微服务架构。 ⚙️ 运营自动…

Java HTTP Client API详解

Java HTTP Client API详解 Java的HTTP客户端API经历了多次演进&#xff0c;从早期的HttpURLConnection到第三方库如Apache HttpClient&#xff0c;再到Java 11引入的标准HttpClient。本文将全面解析Java中主要的HTTP客户端API&#xff0c;包括特性对比、使用方法和最佳实践。 …

如何深入理解引用监视器,安全标识以及访问控制模型与资产安全之间的关系

一、核心概念总结 安全标识(策略决策的 “信息载体) 是主体&#xff08;如用户、进程&#xff09;和客体&#xff08;如文件、数据库、设备&#xff09;的安全属性&#xff0c;用于标记其安全等级、权限、访问能力或受保护级别&#xff0c;即用于标识其安全等级、权限范围或约束…

京东3D空间视频生成技术探索与应用

1. 背景 近年来&#xff0c;随着社交媒体、流媒体平台以及XR设备的快速发展&#xff0c;沉浸式3D空间视频的需求迅猛增长&#xff0c;尤其是在短视频、直播和电影领域&#xff0c;正在重新定义观众的观看体验。2023年&#xff0c;苹果公司发布的空间视频技术为这一趋势注入了新…