保证缓存和数据库的一致性

2023-05-16

如何保证缓存和数据库的一致性


在日常开发中为了提高数据的响应速度,可能会讲一些热点数据保存在缓存中,这样不用每次去数数据中查询了,可用有效提高服务端的响应速度 最常用的缓存就是redis
数据对实时性和精确性要求很高 则直接操作数据库

选中合适的数据存入到redis之后,每当读取数据的时候,就先去redis看有没有,如果有则直接返回 如果没有则取数据库中读取,并且将从数据库中读取到的数据缓存到redis中,

如何做到一致性


Cache-Aside 旁路缓存模式 尽可能地解决缓存与数据库不一致堵塞问题

读缓存


流程是这样的
1 读取数据
2 检查缓存中是否有需要的数据,如果命中(Cache Hit),则直接返回数据
3 如果没有命中缓存,即Cache Miss,那么就去访问数据库
4 将从数据库中读到的数据设置到缓存中
5 返回数据


写缓存 


1 写入
2 更新数据库
3 删除旧缓存


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


  删除缓存消耗太大了
 1 更新缓存 缓存的内容(更新缓存不是简单的更新一个Bean,缓存的都是一些复杂匀速那和计算结果),加缓存的必然性(如果不加缓存,不但无法提高并发量,同时也会给MySQL数据库带来巨大的负担),
 结论(对于这样的缓存,更新起来并不容易,删除缓存效果更好)
 2 对于一些写频繁的应用,如果按照(更新缓存-更新数据库)的模式来,比较浪费性能,例如,如果每次都要写缓存,可能写了十次,只读了一次,那么读到的数据只是第十次的,前面的九次都是无效数据,没必要更新
 3 对于更新缓存的方式,在并发环境下,可能会造成数据错误的情况,更新数据库的内容的先后顺序和更新缓存的先后顺序有关,顺序一致则数据一致,因为网络问题,顺序不一致,则数据不一致
 
 

为什么不先删除旧的缓存,然后再更新数据库?


可能出现的场景,有两个线程
A 线程首先删除缓存。
B 线程读取缓存,发现缓存中没有数据。
B 线程读取数据库。
B 线程将从数据库中读取到的数据写入缓存。
A 线程更新数据库。

一套操作下来,我们发现数据库和缓存中的数据不一致了!所以,在 Cache-Aside 中是先更新数据库,再删除缓存。


 延迟双删


 延迟双删是这样:先执行缓存清除操作,再执行数据库更新操作,延迟 N 秒之后再执行一次缓存清除操作,这样就不用担心缓存中的数据和数据库中的数据不一致了。
 如何确保原子性
 保证数据库更新完毕之后,也成功删除了缓存
 一种常见的解决方案就是使用消息中间件来实现删除的重试。大家知道,MQ 一般都自带消费失败重试的机制,当我们要删除缓存的时候,就往 MQ 中扔一条消息,缓存服务读取该消息并尝试删除缓存,删除失败了就会自动重试。


 Read-Through/Write-Through


 Read-Through 


 是一种类似于 Cache-Aside 的缓存方法,区别在于,在 Cache-Aside 中,由应用程序决定去读取缓存还是读取数据库,这样就会导致应用程序中出现了很多业务无关的代码;而在 Read-Through 中,相当于多出来了一个中间层 Cache Middleware,由它去读取缓存或者数据库,应用层的代码得到了简化,


 Write-Through


 在 Write-Through 策略中,所有的写操作都经过 Cache Middleware,每次写入时,Cache Middleware 会将数据存储在 DB 和 Cache 中,这两个操作发生在一个事务中,因此,只有两个都写入成功,一切才会成功。
这种写数据的优势在于,应用程序只与 Cache Middleware 对话,所以它的代码更加干净和简单。


Write Behind


