当前位置: 首页 > news >正文

Java实战经验分享

1. 项目优化与性能提升

面试问题:

聊聊你印象最深刻的项目,或者做了哪些优化

  1. 你在项目中如何解决缓存穿透问题? 缓存穿透是我们做缓存优化时最常遇到的问题,特别是当查询的对象在数据库中不存在时,缓存层和数据库都会被频繁访问,造成性能浪费。为了解决这个问题,我们通常会设置一个特殊的标记值(比如 -1),表示该数据在数据库中不存在。当下次查询时,如果缓存值是 -1,就直接返回,不会再次查询数据库。这种方式简单有效,避免了缓存每次都访问数据库的性能瓶颈

  2. 如何处理缓存击穿问题? 另一个常见的问题就是缓存击穿,通常发生在缓存中某个热点数据过期时,多个请求同时查询这个数据,导致大量请求直接访问数据库。为了解决这个问题,我们可以通过设置不同的缓存过期时间来避免多个缓存同时过期,此外,还可以使用加锁机制,保证只有一个请求能查询数据库,其他请求则直接等待缓存更新

项目中的优化:

在项目中,我们也使用了定时任务来定期刷新热点数据缓存,避免在高并发场景下,缓存过期导致大量数据库请求。此外,采用了缓存预热机制,提前将热点数据加载到缓存中,从而避免流量高峰期缓存不命中的问题

2. 分布式锁的使用

你们项目中是如何使用分布式锁的?能具体讲讲它的工作原理和实现吗?

  1. 分布式锁的工作原理是什么? 分布式锁是为了在分布式系统中保证多个节点对共享资源的访问排他性。它的工作原理是,通过某种机制,确保在同一时刻只有一个节点能够获得锁,其他节点会被阻塞直到锁被释放。常见的实现方式包括基于数据库的锁、Redis的SETNX命令、以及Redisson等高层封装

  2. 你们是如何实现锁的失效机制的? 为了防止死锁的发生,我们在分布式锁实现时,需要为锁设置超时时间。比如,在Redis中,我们可以使用SETNX命令来获取锁,锁设置一个失效时间,这样即使请求在执行过程中发生异常,锁也会在超时后自动释放,避免死锁问题

  3. Redisson的分布式锁能解决哪些问题? 在我们项目中,我们使用了Redisson来实现分布式锁,Redisson封装了Redis的各种操作,提供了更加稳定的分布式锁实现。而且它自带的watch dog机制,可以在锁的过期时间到达时自动续期,避免了锁过期导致的并发问题

  4. Zookeeper和Etcd是如何保证分布式锁的互斥性的? 对于Zookeeper,它通过使用有序节点和watch机制来保证分布式锁的互斥性。每当某个节点释放锁时,Zookeeper会通知下一个获取锁的节点。Etcd则是通过基于Raft协议的分布式一致性算法来保证数据一致性,结合Prefix机制和watch功能实现分布式锁

3. 分布式事务的解决方案

在分布式系统中,如何处理分布式事务?你在项目中用了什么方案?

  1. 你理解的CAP理论和BASE理论是什么? CAP理论描述了在分布式系统中,一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)三者不可兼得。而BASE理论则是关于分布式事务的一种解决思路,它强调的是“基本可用、软状态、最终一致性”,并不是像传统的ACID那样强一致性

  2. 你在项目中使用了什么分布式事务解决方案? 在我们项目中,我们使用了TCC(Try、Confirm、Cancel)方案来解决分布式事务的问题。TCC方案的核心思想是:对于每个操作,都需要定义Try、Confirm和Cancel三个阶段。Try阶段执行操作的预处理,Confirm阶段进行提交,Cancel阶段则在失败时回滚之前的操作。TCC方案能够帮助我们处理不同微服务之间的数据一致性,并且通过补偿机制保证最终一致性

  3. Seata的使用场景是什么? Seata是一个分布式事务解决方案,能够帮助我们在微服务架构中处理跨服务的数据一致性。它通过全局事务管理器协调多个本地事务,确保事务的一致性。在我们的项目中,Seata解决了微服务之间的分布式事务问题,尤其是在大规模并发场景下,能够有效减少事务回滚和数据不一致的风险

  4. 你们如何保证接口的幂等性? 接口的幂等性是分布式系统中一个非常重要的设计点,特别是在面对网络问题或请求超时时。我们通过多个策略来确保接口的幂等性:例如,在数据库中设置唯一约束来避免重复插入,或者在操作时生成唯一的请求ID,确保相同的请求不会被执行多次

