简历_基于 Cache Aside 模式解决数据库与缓存一致性问题。

系列博客目录


文章目录

  • 系列博客目录
  • 缓存更新策略
  • 总结
  • 案例:给查询商铺的缓存添加超时剔除和主动更新的策略


说到解决数据库与缓存一致性的问题,其实就是要解决缓存更新的问题。

缓存更新策略

在这里插入图片描述
业务场景:

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

我们一般使用主动更新,因为我们项目中存在券。

主动更新的策略有以下几种
在这里插入图片描述
这三种缓存策略各有优缺点,具体如下:

  1. Cache Aside Pattern(缓存旁路模式)

    • 定义:应用程序自己负责从缓存加载数据,缓存失效时才会从数据库加载。写入操作首先写入数据库,然后将数据更新到缓存。

    缺点

    • 缓存一致性问题:如果数据库发生变化,缓存不一定同步更新。可能会出现读取旧数据的情况,除非应用程序做额外的缓存失效管理。
    • 复杂性增加:程序需要管理缓存的读取和写入,以及缓存失效的机制,增加了开发和运维的复杂度。
    • 缓存穿透:如果缓存失效并且数据库不存在该数据,频繁的缓存查询会对数据库造成压力。
  2. Read/Write Through Pattern(读写穿透模式)

    • 定义:所有的读操作都直接通过缓存来完成,如果缓存中没有,则从数据库加载并放入缓存;写操作首先写入缓存,然后同步到数据库。

    缺点

    • 性能瓶颈:每次写操作都需要同步到数据库,可能会引起性能瓶颈,尤其在写频繁的场景下,数据库负载可能会很高。
    • 数据库延迟:在写操作时,缓存和数据库必须保持一致,可能导致写入延迟,尤其在网络或数据库响应慢时更为明显。
    • 缓存一致性问题:写操作先更新缓存,再更新数据库,如果缓存和数据库没有及时同步,可能会导致缓存数据不准确。
  3. Write Behind Caching Pattern(写后缓存模式)

    • 定义:写操作先写入缓存,然后异步地将数据写入数据库。即应用程序无需等待数据库写入操作完成。

    缺点

    • 数据丢失风险:由于写入操作是异步的,如果缓存宕机或系统崩溃,可能导致数据没有及时写入数据库,造成数据丢失。
    • 延迟性:虽然写操作速度较快,但因为数据库更新是异步的,可能会导致在短时间内查询到的数据不一致,无法保证实时性。
    • 实现复杂性:需要保证缓存和数据库之间的最终一致性,通常需要额外的机制来保证数据的可靠性,如持久化缓存或重试机制。

总结来说,这三种模式的缺点主要体现在缓存一致性、系统复杂度和性能瓶颈上。在选择缓存策略时,需要根据应用场景权衡它们的优缺点。

第一种是要程序员自己编写一些代码的。企业中一般都是使用方案一,编码过程中需要考虑几个问题。

操作缓存和数据库时有三个问题需要考虑:

  1. 删除缓存还是更新缓存?

    • 更新缓存:每次更新数据库都更新缓存,无效写操作较多
    • 删除缓存:更新数据库时让缓存失效,查询时再更新缓存
  2. 如何保证缓存与数据库的操作的同时成功或失败?

    • 单体系统,将缓存与数据库操作放在一个事务
    • 分布式系统,利用TCC等分布式事务方案
  3. 先操作缓存还是先操作数据库?

    • 先删除缓存,再操作数据库
    • 先操作数据库,再删除缓存

考虑上述第3点时,会产生线程安全问题,如下:
在这里插入图片描述
如上图所示,此时数据库中是新数据20,但是缓存依旧是旧数据10。这种情况的概率比较大,因为写入缓存的速度很快,相比写数据库。

在这里插入图片描述
如上图所示,左边写入缓存的数据是旧数据,右边会导致数据库中的数据为新数据,导致了缓存与数据库的数据的不一致。这种情况发生概率很低,因为写缓存的速度一般快于写(更新)数据库。

