(2)写请求2更新数据库,将 age 字段更新为20;

(3)写请求2更新缓存,缓存 age 设置为20;

(4)写请求1更新缓存,缓存 age 设置为18;

执行完预期结果是数据库 age 为20,缓存 age 为20,结果缓存 age为18,这就造成了缓存数据不是最新的,出现了脏数据。

踩坑二:先删缓存,再更新数据库

如果写请求的处理流程是先删缓存再更新数据库,在一个读请求和一个写请求并发场景下可能会出现数据不一致情况。

如上图的执行过程:

(1)写请求删除缓存数据;

(2)读请求查询缓存未击中(Hit Miss),紧接着查询数据库,将返回的数据回写到缓存中;

(3)写请求更新数据库。

整个流程下来发现数据库中age为20,缓存中age为18,缓存和数据库数据不一致,缓存出现了脏数据。

踩坑三:先更新数据库,再删除缓存

在实际的系统中针对写请求还是推荐先更新数据库再删除缓存,但是在理论上还是存在问题,以下面这个例子说明。

如上图的执行过程:

(1)读请求先查询缓存,缓存未击中,查询数据库返回数据;

(2)写请求更新数据库,删除缓存;

(3)读请求回写缓存;

整个流程操作下来发现数据库age为20缓存age为18,即数据库与缓存不一致,导致应用程序从缓存中读到的数据都为旧数据。

但我们仔细想一下,上述问题发生的概率其实非常低,因为通常数据库更新操作比内存操作耗时多出几个数量级,上图中最后一步回写缓存(set age 18)速度非常快,通常会在更新数据库之前完成。

如果这种极端场景出现了怎么办?我们得想一个兜底的办法:缓存数据设置过期时间。通常在系统中是可以允许少量的数据短时间不一致的场景出现。

Read through

在 Cache Aside 更新模式中,应用代码需要维护两个数据源头:一个是缓存,一个是数据库。而在 Read-Through 策略下,应用程序无需管理缓存和数据库,只需要将数据库的同步委托给缓存提供程序 Cache Provider 即可。所有数据交互都是通过抽象缓存层完成的。

如上图,应用程序只需要与Cache Provider交互,不用关心是从缓存取还是数据库。

在进行大量读取时,Read-Through 可以减少数据源上的负载,也对缓存服务的故障具备一定的弹性。如果缓存服务挂了,则缓存提供程序仍然可以通过直接转到数据源来进行操作。

Read-Through 适用于多次请求相同数据的场景,这与 Cache-Aside 策略非常相似,但是二者还是存在一些差别,这里再次强调一下:

  • 在 Cache-Aside 中,应用程序负责从数据源中获取数据并更新到缓存。
  • 在 Read-Through 中,此逻辑通常是由独立的缓存提供程序(Cache Provider)支持。

Write through

Write-Through 策略下,当发生数据更新(Write)时,缓存提供程序 Cache Provider 负责更新底层数据源和缓存。

缓存与数据源保持一致,并且写入时始终通过抽象缓存层到达数据源。

Cache Provider类似一个代理的作用。

Write behind

Write behind在一些地方也被成为Write back, 简单理解就是:应用程序更新数据时只更新缓存, Cache Provider每隔一段时间将数据刷新到数据库中。说白了就是延迟写入

如上图,应用程序更新两个数据,Cache Provider 会立即写入缓存中,但是隔一段时间才会批量写入数据库中。

这种方式有优点也有缺点:

  • 优点是数据写入速度非常快,适用于频繁写的场景。

  • 缺点是缓存和数据库不是强一致性,对一致性要求高的系统慎用。

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

再免费分享一波我的Java专题面试真题+视频学习详解+Java进阶学习书籍

0985990)]

再免费分享一波我的Java专题面试真题+视频学习详解+Java进阶学习书籍

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,