关于接口的幂等性:

我们在接口设计时通常会使用select + insert + 主键冲突的方式来确保接口的幂等性。如果接口请求已经被处理过,数据库的主键/唯一索引冲突就会自动返回已经处理的结果。除此之外,我们还使用了token令牌、乐观锁等方式来保证在高并发场景下接口的幂等性,避免重复提交订单或多次扣款的情况

4. MySQL架构设计

面试问题:

你们的MySQL架构是怎样的?能介绍一下如何保证数据库的高可用性吗?

  1. 你们使用了什么样的数据库架构? 我们公司在数据库架构上采用了主从复制的方式,即一主多从。主库负责写操作,从库负责读操作,这样可以有效分担主库的读压力,提升系统的并发能力。每个从库都会定期同步主库的数据,这样即使主库宕机,从库也能保证数据的完整性

  2. 如何处理MySQL的高可用性? 为了保证MySQL的高可用性,我们使用了MHA(Master High Availability)方案,当主库发生故障时,能够自动切换到从库,确保业务不中断。此外,我们还会使用数据库中间件(如Mycat)来对数据库进行分片,以应对海量数据的高并发需求

  3. MariaDB多主集群方案的优缺点是什么? MariaDB的多主集群方案通过Galera Replication实现多主节点之间的数据同步,能够同时支持多个节点进行读写操作,提升了系统的可用性和扩展性。缺点是,当某个节点变慢时,其他节点的性能也会受到影响,因此需要根据业务场景选择合适的数据库架构

  4. 数据库中间件的使用场景是什么? 我们在面对高并发、高数据量的需求时,使用了数据库中间件(如Mycat)进行数据分片。数据库中间件能够根据特定的规则将数据分散到多个数据库实例中,从而减轻单一数据库的压力,确保系统的高可用性和扩展性

日常工作中你是怎么优化 SQL 的?

MySQL 的性能优化可以分为 4 大部分
  1. 硬件和操作系统层面的优化
  2. 架构设计层面的优化
  3. MySQL 程序配置优化
  4. SQL 优化

  1. 硬件及操作系统层面优化
    从硬件层面来说,影响 Mysql 性能的因素有,CPU、可用内存大小、磁盘读写速度、网络带宽
    从操作系统层面来说,应用文件句柄数、操作系统网络的配置都会影响到 Mysql 性能。
    这部分的优化一般由 DBA 或者运维工程师去完成。
    在硬件基础资源的优化中,我们重点应该关注服务本身承载的体量,然后提出合理的指标要求,避免出
    现资源浪费!
  2. 架构设计层面的优化
    MySQL 是一个磁盘 IO 访问量非常频繁的关系型数据库 在高并发和高性能的场景中.MySQL 数据库必然会承受巨大的并发压力,而此时,我们的优化方式可以 分为几个部分 MySQL 程序配置优化 MySQL 是一个经过互联网大厂验证过的生产级别的成熟数据库,对于 Mysql 数据库本身的优化,一般 是通过 Mysql 中的配置文件 my.cnf 来完成的,比如: Mysql5.7 版本默认的最大连接数是 151 个,这个值可以在 my.cnf 中修改。 binlog 日志,默认是不开启 缓存池 bufferpoll 的默认大小配置等。 由于这些配置一般都和用户安装的硬件环境以及使用场景有关系,因此这些配置官方只会提供一个默认 值,具体情况还得由使用者来修改。
  3. SQL 优化又能分为三部曲
    慢 SQL 的定位和排查
    我们可以通过慢查询日志和慢查询日志分析工具得到有问题的 SQL 列表。
    执行计划分析
    针对慢 SQL,我们可以使用关键字 explain 来查看当前 sql 的执行计划.可以重点关注 type key rows
    filterd 等字段 ,从而定位该 SQL 执行慢的根本原因。再有的放矢地进行优化
    使用 show profile 工具
    Show Profile 是 MySQL 提供的可以用来分析当前会话中,SQL 语句资源消耗情况的工具,可用于 SQL
    调优的测量。在当前会话中.默认情况下处于 show profile 是关闭状态,打开之后保存最近 15 次的运
    行结果
    针对运行慢的 SQL,通过 profile 工具进行详细分析.可以得到 SQL 执行过程中所有的资源开销情况.
    如 IO 开销,CPU 开销,内存开销等

