首页 > 数据库 >数据库和缓存的一致性问题

数据库和缓存的一致性问题

时间:2024-11-12 23:18:29浏览次数:1  
标签:缓存 删除 数据库 cache 更新 线程 一致性

日常开发中我们怎么用缓存,哪种模式缓存

  1. cache-aside:读请求,判断是否命中缓存,如果命中直接返回,如果没有命中,从数据库读取,更新缓存,返回数据。
    写:写请求,先更新数据库,然后删除旧的缓存。

2.read/write-through
读:read-through:从缓存中读取数据,读到直接返回。
如果读取不到,从数据库加载,写入缓存,然后返回响应,其实和cache-aside很像,只是加了一下封装使代码更简洁。

write-through
发生写请求的时候,也是缓存抽象层完成数据源和缓存数据的更新。他是同步更新缓存和数据库的,

write-behind则是:只更新缓存,不直接更新数据库,通过批量异步的方式更新数据库。这种方式一致的要求不那么强烈,但是适合MySQL频繁写入的场景,mysql的InnoDB Buffer Pool 机制就是使用的这种模式。

操作缓存到底是要删除缓存还是更新缓存呢?

例如:两个线程A,发起写入操作,先更新数据库,线程B发起写的操作,后更新的数据库,由于网络原因,线程B先更新了缓存,线程A后更新的缓存,这就出现一个问题,就是数据库是新的数据,而缓存是老的数据。如果是删除缓存就不会有这个问题。

更新缓存相对于删除缓存还有两个劣势:

1.如果写入缓存的东西经过复杂的运算,则更新就很费性能。
2.在写的多,读的少的场景下,数据很多时候还没被读取到,就被更新了,这也是性能问题。

cache-aside为啥要先操作数据,不操作缓存呢?

1.线程A发起了一个写的操作,删除缓存
2.线程B发起了一个读的操作,缓存没有
3.线程B读DB,读出来一个老数据
4.线程B吧老的数据,放入缓存
5.线程A写入数据库新的数据。
这样就导致,缓存数据库和缓存不一致。
因此:cache-aside 先操作数据库,后操作缓存。

怎么做到数据库和缓存强一致?

其实没有办法强一致,追求绝对的一致性,不适合使用缓存。

什么是延迟双删:

他是可以保持一致性的方案之一,
1.先删除缓存
2.更新数据库
3.休眠一段时间
4.再次删除缓存

删除缓存重试机制

不管是双删还是cache-aside,都会存在

优化方案:删除失败,就多删除几次,设置一个延迟时间,引入重试机制
1.写请求更新数据库
2.缓存因为某些原因,删除失败
3.把删除失败的key放在队列里面,
4.消费消息队列的消息,获取要删除的key
5.重试删除缓存机制

标签:缓存,删除,数据库,cache,更新,线程,一致性
From: https://www.cnblogs.com/surewing/p/18542863

相关文章

  • 【springboot应用】Spring Boot 3.3 + Neo4j:轻松实现图数据库操作的完全指南
    简介:Neo4j和SpringBoot集成Neo4j是一种开源的NoSQL图数据库,专为处理关联性强的大数据而设计。传统的关系型数据库(RDBMS)不擅长处理大量的关系数据,而Neo4j则通过基于图的模型使这些关系处理得更高效、直观。SpringBoot提供了很多与Neo4j集成的便捷工具,如spring-boot-......
  • 数据库序列器
    在数据库管理系统中,序列(Sequence)是一种数据库对象,主要用于生成唯一的数值。不同的数据库系统对序列的支持方式可能不同。下面是DB2和MySQL中关于序列的一些信息: ###DB2中的序列 在IBM的DB2数据库中,序列是一个独立的对象,可以被多个表或应用程序共享。通过使用`CREATESEQ......
  • python-27-Python ORM系列之彻底搞明白ORM概念,对ORM进行封装结合FastAPI实现数据库的
    python-27-PythonORM系列之彻底搞明白ORM概念,对ORM进行封装结合FastAPI实现数据库的增删改查,联表查询等接口一.简介在Python基础系列ORM部分为大家介绍了如何搭建MySQL数据和MySQL一些访问配置,同时也介绍了pymysql库的封装来实现对数据库的增删改查功能,但是截止以上都没......
  • 数据库操纵语言(DML)
    数据库操纵语言(DML)向数据库中插入、删除、更新数据。插入数据通过使用语句来向数据库中插入一条数据(一条记录):insertintoINSERTINTO表名VALUES(值1,值2,值3)如果插入的数据与列一一对应,那么可以省略列名,但是如果希望向指定列上插入数据,就需要给INSERTINTO表名(列名1,......
  • 【大数据测试 Hive数据库--保姆级教程】
    大数据测试Hive数据库详细教程一、环境准备二、Hive数据库功能测试1.创建表2.插入数据3.查询数据4.使用条件过滤查询5.删除数据三、Hive数据库性能测试1.查询响应时间2.大数据量查询测试3.分区表性能测试4.并发查询性能四、Hive数据完整性测试1.数据加......
  • MapReduce解析简历存储到Postgres数据库
    目录一、功能描述二、代码实现1、代码结构2、ResumeDBWritable代码3、ResumeWritable代码4、ResumeSDK代码 5、ResumeDBMapper代码6、ResumeDBReducer代码7、ResumeDBPartationer代码8、ResumeDBDriver代码一、功能描述简历数据经过ETL流程,已经上传到HDFS上,需要针......
  • Django数据库操作
    1.ORM框架Django提供的ORM框架,可以简化MySQL代码,节省书写MySQL语句的时间。具体功能如下:创建、修改、删除数据库的表(不用写SQL语句,无法创建数据库)。修改表中数据(不用写SQL语句)。2.ORM使用安装mysql包注:Windows系统大概率安装失败,可直接去https://pypi.org/proje......
  • linux下oracle数据库重起
    切换到Oracle用户,使用SQLPlus作为系统管理员关闭和启动数据库,查看和重启监听进程。使用lsnrctl工具管理监听,检查状态。1、切换到oracle用户,进入sql命令窗口su-oraclesqlplus/assysdba2、关闭数据库shutdownimmediate;关掉exit退出3、查看......
  • Oracle数据库归档模式的开启和关闭
       一、Oracle环境 Oracle服务器:oracle11goracle版本:11.2.0.1.0操作系统版本:RedHatEnterpriseLinuxServerrelease7.6(Maipo) 二、归档模式介绍    oracle是款高安全性的数据库,刚安装好的数据库一般没有开启归档模式,我们需要开启归档模式,特别是业务数......
  • SQLSever将csv文件中的数据导入数据库中的某个表中的操作以及可能会出现的报错
    注:导入数据前,检查一下数据类型是否与数据库中的数据类型相匹配第一种方法:首先打开SQLSever数据库,右击你的数据库找到任务后点开导入平面文件,如图 在弹开的窗口中点击下一步 接下来 填写完后点击下一步,跳转到预览数据的页面,会显示出表中的前20条数据,在检查没有错误后接......