所以我们应该先操作数据库,再更新缓存。

总结

缓存更新策略的最佳实践方案:

1.低一致性需求:使用Redis自带的内存淘汰机制

2.高一致性需求:主动更新,并以超时剔除作为兜底方案

  • 读操作:
    缓存命中则直接返回
    缓存未命中则查询数据库,并写入缓存,设定超时时间
  • 写操作:
    先写数据库,然后再删除缓存
    要确保数据库与缓存操作的原子性

案例:给查询商铺的缓存添加超时剔除和主动更新的策略

修改ShopController中的业务逻辑,满足下面的需求:

  1. 根据id查询店铺时,如果缓存未命中,则查询数据库,将数据库结果写入缓存,并设置超时时间根据id

在这里插入图片描述
2. 修改店铺时,先修改数据库,再删除缓存

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

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

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

相关文章

UllnnovationHub,一个开源的WPF控件库

目录 UllnnovationHub1.项目概述2.开发环境3.使用方法4.项目简介1.WPF原生控件1.Button2.GroupBox3.TabControl4.RadioButton5.SwitchButton6.TextBox7.PasswordBox8.CheckBox9.DateTimePicker10.Expander11.Card12.ListBox13.Treeview14.Combox15.Separator16.ListView17.Data…

二进制/源码编译安装mysql 8.0

二进制方式: 1.下载或上传安装包至设备: 2.创建组与用户: [rootopenEuler-1 ~]# groupadd mysql [rootopenEuler-1 ~]# useradd -r -g mysql -s /bin/false mysql 3.解压安装包: tar xf mysql-8.0.36-linux-glibc2.12-x86_64.ta…

快速入门:如何注册并使用GPT

文章目录 ProtonMail邮箱步骤 1:访问Proton官网步骤 2:创建ProtonMail账户步骤 3:选择注册免费账户步骤 4:填写邮箱地址和手机号(可选)步骤 5:邮箱验证(必须进行验证)步骤…

迅为瑞芯微RK3562开发板/核心板应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)...

可应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)、车牌识别、物体识别等。iTOP-3562开发板/核心板采用瑞芯微RK3562处理器,内部集成了四核A53Mali G52架构,主频2GHZ,内置1TOPSNPU算力,RK…

Mybatis Plus 分页实现

目录 前言: 一、分页插件 1、添加配置类 (1)创建配置类方式: (2)启动类中配置分页插件方式(推荐): 2、测试 二、XML自定义分页 1、UserMapper中定义接口方法 2、UserMapper.xml中编写SQL ​编辑 3、测试 前…

20250118-读取并显示彩色图像以及提取彩色图像的 R、G、B 分量

读取并显示彩色图像以及提取彩色图像的 R、G、B 分量 import cv2 #彩图R、G、B的提取 import torch from PIL import Image from matplotlib import pyplot as plt import numpy as np读取并显示彩色图像的三种方法: img_path "./data/yndx"1.1 使用 …

Android BitmapShader实现狙击瞄具十字交叉线准星,Kotlin

Android BitmapShader实现狙击瞄具十字交叉线准星&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.…

20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识

20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识 2025/1/18 15:12 缘起&#xff1a;做飞凌OK3588-C开发板/核心板【Linux R4】的时候&#xff0c;测试/生产要求没有开机LOGO【飞凌/Rockchip】 要求&#xff1a;黑屏或者中性界面。…

浙江安吉成新照明电器:Acrel-1000DP 分布式光伏监控系统应用探索

安科瑞吕梦怡 18706162527 摘 要&#xff1a;分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上&#xff0c;利用太阳能进行发电的一种可再生能源利用方式&#xff0c;与传统的大型集中式光伏电站相比&#xff0c;分布式光伏发电具有更灵活…

QQ邮箱登录逆向