Write-Behind 缓存策略类似于 Write-Through 缓存,应用程序仅与 Cache Middleware 通信,Cache Middleware 会预留一个与应用程序通信的接口。
Write-Behind 与 Write-Through 最大的区别在于,前者是数据首先写入缓存,一段时间后(或通过其他触发器)再将数据写入 Database,并且这里涉及到的写入是一个异步操作。这种方式下,Cache 和 DB 数据的一致性不强,对一致性要求高的系统要谨慎使用,如果有人在数据尚未写入数据源的情况下直接从数据源获取数据,则可能导致获取过期数据,不过对于频繁写入的场景,这个其实非常适用。
将数据写入 DB 可以通过多种方式完成:

一种是收集所有写入操作,然后在某个时间点(例如,当 DB 负载较低时)对数据源进行批量写入。
另一种方法是将写入合并成更小的批次,例如每次收集五个写入操作,然后对数据源进行批量写入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保证缓存和数据库的一致性 的相关文章

  • JAVA常用类

    Object类 Object类是类层次结构的根 xff0c 每个类都可以将Object作为超类 所有类都直接或者间接的继承该类 Object只有无参构造方法 Math类 包含执行基本数学运算的方法 Random类 伪随机数 java uta
  • Collections类 [Java]

    Collections工具类 Collections是一个操作Collection集合和Map集合的工具类 Collections不仅仅是操作Collection集合 还可以操作Map集合 Collection和Collections有什么
  • 我阿里P7了解到的Android面试的一些小内幕!已拿offer

    前言 这些题目是网友去百度 小米 乐视 美团 58 猎豹 360 新浪 搜狐等一线互联网公司面试被问到的题目 熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率 欢迎一线公司员工以及网友提交面试题库 xff0c 欢迎留言 网上的都是按
  • 7月编程排行榜来啦!这次有何新变化?

    每月编程排行榜可能会迟到 xff0c 但永远不缺席 7月的编程排行榜已出 xff0c 接下来一起看看有哪些看点吧 Tiobe编程排行榜前20名 Tiobe编程排行榜Top 10趋势 TIOBE Index编程社区指数是编程语言流行度的一个指
  • 操作系统 记录型信号量实现生产者消费者问题(完整代码)

    问题描述 用信号量模拟生产者 消费者问题的过程 生产者和消费者两个线程共享同一个缓冲区 xff0c 生产者不断向缓冲区中添加产品 xff0c 消费者从缓冲区中消费产品 要保证缓冲区满了之后生产者不能再继续添加产品 xff0c 需要等消费者至
  • 制版经验分享—使用AD18

    文章目录 前言一 封装二 走线三 注意细节四 制版流程五 制版细节总结 前言 在做一些培训题目时 xff0c 由于时间有限制 xff0c 在外面开板会花费好几天的制作和快递时间 xff0c 所以有时候就需要自己制版 xff0c 在这里我记录
  • Java打印九九乘法表

    1 使用双重for循环打印九九乘法表 Java源代码如下 xff1a for int i 61 0 i lt 61 9 i 43 43 for int j 61 1 j lt 61 i j 43 43 System out print i
  • 解决selenium打开Chrome浏览器自动退出的问题

    好不容易安装好selenium和对应的浏览器驱动器后终于可以运行程序了 xff0c 结果发现一运行程序后浏览器打开就自动退出了 xff0c 但是我在Python代码中并没有写driver quit 方法 xff0c 上网查了查发现原来是我的
  • 在Java应用中嵌入sshd服务

    这个应用需要依赖apache mina的子项目sshd xff0c 项目主页http mina apache org sshd project index html xff0c 当前版本号为0 8 0 这里的sshd和Linux下的sshd
  • openssl开发库安装时的踩坑指南

    序 前几天用linux编译一个提权脚本的时候报错 openssl opensslv h 没有那个文件或目录 的问题 无论如何也解决不了 xff0c 这下我记录一个踩坑指南防止下一个人掉进坑里 操作 总体介绍 首先介绍一下 xff0c 这个报
  • 性能测试脚本用例【模板】

    产品名称Product name 密级Confidentiality level 秘密 产品版本Product version Total 12pages 共12页 性能测试脚本用例 仅供内部使用 拟制 日期 xff1a 审核 日期 xff
  • Java常见的集合类

    我们常见的Java集合类有List Set Map List 1 接口可以被继承 2 接口可以被多次实现 3 List和ArrayList package List import java util ArrayList import jav
  • WIN7我的电脑右键管理打不开

    问题现象 xff1a 我的电脑右键点击管理无法正常打开 xff0c 会弹出下面的报错信息 首先打开注册表 xff0c 打开运行 xff0c 输入regedit 选择路径 xff1a HKEY LOCAL MACHINE SOFTWARE C
  • LIKE的用法

    我们来谈谈关于like运算符的理解 xff1a 下面是like的语法 xff0c 以后使用到like运算符的都必须根据这个语法使用 LIKE 运算符是用来匹配通配符指定模式的文本值 如果搜索表达式与模式表达式匹配 xff0c LIKE 运算
  • 从0开始详细安装archlinux(UEFI启动)

    隔了一周没更新 xff0c 前阵子把电脑windows卸了装了个archlinux xff0c 不得不说arch是真的香 xff0c 但是坑也是真的多 xff0c 刚踩完所有的坑 xff0c 滚回来写blog了 注 xff1a 本贴为UEF
  • archlinux开机无法联网问题,以及安装archlinuxcn和yay管理器

    前一篇已经安装完了archlinux系统 xff0c 不过真正难的其实并不是安装 xff0c 你的路现在才开始 xff0c 哈哈 添加用户 建议 xff0c 不然使用登录管理器的时候不支持root用户 span class token fu
  • archlinux安装kde桌面和sddm登录管理器

    前几篇已经配置好了archlinuxcn软件仓库 xff0c 网络和nvidia驱动 xff0c 现在来给你的archlinux安装一个kde桌面 xff08 kde玩法有很多 xff0c 可以自己去搜一搜美化教程 xff09 xff0c
  • Spring框架学习

    目录 目录 学习内容 xff1a IoC java中创建对象有哪些方式 xff1a ioc的体现 xff1a DI 是ioc的技术实现 spring的第一个核心功能 ioc Spring 八大模块 Spring的特点 xff1a Sprin
  • CenOs6.7不能使用yum命令

    因为官方不维护了所以 先用更换源 wget O etc yum repos d CentOS Base repo https mirrors aliyun com repo Centos vault 6 10 repo https deve

