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

news2024/11/26 12:55:35

一、事情起因

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

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

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

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

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

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

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

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

二、产生问题

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

主要有以下几个原因:

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

三、剖析问题

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

1、操作复杂度

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

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

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

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

json set复杂度:

当路径(path)被评估为单个值时,复杂度为 O(M+N),其中 M 是原始值的大小(如果存在),N 是新值的大小。

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

2、避免并发更新

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

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

3、简单直接

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

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

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

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

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

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

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

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

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

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

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

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

相关文章

和鲸科技聘任上海交通大学医学院张维拓老师为公司医学行业专家顾问

2024 年 9 月 13 日,上海和今信息科技有限公司(以下简称“和鲸科技”)举行了聘任仪式,聘请上海交通大学医学院临床研究中心副研究员张维拓老师为和鲸科技医学行业专家顾问,共同为医疗相关机构及相关院校提供完整的高质…

VMware软件下载,VMware虚拟机软件下载安装,VMware功能介绍

VMware是一款虚拟化软件,它具有许多独特的功能,可以帮助用户更好地管理和使用计算机资源。在本文中,我将介绍VMware软件的三个独特功能,并结合实际案例进行详细说明。 虚拟硬件 VMware最新中文版获取: hairuanku.top…

【自用软件】IDM下载器 Internet Download Manager v6.42 Build 10

下载IDM&pj安装教程 Internet Download Manager,简称 IDM,是国外的一款优秀下载工具。目前凭借着下载计算的速度优势在外媒网站中均受好评,现在已被多数国人熟知。Internet Download Manager 提升你的下载速度最多达5倍,安排下…

Linux基础3-基础工具2(vim详解,gcc详解)

