Java常用笔试题,面试java对未来的规划

最重要的话

2021年,真希望行业能春暖花开。

去年由于疫情的影响,无数行业都受到了影响,互联网寒冬下,许多程序员被裁,大环境格外困难。

我被公司裁掉后,便着急地开始找工作,一次次地碰壁,完全消磨掉了自己的信心,突然感受到,面试已经越来越难了。

于是,我开始调整状态,着重于深耕技术知识,似乎一切开始了好转,最后斩获p7岗offer。

于是乎,我想把我的学习经历以及面试几十家互联网企业总结下来的面试经历分享给我的同行(Java程序员),希望你在金三银四,感受春暖花开!

缓存维护方案一

如果是一读(线程B)一写(线程A)操作,「先操作缓存,再操作数据库」。流程图如下所示:

  • 1.线程A发起一个写操作,第一步del cache

  • 2.线程A第二步写入新数据到DB

  • 3.线程B发起一个读操作,cache miss缓存失效了。

  • 4.线程B从DB获取最新数据

  • 5.线程B执行set cache,把从DB读到的数据,更新到缓存。

「这样看,没啥问题」。我们再看第二个流程图,如下:

  • 1.线程A发起一个写操作,第一步del cache

  • 2.此时线程B发起一个读操作,cache miss

  • 3.线程B继续读DB,读出来一个老数据

  • 4.然后老数据设置入cache

  • 5.线程A写入DB最新的数据

OK,酱紫,就有问题了吧,老数据入到缓存了,「每次读都是老数据啦,缓存与数据与数据库数据不一致了」

缓存维护方案二

上个方案是一读一写,如果是双写操作,「先操作缓存,再操作数据库」,会怎么样呢?

  • 1.线程A发起一个写操作,第一步set cache

  • 2.线程A第二步写入新数据到DB

  • 3.线程B发起一个写操作,set cache

  • 4.线程B第二步写入新数据到DB

「这样看,也没啥问题。」,但是有时候可能事与愿违,我们再看第二个流程图,如下:

  • 1.线程A发起一个写操作,第一步set cache

  • 2.线程B发起一个写操作,第一步set cache

  • 3.线程B写入数据库到DB

  • 4.线程A写入数据库到DB

执行完后,缓存保存的是B操作后的数据,数据库是A操作后的数据,「缓存和数据库数据不一致」

缓存维护方案三

一写(线程A)一读(线程B)操作,「先操作数据库,再操作缓存」

  • 1.线程A发起一个写操作,第一步write DB

  • 2.线程A第二步del cache

  • 3.线程B发起一个读操作,cache miss

  • 4.线程B从DB获取最新数据

  • 5.线程B同时set cache

「有些朋友可能认为,在第2步删除缓存之前,线程B读过来呢?这时候,读到的是缓存老数据,这个可以认为是正常业务逻辑呀,下次再读取就是正确数据了。」

这种方案**「没有明显的并发问题」,但是有可能「步骤二删除缓存失败」,虽然概率比较小,「优于方案一和方案二」**,平时工作中也是使用方案三。

综上对比,我们一般采用方案三,但是有没有完美全解决方案三的弊端的方法呢?

缓存维护方案四

这个是方案三的改进方案,都是先操作数据库再操作缓存,我们来看一下流程图:

通过数据库的**「binlog」「异步淘汰key」,以mysql为例 可以「使用阿里的canal将binlog日志采集发送到MQ队列」里面,然后「通过ACK机制 确认处理」** 这条更新消息,删除缓存,保证数据缓存一致性。

但是呢还有个问题,「如果是主从数据库呢」

缓存维护方案五

主从DB问题:因为主从DB同步存在延时时间。如果删除缓存之后,数据同步到备库之前已经有请求过来时,「会从备库中读到脏数据」,如何解决呢?解决方案如下流程图:

缓存维护总结

综上所述,在分布式系统中,缓存和数据库同时存在时,如果有写操作的时候,「先操作数据库,再操作缓存」。如下:

  • 1.读取缓存中是否有相关数据
  • 2.如果缓存中有相关数据valu
