面试连环炮系列(二十七):如何保证缓存与数据库的数据一致性

1. 如何保证缓存与数据库的数据一致性?

要保持数据强一致性,只能将读请求和写请求串行化,在同一个内存队列里执行。但是串行化会导致系统的吞吐量大幅度降低,多用几倍的机器去支撑线上的请求。

2. 如果只要数据最终一致性,该怎么做呢?

  • 缓存设置过期时间。
  • 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
  • 更新数据的时候,先更新数据库,然后再删除缓存。

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

  • 删除比更新更快捷。比如有些缓存值是由多个数据计算出来的,如果计算比较耗时,在高并发下,更新缓存的方式增加了读缓存不一致的概率。
  • 有些缓存是冷数据,删除缓存等于是将更新缓存延迟到了读请求的时刻。

4. 如果删除缓存失败了,怎么解决?

  • 将删除缓存的操作交给消息队列,删除了失败重试,但是这样对业务代码侵入比较强。
  • 采用阿里的Canal,它可以订阅数据库的binlog,获得数据进行删除缓存操作。

Original: https://www.cnblogs.com/xiaoyangjia/p/16067956.html
Author: 编码砖家
Title: 面试连环炮系列(二十七):如何保证缓存与数据库的数据一致性

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578121/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【Docker搭建】1. 在Docker中安装MySQL5.7

    docker pull mysql:5.7 将全部的配置文件和关联的文件夹统一放到 /opt/docker/mysql 中 创建 MySQL 配置文件文件夹 mkdir -p /o…

    Linux 2023年6月13日
    087
  • Mybatis的递归查询实现二级评论

    最近闲来无事,在做毕业设计。前台页面需要一个评论功能,感觉三方的评论太复杂,功能也太多。就想着自己写一个简单点的,本人比较菜,方法比较笨,可能效率不高。 环境介绍 后端:Sprin…

    Linux 2023年6月8日
    0113
  • MongoDB中创建root的角色失败:Error couldn’t add user No role named root@test

    问题描述 使用Django操作MongoDB,在创建用户的时候,使用下面操作: > db.createUser({user: ‘abc’, pwd: ‘abc’, roles…

    Linux 2023年6月8日
    0116
  • 最短的可通过编译的C语言程序

    要求:写一个最短的,能通过编译的C语言程序,但不要求能正确运行。 一般人首先想到的是除0。即 除0会引发SIGFPE信号(浮点异常)。 我们也可以删掉return,但是这样做的话编…

    Linux 2023年6月14日
    094
  • LVS+keepalived+nginx+tomcat

    一、 环境准备 本次配置基于DR负载均衡模式,设置一个VIP(Virtual IP)为19.50.67.173,用户只需要访问这个IP地址即可获得后端服务 其中,负载均衡主机为19…

    Linux 2023年6月6日
    0150
  • 如何优雅的处理 accept 出现 EMFILE 的问题

    通常情况下,服务端调用 accept 函数会返回一个新的文件描述符,用于和客户端之间的数据传输 在服务器的开发中,有时会遇到这种情况:当调用 accept 函数接受客户端连接,函数…

    Linux 2023年6月13日
    0105
  • Docker Compose 安装

    方法一:这种方式相对简单,但是由于网络问题,常常安装不上,并且经常会断开,可以尝试使用网络上提供的国内安装的方法将@version 替换为要安装的版本号 sudo curl -L …

    Linux 2023年6月13日
    0109
  • Linux命令篇-wc 命令

    wc – print newline, word, and byte counts for each file wc: 统计文件的 字&#…

    Linux 2023年6月13日
    0101
  • 阿里云IoT流转到postgresql数据库方案

    之前写过一篇如使用阿里云上部署.NET 3.1自定义运行时的文章,吐槽一下,虽然现在已经2022年了,但是阿里云函数计算的支持依然停留在.NET Core 2.1,更新缓慢,由于程…

    Linux 2023年6月6日
    0115
  • 2020年12月-第02阶段-前端基础-CSS Day06

    CSS Day06 定位(position) *理解 能说出为什么要用定位能说出定位的4种分类能说出四种定位的各自特点能说出我们为什么常用子绝父相布局 *应用 能写出淘宝轮播图布局…

    Linux 2023年6月8日
    0144
  • DDoS攻击–TCP攻击概述

    https://blog.csdn.net/qq_34777600/article/details/81945594 posted @2020-12-10 18:07 珠峰之梦 阅…

    Linux 2023年6月7日
    0108
  • 二进制插入

    二进制插入__牛客网 (nowcoder.com) 题意为 让m插入到n的第j位到第i位 方法1: class BinInsert { public: int binInsert(…

    Linux 2023年6月13日
    0108
  • 我对二进制的理解

    理解进制的重要方法是类比我们熟知的十进制 10进制 一个正常的人类,拥有10根手指,每根手指代表1个信息,那么两双手掌便可表达10个信息。1, 2, 3, …, 10。…

    Linux 2023年6月7日
    065
  • 操作系统虚拟内存发展史

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    Linux 2023年5月27日
    0123
  • Linux服务器下oracle数据库启动服务操作步骤

    一、在Linux下启动Oracle1.登录到Linux服务器,切换到oracle用户权限(命令是:# su –l oracle) 2.进入sqlplus界面(命令是:$ sqlpl…

    Linux 2023年6月13日
    0116
  • SpringBoot——Redis实现分布式集群Session共享

    1.添加pom.xml依赖 org.springframework.boot   spring-boot-starter-data-redis   org.springframew…

    Linux 2023年5月28日
    0101
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球