相关文章:

Java实战经验分享

1. 项目优化与性能提升 面试问题: 聊聊你印象最深刻的项目,或者做了哪些优化 你在项目中如何解决缓存穿透问题? 缓存穿透是我们做缓存优化时最常遇到的问题,特别是当查询的对象在数据库中不存在时,缓存层和数据库都会…...

前端控制器模式

前端控制器模式 概述 前端控制器模式(Front Controller Pattern)是一种设计模式,它将应用程序中的所有用户请求统一交由一个控制器处理。这种模式在MVC(Model-View-Controller)架构中尤为常见,它能够简化…...

Linux之安装docker

一、检查版本和内核是否合格 Docker支持64位版本的CentOS 7和CentOS 8及更高版本,它要求Linux内核版本不低于3.10。 检查版本 cat /etc/redhat-release检查内核 uname -r二、Docker的安装 1、自动安装 Docker官方和国内daocloud都提供了一键安装的脚本&#x…...

BUUCTF_XSS-Lab

xss XSS(Cross - Site Scripting)即跨站脚本攻击,是一种常见的 Web 安全漏洞。攻击者通过在目标网站注入恶意脚本(通常是 JavaScript),当其他用户访问该网站时,这些恶意脚本会在用户的浏览器中执…...

springBoot使用

1.什么是SpringBoot SpringBoot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。SpringBoot是伴随Spring4.0的时候发布的一个框架。SpringBoot用来简化Spring应用的开发,约定大于配置,去繁从简。 从本质上来说&#xff…...

DS图(中)(19)

文章目录 前言一、图的遍历广度优先遍历深度优先遍历 二、最小生成树Kruskal算法Prim算法两种方法对比 总结 前言 承上启下,我们来学习下图的中篇!!! 一、图的遍历 图的遍历指的是遍历图中的顶点,主要有 广度优先遍历 …...

Vue Dom截图插件,截图转Base64 html2canvas

安装插件 npm install html2canvas --save插件使用 <template><div style"padding: 10px;"><div ref"imageTofile" class"box">发生什么事了</div><button click"toImage" style"margin: 10px;&quo…...

Unity3D仿星露谷物语开发小结1

1、Cinemachine的作用及使用方法 &#xff08;1&#xff09;作用 控制Camera的模块&#xff0c;实现摄像机的复杂控制&#xff0c;比如角色的跟随&#xff0c;限制Camera的区域 &#xff08;2&#xff09;使用方法 在已有Main Camera的情况下&#xff0c; 通过【GameObject -&…...

graylog初体验

最近graylog比较火&#xff0c;部署了一个来测试下&#xff0c;看下后续能不能代替目前占用资源比较多的elk&#xff0c;目前未对graylog性能进行深入测试&#xff0c;只是简单体验了下&#xff0c;graylog的UI比较简陋&#xff0c;但是在报警以及权限方面优于ELK&#xff0c;整…...

15.PPT:文静-云计算行业发展【29】

目录 NO123​ NO345​ NO6​ NO78 NO9/10/11/12​ NO123 设计→幻灯片大小→自定义幻灯片大小→ 全屏显示&#xff08;16&#xff1a;9&#xff09;→最大化 NO345 SmartArt 主题颜色2/6/9&#xff1a;形状样式&#xff1a;样式 加大行距加宽间距 NO6 NO78 设计→设置背景…...

高端入门:Ollama 本地高效部署DeepSeek模型深度搜索解决方案