点击领取2024完整开源项目《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

e,则返回

  • 3.如果缓存中没有相关数据,则从数据库读取相关数据放入缓存中key->value,再返回
  • 4.如果有更新数据,则先更新数据库,再删除缓存
  • 5.为了保证第四步删除缓存成功,使用binlog异步删除
  • 6.如果是主从数据库,binglog取自于从库
  • 7.如果是一主多从,每个从库都要采集binlog,然后消费端收到最后一台binlog数据才删除缓存

最后

腾讯T3大牛总结的500页MySQL实战笔记意外爆火,P8看了直呼内行

腾讯T3大牛总结的500页MySQL实战笔记意外爆火,P8看了直呼内行

binlog,然后消费端收到最后一台binlog数据才删除缓存

最后

[外链图片转存中…(img-4SlCpSRc-1709726933566)]

[外链图片转存中…(img-GRykVy8x-1709726933566)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信jsSDK前端签名错误,巨坑; 前后端分离的一大失误。

微信 JS 接口签名校验工具 1. 确保你后端生成的签名是正确,这个是第一步。否则后面都是白扯。 以用上面微信自带的验证签名工龄进行验证。 确保生成的签名和你的签名是一致的。 2. timestamp需要是字符串类型. 3. 切记,URL不要encode,如果…

9.12零钱兑换(LC518-M)(开始完全背包,与01背包的不同仅在于遍历顺序)

算法: 这是一道典型的背包问题,一看到钱币数量不限,就知道这是一个完全背包。 但本题和纯完全背包不一样,纯完全背包是凑成背包最大价值是多少,而本题是要求凑成总金额的物品组合个数! 动规五步曲&#…

剑指offer--c++--n个骰子的点数

目录 题目: 题目分析: 最后编写代码: 输出结果 题目: 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。 感谢大佬的帮助:https://www.cnblogs.c…

人人都写过的6个bug

大家好&#xff0c;我是知微。 程序员写bug几乎是家常便饭&#xff0c;也是我们每个人成长过程中难以避免的一部分。 为了缓解这份“尴尬”&#xff0c;今天想和大家分享一些曾经都会遇到过的bug&#xff0c;让我们一起来看看这些“经典之作”。 1、数组越界 #include <…

数据库-DDL

show databases; 查询所有数据库 select database(); 查询当前数据库 use 数据库名&#xff1b; 使用数据库 creat database[if not exists] 数据库名…

成都源聚达:开抖音店铺分数需要达到多少

在数字化浪潮中&#xff0c;抖音以其独特的平台魅力吸引了无数商家入驻。但想要开设一家抖音店铺并非随意之举&#xff0c;它需要商家达到一定的评分标准。这如同参加一场考试&#xff0c;只有成绩合格者才有资格入座。那么&#xff0c;这个分数线究竟是多少呢? 据官方数据显示…

力扣hot100:560.和为K的子数组(前缀和+哈希表)

分析&#xff1a; 这个题目乍一看&#xff0c;数据大小用暴力解法大概率会超时&#xff0c;可能想用双指针&#xff0c;但是问题出现在 可能存在负数&#xff0c;也就是说即使是找到了一个答案&#xff0c;后面也可能存在负数和正数抵消&#xff0c;又是答案&#xff0c;因此不…

【Linux】文件传输工具lrzsz的安装与使用

目录 一、关于lrzsz 二、安装lrzsz 三、lrzsz的说明及使用 1、上传命令rz 2、下载命令sz 一、关于lrzsz 在开发的过程中&#xff0c;经常遇到 需要在 Linux 和 Windows 之间上传下载文件的情况 这时&#xff0c;一般都是使用 FTP 或者 WinSCP 工具进行上传下载, 虽然也能…

用ChatGPT计算植被归一化指数NDVI并出图的详细教程

用ChatGPT结合GIS计算植被归一化指数NDVI出图教程 用ENVI计算比较繁琐&#xff0c;如今AI的盛行&#xff0c;我们可以轻松解决计算问题&#xff0c;只需1一分钟变可以出图。 详细教学请看上方视频步骤。 更多ChatGPT教学内容请见&#xff1a;ChatGPT结合GIS&#xff1a;一分钟…

深度学习_18_模型的下载与读取

在深度学习的过程中&#xff0c;需要将训练好的模型运用到我们要使用的另一个程序中&#xff0c;这就需要模型的下载与转移操作 代码&#xff1a; import math import torch from torch import nn from d2l import torch as d2l import matplotlib.pyplot as plt# 生成随机的…

服务器为什么会卡顿,出现卡顿情况怎么办

从维护服务器的角度来看&#xff0c;服务器卡顿是一种常见的问题&#xff0c;但服务器卡顿可能会影响到网站、游戏或平台的正常访问和运行&#xff0c;所以出现卡顿问题首先需要对服务器进行全面的检查&#xff0c;确定卡顿原因&#xff0c;然后选取适合的解决方案&#xff0c;…

基于Spring Boot的秒杀系统(附项目源码+论文)

摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本次开发一套基于Spring Boot的秒杀系统&am…

网络编程作业day6

数据库操作的增、删、改完成 #include <myhead.h>//查询的回调函数 int callback(void* data,int count,char** argv, char** columnName) {//count是字段数//argv是字段内容//columnName是字段名称for(int i0;i<count;i) {printf("%s%s\n", columnName[…

智能驾驶规划控制理论学习06-基于优化的规划方法

目录 一、优化概念 1、一般优化问题 2、全局最优和局部最优 二、无约束优化 1、无约束优化概述 2、梯度方法 通用框架 线性搜索 回溯搜索 3、梯度下降 基本思想 实现流程 ​4、牛顿法 基本思想 实现流程 5、高斯牛顿法 6、LM法&#xff08;Le…

通过hyperbeam创建梁单元截面属性

1、为模型中标准的圆柱形创建梁单元和赋予属性&#xff1b; 2、为模型中不标准的对称性实体创建梁单元和赋予属性&#xff1b; 3、为模型中壳体部分创建梁单元和赋予属性&#xff1b;

上位机图像处理和嵌入式模块部署(qmacvisual三个特色)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 了解了qmacvisual的配置之后&#xff0c;正常来说&#xff0c;我们需要了解下不同插件的功能是什么。不过我们不用着急&#xff0c;可以继续学习下…

分布式事务(SeataClient)

问题场景 元数据 库存 100订单记录为空下单操作 @AutowiredRestTemplate restTemplate;/*** 下单** @return*/@Transactional // 开启事务 异常后触发数据库回滚操作@Overridepublic Order create(Order order) {// 插入订单orderMapper.insert(order);// 扣减库存 MultiValu…

Python 弱引用全解析:深入探讨对象引用机制!

目录 前言 弱引用的概述 弱引用的原理 使用 WeakRef 类创建弱引用 使用 WeakValueDictionary 类创建弱引用字典 实际应用场景 1. 解决循环引用问题 2. 对象缓存 总结 前言 在Python编程中&#xff0c;弱引用&#xff08;Weak Reference&#xff09;是一种特殊的引用方式…

折线图 温度变化曲线图

代码详情介绍 导入必要的库&#xff1a; matplotlib.pyplot&#xff1a;用于绘图。 matplotlib.font_manager&#xff1a;用于设置中文字体。 datetime&#xff1a;用于处理日期和时间。 random&#xff1a;用于生成随机数。 numpy&#xff1a;用于生成arange函数的刻度。 设置…

【kubernetes】关于k8s集群如何将pod调度到指定node节点?

目录 一、k8s的watch机制 二、scheduler的调度策略 Predicate&#xff08;预选策略&#xff09; 常见算法&#xff1a; priorities&#xff08;优选策略&#xff09;常见的算法有&#xff1a; 三、k8s的标签管理之增删改查 四、k8s的将pod调度到指定node的方法 方案一&am…