为什么是删除缓存,而不是更新缓存?

简介: 本文介绍了数据库与缓存一致性的常见方案——Cache-Aside Pattern(旁路缓存模式),并分析了其工作流程及优势。该模式通过应用程序显式管理缓存,确保数据一致性。文章详细探讨了删除缓存而非更新缓存的原因,包括避免数据不一致、简化操作、减少并发问题及提高性能。删除缓存能有效保证下次请求获取最新数据,尤其在高并发场景下,确保系统的简单性和可靠性。

一、事情起因

一般来说数据库与缓存一致性的方案大致有以下几种:


添加图片注释,不超过 140 字(可选)


其中Cache-Aside Pattern,也被称为旁路缓存模式应该是使用的比较广泛


添加图片注释,不超过 140 字(可选)


Cache-Aside Pattern,也被称为旁路缓存模式,是一种常见的缓存设计模式,其中缓存的管理由应用程序显式处理。在这种模式下,应用程序负责决定何时读取、写入和使缓存失效,而不是由缓存系统自动处理。

以下是 Cache-Aside 模式的基本工作流程:

读取数据: 当应用程序需要从数据库中获取数据时,它首先检查缓存是否已有。

未命中缓存: 如果缓存中没有,应用程序从数据库中读取数据,并将其放入缓存。

写入数据: 当应用程序对数据进行写入操作时,它首先更新数据库,然后删除缓存。

此方案与大多数据方案有个共同点,就是删除缓存而不是更新缓存

二、产生问题


添加图片注释,不超过 140 字(可选)


在缓存与数据库(DB)同步的过程中,通常会先更新数据库再删除缓存,而不是直接更新缓存?

主要有以下几个原因:

  1. 数据一致性: 直接更新缓存可能导致缓存与数据库之间的数据不一致。如果在更新缓存的同时有其他请求正在读取或修改数据库,就可能出现数据不一致的情况。删除缓存后,下一次读取会从数据库中获取最新数据,从而保证数据的一致性。
  2. 简化操作: 更新缓存需要处理缓存中的数据结构,这可能比简单地删除缓存更复杂。删除缓存后,可以避免复杂的同步逻辑,简化系统的维护。
  3. 避免竞态条件: 在高并发的系统中,多个进程或线程可能同时操作缓存和数据库。如果直接更新缓存,可能会出现竞态条件,导致数据不一致。删除缓存可以减少这种风险。
  4. 性能考虑: 有时候,直接从数据库中重新加载数据到缓存可能比更新缓存更高效,尤其是当缓存数据结构复杂或者缓存更新操作成本较高时。


三、剖析问题

让我们深入探讨一下为什么说"删除缓存比更新缓存操作更简单"

1、操作复杂度

  • 删除操作通常只需要一个简单的命令,如 Redis 的 DEL 命令。
  • 更新操作可能涉及多个字段的修改,需要处理部分更新的情况。

一般来说我们存储在缓存中的数据以json为主,大多数json还是以string类型存储在redis中。

可以看到String类型时更新与删除时间复杂度都是O(1)一样的


添加图片注释,不超过 140 字(可选)


当然现在redis也已经支持json类型了,json类型时,set要复杂一点是O(M+N),del是O(N)


添加图片注释,不超过 140 字(可选)


json set复杂度: 当路径(path)被评估为单个值时,复杂度为 O(M+N),其中 M 是原始值的大小(如果存在),N 是新值的大小。 当路径被评估为多个值时,复杂度也是 O(M+N),其中 M 是键的大小,N 是新值的大小乘以键中原始值的数量。

2、避免并发更新

在高并发环境中,更新缓存可能会引入并发问题,例如多个线程同时更新缓存时可能导致不一致的状态。而删除缓存则可以简单有效地避免并发与顺序性的问题,把原本复杂的问题简单化、异步化,拆解了并发的问题,让所有请求能重新获取最新数据,避免这类问题的发生。

删除缓存可以确保下次请求会获取到最新的数据,尤其是在数据更新频繁、对数据实时性要求高的场景下,这种策略能够保证数据的一致性。

添加图片注释,不超过 140 字(可选)

3、简单直接

"简单"在这里不仅指操作命令本身的简单(del key/set key value ),还包括整个系统在处理缓存时的简单性和可靠性。

当然在命令本身方面整个缓存的删除还是要加上增加缓存的命令才完整。

当更新缓存后就有查询请求时:

删除缓存=del+set 更新缓存=set

当更新缓存后无查询请求时:

删除缓存=del 更新缓存=set

当有多更新缓存操作后,并无查询请求时:

删除缓存=del+del+del 更新缓存=set+set+set+(并发与顺序控制)

相对并发与顺序的控制而言,删除缓存是一种直接有效的方式,确保下次请求时,服务器会从新的数据源获取最新的数据,而不会受到旧缓存的影响。相比之下,更新缓存可能涉及到更复杂的逻辑,如判断何时进行更新、如何保证并发请求下的一致性,如是否需要加锁等限制。


我是栈江湖,如果你喜欢此文章,不要忘记关注+点赞哦!你的支持是我创作的动力。如果你有任何意见或建议,欢迎在下方留言。若转载,请注明文章来源。

目录
相关文章
|
2天前
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
|
9天前
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
2024年11月29日,阿里云在上海举办金融量化策略回测Workshop,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。活动特别设计了动手实践环节,帮助参会者亲身体验阿里云产品功能,涵盖EHPC量化回测和Argo Workflows量化回测两大主题,旨在提升量化投研效率与安全性。
云上金融量化策略回测方案与最佳实践
|
11天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
8879 20
|
15天前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
4769 12
资料合集|Flink Forward Asia 2024 上海站
|
15天前
|
自然语言处理 数据可视化 API
Qwen系列模型+GraphRAG/LightRAG/Kotaemon从0开始构建中医方剂大模型知识图谱问答
本文详细记录了作者在短时间内尝试构建中医药知识图谱的过程,涵盖了GraphRAG、LightRAG和Kotaemon三种图RAG架构的对比与应用。通过实际操作,作者不仅展示了如何利用这些工具构建知识图谱,还指出了每种工具的优势和局限性。尽管初步构建的知识图谱在数据处理、实体识别和关系抽取等方面存在不足,但为后续的优化和改进提供了宝贵的经验和方向。此外,文章强调了知识图谱构建不仅仅是技术问题,还需要深入整合领域知识和满足用户需求,体现了跨学科合作的重要性。
|
23天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
11天前
|
人工智能 容器
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
|
10天前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
878 58

热门文章

最新文章