目录 一、Ollama 介绍 二、Ollama下载 2.1 官网下载 2.2 GitHub下载 三、模型库 四、Ollmal 使用 4.1 模型运行&#xff08;下载&#xff09; 4.2 模型提问 五、Ollama 常用命令 相关推荐 一、Ollama 介绍 Ollama是一个专为在本地机器上便捷部署和运行大型语言模型&…...

MFC 的 CListCtrl 控件,使用SetItemState 方法来设置选中某个 item,如何达到效果和鼠标点击一致

1&#xff09;查询到的方法如下&#xff1a; // 假设你要选中第 2 行&#xff08;索引从 0 开始&#xff09; int nItem 1; // 取消所有其他选中项 m_ListCtrl.SetItemState(-1, 0, LVIS_SELECTED); // 设置选中状态&#xff0c;并确保它具有焦点 m_ListCtrl.SetItemStat…...

一文读懂:TCP网络拥塞的应对策略与方案

TCP&#xff08;传输控制协议&#xff09;是互联网中广泛使用的可靠传输协议&#xff0c;它通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制确保数据的可靠传输。然而&#xff0c;在网络环境中&#xff0c;由于多个主机共享网络资源&#xff0c;网络拥塞成为了一个…...

深度整理总结MySQL——子查询的工作原理

子查询的工作原理 前言为什么开发人员喜欢写子查询查询重写条件化简移除不必要的括号常量传递&#xff08;constant_propagation&#xff09;移除没用的条件&#xff08;trivial_condition_removal&#xff09;HAVING子句和WHERE子句的合并 常量表检测外连接消除 子查询子查询语…...

20240824 美团 笔试

文章目录 1、单选题1.11.21.31.41.51.61.71.81.91.101.111.121.131.141.151.161.171.181.191.202、编程题2.12.2岗位:硬件开发工程师(嵌入式系统软件开发方向) 题型:20 道单选题,2 道编程题题 1、单选题 1.1 C 语言中,如果输入整数 v 是 2 的幂,下面表达式中哪个会返…...

Windows图形界面(GUI)-QT-C/C++ - QT 文本编辑控件详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 概述 1. QLineEdit 1.1 特点 1.2 属性 1.3 常用方法 1.4 拓展应用 2. QTextEdit 2.1 特点 2.2 属性 2.3 常用方法 2.4 拓展应用 3. QPlainTextEdit 3.1 特点 3.2 属性 3.3…...

IDEA中Resolving Maven dependencies卡着不动解决方案

一、修改settings.xml Maven配置阿里云仓库主要通过修改Maven的settings.xml文件来实现‌。以下是具体步骤: ‌1、找到settings.xml文件‌: 通常位于Maven安装目录下的conf文件夹中,或者在用户目录下的.m2文件夹中(如果用户自定义了settings.xml的位置)。 2、‌编辑se…...

go数据结构学习笔记

本博文较为完整的实现了go的链表、栈&#xff0c;队列&#xff0c;树&#xff0c;排序&#xff0c;链表包括顺序链表&#xff0c;双向链表&#xff0c;循环链表&#xff0c;队列是循环队列&#xff0c;排序包含冒牌、选择 1.链表 1.1 顺序链表 type LNode struct {data intn…...

【后端开发】系统设计101——Devops,Git与CICD,云服务与云原生,Linux,安全性,案例研究(30张图详解)

【后端开发】系统设计101——Devops&#xff0c;Git与CICD&#xff0c;云服务与云原生&#xff0c;Linux&#xff0c;安全性&#xff0c;案例研究&#xff08;30张图详解&#xff09; 文章目录 1、DevopsDevOps与SRE与平台工程的区别是什么&#xff1f;什么是k8s&#xff08;Ku…...

Google地图瓦片爬虫——进阶版

紧接上一篇——Google地图瓦片爬虫 clash节点自动切换 为了防止一个IP地址访问频率过快问题&#xff0c;自动切换clash的节点 def change_node(is_stop):while True:_r requests.get("http://127.0.0.1:11053/proxies", headersclash_headers, verifyFalse)# 这里…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

rm视觉学习1-自瞄部分

首先先感谢中南大学的开源&#xff0c;提供了很全面的思路&#xff0c;减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接&#xff1a;https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架&#xff1a; 代码框架结构&#xff1a;readme有…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...