“百思不得姐,2021最新Java面试笔试题目分享相关推荐

  1. 2021最新Java面试笔试题目分享

    引言 众所周知,软件系统有三高:**高并发.高性能.高可用.**三者既有区别也有联系,门门道道很多,全面讨论可以大战三天三夜. 高并发对于Java开发者来说都不陌生,每年天猫双十一,秒杀大促等场景阿里 ...

  2. C语言之volatile用法(二十一),2021最新Android面试笔试题目分享

    int main (void) { int i = 10; int a = i; //优化 int b = i; printf ("i = %d\n", b); return 0; ...

  3. SpringBoot整合Elasticsearch,2021最新Java面试真题解析

    @Field(type = FieldType.Keyword) private String categroy; @Field(type = FieldType.Double) private Do ...

  4. 吃一堑长一智!2021最新Java面试真题解析

    字节跳动一面 自我介绍,我简历里面有一个商城的项目 画一个商城项目的所有的模块,然后讲解. 在用户登录的时候,由于HTTP是无状态的如何识别不同的用户(session或者cookie) ,然后让说一下 ...

  5. 2021最新Java面试真题解析!java写九九乘法表代码

    01 分布式限流:Nginx+ZooKeeper 1.1 分布式限流之Nginx 请解释一下什么是 Nginx? 请列举 x Nginx 的一些特性. 请列举 x Nginx 和 和 Apache 之 ...

  6. 2021年Java面试题目最新总结【90%面试会踩的坑】

    学会java技术之后大家面临的最多的问题就是面试这关,求职面试java岗位是否能够成功是直接影响我们的工作机会的,所以对于Java程序员面试你准备好了吗?今天小编汇总了一下关于Java程序员面试,90 ...

  7. 2019亚信科技java实习面试笔试经验分享(已成功入职)

    面试笔试经验分享,仅供参考 流程:网申-宣讲-面试-笔试-二笔-二面-通过-offer-入职流程 一面 1. java有几种基本数据类型?各是哪些? 2. 一个char占几个字节?可以存多少个汉字? ...

  8. 华为c语言笔试形式,最新华为C语言笔试题目分享

    最新华为C语言笔试题目分享 华为C语言笔试题目分享: 一.判断 1.有数组定义inta[2][2]={{1},{2,3}};则a[0][1]的值为0.() 2.int(*ptr)(),则ptr是一维数 ...

  9. 京东java笔试_2017阿里,百度,京东java面试+笔试大合集,2018的你会吗?

    2017阿里,百度,京东java面试+笔试大合集 1.阿里 面试(一二面合集) 1.介绍一下你自己. 2.介绍一下你认为做的最好的一个项目. 3.请用五分钟的时间把你做的项目的流程图画一下. 4.项目 ...

最新文章

  1. 自己实现的字符串处理函数
  2. 李宏毅线性代数笔记8 :坐标系变换8
  3. 你真的知道怎么实现一个延迟队列吗 ?
  4. Log4j快速使用精简版
  5. [剑指offer]面试题第[35]题[Leetcode][第138题][JAVA][复杂链表的复制][暴力][HashMap][复制链表]
  6. 子矩阵(NOIP2014 普及组第四题)
  7. 为了实现在线库的复杂查询,你还在双写吗?
  8. 每年扫码千亿次!微信官方开源了自家优化的二维码引擎!3行代码让你拥有微信扫码能力...
  9. 照片尺寸大小对照表_贴片led灯珠型号对照表在手,贴片灯珠选型从此不愁!
  10. java常用类库_【知识点】Java常用类库
  11. Xcode 项目忽略警告
  12. linux下搭建博客21天打卡Day6
  13. 黑客,计算机革命的英雄!
  14. Atitit 技术学习 的方法总结 attilax总结 目录 1.1. 跨框架 1 1.2. 跨语言学习法 1 1.3. 概念学习法 1 1.1 在比较中学习 多语言  2 1 1.3 .2 在历史
  15. cmd运行javac解析中文乱码
  16. 魅族16xs可升级Android10吗,手机评测 篇十一:用了魅族16Xs半个月,谈谈我的使用感受...
  17. 进销存mysql数据库_进销存管理系统数据库设计
  18. Codeforces Round #521 (Div. 3) B. Disturbed People
  19. 屏幕截图工具 php调用,PicPick 全屏幕截图工具
  20. 凡亿教育发布电子工程师利器:IC封装网 V.1.0

热门文章

  1. 基于web的电影点评系统分析与设计
  2. 经济法基础——第六章第三节综合、与增值税联系较为密切的税种
  3. 图形学实验 警察抓小偷
  4. 华为无线路由器信道怎么测试软件,教你为无线路由器选择合适的信道让上网更快...
  5. windows defender红叉解决方法
  6. 不愧是 GitHub 上标星 130K 的手册,内容不多,只讲重点
  7. electron-builder打包linux桌面程序(OIM-E多平台即时通讯软件)
  8. 大学物理实验长度的测量实验报告_大学物理实验:长度测量
  9. 【python入门到精通】python面向对象三大特点:封装,继承,多态
  10. OpenSBI ELF rela.dyn和.dynsym动态链接过程