上篇文章:Linux基础3-基础工具1(什么是工具,yum,vim基础)-CSDN博客 本章重点: 1. vim详解 2. gcc详解 目录 一. vim详解 1.1 命令模式 1.2 插入模式 1.3 底行模式 二. gcc/g 2.1 程序的翻译过程(c/c代码执行过…

海报生成用什么软件好?小白看这里

想要让你的信息在人群中脱颖而出吗?一张精心设计的海报无疑是最佳选择。 无论是宣传活动、展示作品还是装饰空间,海报都能以视觉的力量抓住人们的眼球。 但海报制作软件哪个好呢?别急,这里有五个超实用的海报制作软件&#xff0…

「漏洞复现」紫光电子档案管理系统 selectFileRemote SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

二维码扫码模组国产麒麟系统C语言SDK二次开发

在国产系统麒麟V10系统上面上使用的 USB HID POS 的 SDK 包. 特别说明涉及到永久参数的函数接口,请勿频繁使用.如果是出厂或者偶尔设置推荐使用永久参数,如果是每次读码都进行参数修改,请使用临时参数.频繁进行永久参数操作会减小扫码设备的使用寿命. #include <stdio.h>…

零基础国产GD32单片机编程入门(二十五)USB口介绍及CDC类虚拟串口通讯详解及源码

文章目录 一.概要二.USB2.0基本介绍及虚拟串口介绍三.GD32单片机USB模块框图四.GD32单片机USB设备模式五.GD32F103C8T6 USB设备CDC类六.配置一个USB虚拟串口收发例程七.工程源代码下载八.小结 一.概要 GD32F103C8T6 USB虚拟串口是一种采用GD32F103C8T6单片机&#xff0c;通过U…

android10 系统定制:增加应用使用数据埋点,应用使用时长统计

需求意在统计应用的使用时长和开始结束时间,最终生成一个文件可以直观看出什么时候进入了哪个应用、什么时候退出,如图: 每行记录了应用的进入或退出,以逗号分割。分别记录了事件开始时间,应用包名,进入或退出(1或2),应用名称。 根据上面的数据记录可以看出:2024-08…

B2C电商接口解决方案||搭建电商项目必备电商接口

01 涉及接口 电商接口&#xff1a;天猫、京东商城、拼多多、有赞、快递鸟接口。 02 业务场景 企业在第三方电商平台开店&#xff0c;需要对电商平台上商品价格、库存进行更新&#xff0c;并将电商订单下载到ERP系统&#xff0c;ERP进行作业后&#xff0c;将物流信息上传到电…

【MATLAB源码-第265期】基于simulink的DQPSK调制解调系统仿真,未直接调用模块并且手动实现,输出各节点波形图。

操作环境&#xff1a; MATLAB 2013a / 2013b 1、算法描述 差分正交相移键控&#xff08;DQPSK&#xff09;调制解调系统是一种非常成熟的数字通信技术&#xff0c;主要用于传输数据中的相位变化&#xff0c;而非绝对相位。这一特性使得它对信号中的相位抖动和其他干扰具有更…

再次进阶 舞台王者 第八季完美童模全球赛见证官【孔翊橙】赛场+秀场超燃合集!

7月20-23日&#xff0c;2024第八季完美童模全球总决赛在青岛圆满落幕。在盛大的颁奖典礼上&#xff0c;一位才能出众的少女——孔翊橙迎来了她舞台生涯的璀璨时刻。见证官——孔翊橙&#xff0c;以璀璨童星之姿&#xff0c;优雅地踏上完美童模盛宴的绚丽舞台&#xff0c;作为开…

双副本与双活:TDengine 为企业打造的高效数据管理利器

在现代数据管理中&#xff0c;企业对于可靠性、可用性和成本的平衡有着多样化的需求。为此&#xff0c;TDengine 在 3.3.0.0 版本中推出了两种不同的企业级解决方案&#xff1a;双活方案和基于仲裁者的双副本方案&#xff0c;以满足不同应用场景下的特殊需求。本文将详细探讨这…

看看智慧门诊银医通自助服务方案,如何化解医院患者跑难题

“看病三分钟&#xff0c;排队三小时”&#xff0c;这是许多患者在就医过程中的无奈吐槽。挂号队伍长如龙&#xff0c;看病流程繁琐复杂&#xff0c;缴费窗口人满为患&#xff0c;检查报告等待时间漫长…… 这些就医痛点&#xff0c;不仅让患者身心疲惫&#xff0c;也给医院的管…

Python编码系列—Python抽象工厂模式:构建复杂对象家族的蓝图

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

wifi MSDU MPDU BA

MSDU (Mac service data unit) mac 服务层 数据单元&#xff0c; 也就是包含了 mac 层头和 FCS 的 802.11 包。 MPDU&#xff08;Mac protocol data unit&#xff09;mac 协议层数据单元&#xff0c; 这个包只是原始的802.11 数据包 在新的wifi 协议中有两种聚合方式 A-MSDU…

数仓建设:为什么我们的数据容易被业务方质疑?

目录 0 问题背景 1 问题产生的原因 2 问题解决方案 3 小结 数字化建设通关指南专栏原价99&#xff0c;现在活动价39.9&#xff0c;按照阶梯式增长&#xff0c;直到恢复原价 0 问题背景 “ 在数字化建设进程中&#xff0c;无论是处于数据产品的你&#xff0c;或是数据开发的…

ModbusTCP/RTU转Ethernet/IP(CIP)-Modbus设备与罗克韦尔AB的PLC之间通讯

IGT-DSER智能网关模块支持西门子、三菱、欧姆龙、罗克韦尔AB等各种品牌的PLC之间通讯&#xff0c;同时也支持PLC与Modbus协议的工业机器人、智能仪表、变频器等设备通讯。网关有多个网口、串口&#xff0c;也可选择WIFI无线通讯。无需PLC内编程开发&#xff0c;只要在IGT-DSER智…

Python 数学建模——Vikor 多标准决策方法

文章目录 前言原理步骤代码实例 前言 Vikor 归根到底其实属于一种综合评价方法。说到综合评价方法&#xff0c;TOPSIS&#xff08;结合熵权法使用&#xff09;、灰色关联度分析、秩和比法等方法你应该耳熟能详。Vikor 未必比这些方法更出色&#xff0c;但是可以拓展我们的视野。…

从GreaterWMS学习仓库管理系统

前言 客户并不知道&#xff08;确切地&#xff09;他们需要什么&#xff1f; 需要通过需求分析工具和技术&#xff0c;利用宽进严出的需求池&#xff0c;需求验证使用原型测试&#xff0c;场景分析&#xff0c;专家评审&#xff0c;交叉检查等手段&#xff0c;经过充分验证的需…