文章目录 抓包密码p的加密算法1.全局搜索参数2.加密函数 抓包 输入账号和错误的密码,可用看到如下的两个包: check: 里面包含密码加密时需要的参数及发送登录时需要的参数 check的响应: ptui_checkVC(0, !UIO, \x00\x00\x00\x00\x74\xca\x4f\x59, ef787cccd192b4015ef02ef3…

Docker安装PostGreSQL docker安装PostGreSQL 完整详细教程

Docker安装PostGreSQL docker安装PostGreSQL 完整详细教程 Docker常用命令大全Docker 运行命令生成Docker 上安装 PostGreSQL 14.15 的步骤&#xff1a;1、拉取 PostGreSQL 14.15 镜像2、创建并运行容器3、测试连接4、设置所有IP都可以运行连接进入容器内 修改配置文件关闭容器…

常见的两种虚拟化技术比较:KVM与VMware

引言 在当今的数据中心和云计算环境中&#xff0c;虚拟化技术已经成为不可或缺的一部分。它不仅提高了资源利用率&#xff0c;降低了硬件成本&#xff0c;还增强了系统的灵活性和可管理性。KVM&#xff08;基于内核的虚拟机&#xff09;和VMware是两种广泛使用的虚拟化解决方案…

Redis的安装和使用--Windows系统

Redis下载地址&#xff1a; windows版本readis下载&#xff08;GitHub&#xff09;&#xff1a; https://github.com/tporadowski/redis/releases &#xff08;推荐使用&#xff09; https://github.com/MicrosoftArchive/redis/releases 官网下载&#xff08;无Windows版本…

Spring Security(maven项目) 3.0.2.5版本中改

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

flutter 装饰类【BoxDecoration】

装饰类 BoxDecoration BoxDecoration 是 Flutter 中用于控制 Container 等组件外观的装饰类&#xff0c;它提供了丰富的属性来设置背景、边框、圆角、阴影等样式。 BoxDecoration 的主要属性 1.color 背景颜色。类型&#xff1a;Color?示例&#xff1a; color: Colors.blu…

ScratchLLMStepByStep:训练自己的Tokenizer

1. 引言 分词器是每个大语言模型必不可少的组件&#xff0c;但每个大语言模型的分词器几乎都不相同。如果要训练自己的分词器&#xff0c;可以使用huggingface的tokenizers框架&#xff0c;tokenizers包含以下主要组件&#xff1a; Tokenizer: 分词器的核心组件&#xff0c;定…

抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版

抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版 源码获取 已放在github上&#xff0c;抖音部分已全面更新为a_bogus算法。 除了抖音还包括快手&#xff0c;小红书&#xff0c;哔哩哔哩&#xff0c;微博&#xff0c;京东&#xff0c;淘宝等平台&#xff0c;旨在帮助…

第十一章 图论

#include <iostream> #include <cstdio> #include <vector>using namespace std;const int MAXN 1000;vector<int> graph[MAXN]; //用向量存储邻接表中的每个点及其连接的的其他点int main(){return 0; } #include <iostream> #include &…

[LeetCode] 链表完整版 — 虚拟头结点 | 基本操作 | 双指针法 | 递归

链表 基础知识虚拟头结点203# 移除链表元素&#xff08;可递归&#xff09;24# 两两交换链表中的节点&#xff08;可递归&#xff09; 链表基本操作707# 设计链表单链表双链表 双指针法206# 反转链表&#xff08;可递归&#xff09;19# 删除链表的倒数第N个结点面试题02.07.# 链…

OODA循环在网络安全运营平台建设中的应用

OODA循环最早用于信息战领域&#xff0c;在空对空武装冲突敌对双方互相较量时&#xff0c;看谁能更快更好地完成“观察—调整—决策—行动”的循环程序。 双方都从观察开始&#xff0c;观察自己、观察环境和敌人。基于观察&#xff0c;获取相关的外部信息&#xff0c;根据感知…