随机推荐

  • PowerMock注解PowerMockIgnore的使用方法

    故事要从一个异常开始 xff0c 某天我在开发一个加密 解密特性 xff0c 算法使用的是3DES xff0c 样例代码如下 package org jackie study powermock import java io Unsuppo
  • 如何写一棵AVL树

    二叉查找树 二叉查找树有一个缺陷就是查询效率跟树的高度有关 在极端情况下 xff0c 查询效率为n 如何解决二叉查找树效率低问题 xff1f 要增加查询效率 xff0c 高效的方案是在插入的时候对树进行一下平衡操作 xff0c 降低树的高度
  • 点击超链接下载.pdf文件

    上代码 span class token keyword package span span class token class name Servlet span span class token punctuation span res
  • SpringTemplate增删改查及其事务控制基本使用

    一 JdbcCRUD操作 1 导入坐标包 span class token generics span class token punctuation lt span dependency span class token punctuat
  • C语言从键盘读入一个正整数num,计算0 ~ num(包括num)范围内所有奇数之和

    include span class token generics span class token punctuation lt span stdio span class token punctuation span h span cl
  • spring文件上传拦截器及异常处理

    1文件上传 当enctype 61 34 multipart form data 34 时request getParameter 方法失效 单文件上传 导入坐标 span class token generics span class t
  • jxl,java实现创建工作簿Excel并导入数据

    导入jxl jar包 只支持xls格式的excel 导入 span class token generics span class token punctuation lt span dependency span class token
  • springboot整合mybatis

    先创建一个springbooot项目 file gt new project Spring Initalizr 勾选sql mysql Driver 这里和mybatis plus一起整合 span class token generics
  • Mybatis-Plus代码生成器

    span class token operator lt span span class token operator span span class token operator span 代码生成器 span class token o
  • 数据仓库Hive的分区表与分桶表

    一 分区表 分区表实际上就是对应一个HDFS文件系统上的独立的文件夹 xff0c 该文件夹下是该分区所有的数据文件 Hive中的分区就是分目录 xff0c 把一个大的数据集根据业务需要分割成小的数据集 在查询时通过WHERE子句中的表达式选
  • cloudflare动态域名解析-并实现自定义内外网混合动态域名DDNS脚本

    1 获取CloudFlare的API令牌 直接进入地址 xff1a API 令牌 账户名 39 s Account Cloudflare 2 获取根域名ID curl X GET 34 https api cloudflare com cl
  • GitHub新手用法详解【适合新手入门-建议收藏!!!】

    目录 什么是Github xff0c 为什么使用它 xff1f 一 GitHub账号的注册与登录 二 gitbash安装详解 1 git bash的下载与安装 2 git常用命令 3 Git 和 GitHub 的绑定 1 获取SSH key
  • 小米mix2s刷win11和android双系统

    在给电脑安装系统的过程中 xff0c 可能会因为各种原因出现windows无法安装的情况 xff0c 我在给小米mix2s安装win11时发现出现了 计算机意外地重新启动或遇到错误 xff0c windows无法安装 的情况 xff0c 下
  • Windows10开机引导文件被删除后系统修复

    背景 xff1a 本人拯救者y9000p 自己装了个windows10的系统 xff0c 然后要用GAMMA xff0c 想装个Ubuntu的双系统来着 xff0c 但是装过gamma的朋友应该知道这玩意不好装 xff0c 装半天不成功不知
  • RabbitMQ快速入门及六大模式

    目录 核心组件 运行原理 实现步骤 构建Gradle项目 入门案例 简单模式 生产者 xff08 代码 xff09 消费者 xff08 代码 xff09 绑定交换机和队列 发布 订阅模式 xff08 Publish Subscribe xf
  • <生产者、消费者问题>——《Linux》

    目录 1 生产者消费者模型 1 1 为何要使用生产者消费者模型 1 2 生产者消费者模型优点 2 基于BlockingQueue的生产者消费者模型 2 1 BlockingQueue 2 2 C 43 43 queue模拟阻塞队列的生产消费
  • 抖音全自动引流脚本详细使用教学

    大家好我是你们的小编一辞脚本 xff0c 今天给大家分享新的知识 xff0c 很开心可以在CSDN平台分享知识给大家 很多伙伴看不到代码我先录制一下视频 在给大家做代码 xff0c 给大家分享一下抖音引流脚本的知识和视频演示 不懂的小伙伴可
  • 小型医疗门诊挂号系统 医院管理系统后台thinkphp内核源码

    内容目录 一 详细介绍二 效果展示1 部分代码2 效果图展示 三 学习资料下载 一 详细介绍 Thinkphp内核医院医疗门诊系统源码 带第三方配置 带微信登录 功能强大齐全的医疗门诊系统源码 xff0c 使用本系统可大大方便医疗机构的资料
  • Linux查询ip地址ens33没有inet这个属性

    首先输入用户名和密码登录CentOS7虚拟机 xff1b 输入ip addr 这是会发现ens33是没有inet属性的 xff1b 然后输入 xff1a cd etc sysconfig network scripts 找到ifcfg en
  • 保证缓存和数据库的一致性

    如何保证缓存和数据库的一致性 在日常开发中为了提高数据的响应速度 xff0c 可能会讲一些热点数据保存在缓存中 xff0c 这样不用每次去数数据中查询了 xff0c 可用有效提高服务端的响应速度 最常用的缓存就是redis 数据对实时性和精