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

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

python安装包,!pip 和不加!命令,功能区别一览

python安装包,!pip 和不加!命令,功能区别一览 1. !pip2. pip(不加 !)3. 区别总结4. 推荐用法5. 注意事项6. 总结 在 Jupyter Notebook 或 IPython 环境中,!pip 和 pip 的功能有所不同,主要体现在执行环境和…...

html转PDF文件最完美的方案(wkhtmltopdf)

目录 需求 一、方案调研 二、wkhtmltopdf使用 如何使用 文档简要说明 三、后端服务 四、前端服务 往期回顾 需求 最近在做报表类的统计项目,其中有很多指标需要汇总,网页内容有大量的echart图表,做成一个网页去浏览,同时…...

我最近在干什么【2】

前言 这系列的上一篇是2024.12.05写的,现在是2025.02.06,这都两个月🤔小久。 不是完整全面的技术分享,话题聚焦个人成长(学的技术、了解到的信息、看的书……) 方面。文章偏意识流点,单纯分享我…...

deepseek本地部署

DeepSeek本地部署详细指南 DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,这里记录自己DeepSeek本地部署流程。 主机环境 cpu:amd 7500Fgpu:406…...

【Reading Notes】Favorite Articles from 2025

文章目录 1、January2、February3、March4、April5、May6、June7、July8、August9、September10、October11、November12、December 1、January 极越之后,中国车市只会倒下更多人(2025年01月01日) 在这波枪林弹雨中,合资品牌中最…...

配置@别名路径,把@/ 解析为 src/

路径解析配置 webpack 安装 craco npm i -D craco/craco 项目根目录下创建文件 craco.config.js ,内容如下 const path require(path) module.exports {webpack: {// 配置别名alias: {// 约定: 使用 表示src文件所在路径: path.resolve(__dirname,src)…...

【LeetCode 刷题】回溯算法(2)-分割问题

此博客为《代码随想录》二叉树章节的学习笔记,主要内容为回溯算法分割问题相关的题目解析。 文章目录 131.分割回文串93.复原IP地址 131.分割回文串 题目链接 class Solution:def partition(self, s: str) -> List[List[str]]:res, path [], []def check(s: …...

AJAX笔记原理篇

黑马程序员视频地址: AJAX-Day03-01.XMLHttpRequest_基本使用https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p33https://www.bilibili.com/video/BV1MN411y7pw?vd_sour…...

一表总结 Java 的3种设计模式与6大设计原则

设计模式通常分为三大类:创建型、结构型和行为型。 创建型模式:主要用于解决对象创建问题结构型模式:主要用于解决对象组合问题行为型模式:主要用于解决对象之间的交互问题 创建型模式 创建型模式关注于对象的创建机制&#xf…...

[paddle] 矩阵的分解

特征值 设 A A A 是一个 n n n \times n nn 的方阵, λ \lambda λ 是一个标量, v \mathbf{v} v 是一个非零向量。如果满足以下方程: A v λ v A\mathbf{v} \lambda\mathbf{v} Avλv 则称 λ \lambda λ 为矩阵 A A A 的一个 特征值…...

极限的深入探讨:从概念到应用的完整指南

极限的深入探讨:从概念到应用的完整指南 一、历史背景与发展 1. 极限概念的演变 在维尔斯特拉斯(Karl Weierstrass,1815-1897)提出他的严格定义之前,极限概念经历了漫长的发展过程: 古希腊时期&#xf…...

康谋方案 | BEV感知技术:多相机数据采集与高精度时间同步方案

随着自动驾驶技术的快速发展,车辆准确感知周围环境的能力变得至关重要。BEV(Birds-Eye-View,鸟瞰图)感知技术,以其独特的视角和强大的数据处理能力,正成为自动驾驶领域的一大研究热点。 一、BEV感知技术概…...

UE学习日志#23 C++笔记#9 编码风格

注:此文章为学习笔记,只记录个人不熟悉或备忘的内容 1 为代码编写文档 1.1 使用注释的原因 1.说明用途的注释 应该注释的信息:输入,输出含义,参数的类型含义,错误条件和处理,预期用途&#x…...

更换IP属地会影响网络连接速度吗

在数字化时代,网络连接速度对于个人用户和企业来说都至关重要。无论是日常浏览网页、观看视频,还是进行在线办公、游戏娱乐,网络速度都直接影响着我们的体验。而IP属地,作为网络连接中的一个重要元素,其变动是否会引发…...

深入探索 C++17 特征变量模板 (xxx_v)

文章目录 一、C++类型特征的前世今生二、C++17特征变量模板闪亮登场三、常见特征变量模板的实际应用(一)基本类型判断(二)指针与引用判断四、在模板元编程中的关键作用五、总结与展望在C++的持续演进中,C++17带来了许多令人眼前一亮的特性,其中特征变量模板(xxx_v)以其…...

C# 中 Guid类 使用详解

总目录 前言 C# 中的 Guid 类(全局唯一标识符,Globally Unique Identifier)用于生成和操作 128 位的唯一标识符。它在需要唯一标识的场景(如数据库主键、分布式系统等)中广泛使用。 一、什么是 Guid Guid&#xff08…...

生产环境的 MySQL事务隔离级别

MySQL 数据库的默认隔离级别是 RR( 可重复读 ),但是很多大公司把隔离级别改成了 RC(读已提交),主要原因是为了提高并发和降低死锁概率 为了解决幻读的问题 RR 相比 RC 多了间隙锁( gap lock )和临键锁( next-keylock )。而 RC 中修改数据仅用行锁&#…...

无用知识研究:std::initializer_list的秘密

先说结论,用std::initializer_list初始化vector,内部逻辑是先生成了一个临时数组,进行了拷贝构造,然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化,这个动作又触发了拷贝…...

web安全:任意文件下载漏洞

背景: 点击对应名字,下载对应图片。但服务器还存在其他文件,只是前端没有展示出来。通过模拟路径下载,可以获取到意想不到的数据。 看点击代码: 如果模拟没有前端的图片,也会发现下载了 所以这个叫任…...

oracle:索引(B树索引,位图索引,分区索引,主键索引,唯一索引,联合索引/组合索引,函数索引)

索引通过存储列的排序值来加快对表中数据的访问速度,帮助数据库系统快速定位到所需数据,避免全表扫描 B树索引(B-Tree Index) B树索引是一种平衡树结构,适合处理范围查询和精确查找。它的设计目标是保持数据有序,并支持高效的插入…...

大模型实战篇之Deepseek二、一键部署DeepSeek-V3和DeepSeek-R1模型

一键部署DeepSeek-V3和DeepSeek-R1模型:3步,0代码! 随着人工智能技术的飞速发展,越来越多的企业和开发者希望将强大的AI模型快速应用到实际业务中。DeepSeek作为一款高性能的语言模型,已经在多个领域展现出巨大的应用潜力。然而,传统的模型部署流程往往复杂且耗时。今天,…...

【CPP】CPP经典面试题

文章目录 引言1. C 基础1.1 C 中的 const 关键字1.2 C 中的 static 关键字 2. 内存管理2.1 C 中的 new 和 delete2.2 内存泄漏 3. 面向对象编程3.1 继承和多态3.2 多重继承 4. 模板和泛型编程4.1 函数模板4.2 类模板 5. STL 和标准库5.1 容器5.2 迭代器 6. 高级特性6.1 移动语义…...

Windows 中学习Docker环境准备2、Docker Desktop中安装ubuntu

Windows 中学习Docker环境准备1、Win11安装Docker Desktop Windows 中学习Docker环境准备2、Docker Desktop中安装ubuntu Windows 中学习Docker环境准备3、在Ubuntu中安装Docker 需要更多Docker学习视频和资料,请文末联系 一、安装 Docker Desktop 下载 Docker…...

C++11详解(三) -- 可变参数模版和lambda

文章目录 1.可变模版参数1.1 基本语法及其原理1.2 包扩展1.3 empalce系列接口1.3.1 push_back和emplace_back1.3.2 emplace_back在list中的使用(模拟实现) 2. lambda2.1 lambda表达式语法 1.可变模版参数 1.1 基本语法及其原理 1. C11支持可变参数模版&…...

网站打开提示不安全

当网站打开时显示“不安全”提示(通常表现为浏览器地址栏中出现“不安全”字样或红色警告图标),这意味着网站未使用有效的SSL证书或HTTPS协议,导致浏览器认为连接不安全。以下是解决这一问题的详细步骤: 一. 原因分析 …...

OpenCV:特征检测总结

目录 一、什么是特征检测? 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT(尺度不变特征变换) 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…...

标志的推理

下面的讨论是我对《对编程实现拟人智能可行性的论证》这篇文章的“赋值与对象的标志”这一节的展开讨论。 标志能够使我们更好的思维(比如用轮廓标记物体对象,用兴奋强度标记回忆情况等等)。有思维标志、信息标志,单纯标志、组合…...

python学opencv|读取图像(五十七)使用cv2.bilateralFilter()函数实现图像像素双边滤波处理

【1】引言 前序学习过程中,已经掌握了对图像的基本滤波操作技巧,具体的图像滤波方式包括均值滤波、中值滤波和高斯滤波,相关文章链接有: python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素…...

【SQL技术】不同数据库引擎 SQL 优化方案剖析

一、引言 在数据处理和分析的世界里,SQL 是不可或缺的工具。不同的数据库系统,如 MySQL、PostgreSQL(PG)、Doris 和 Hive,在架构和性能特点上存在差异,因此针对它们的 SQL 优化策略也各有不同。这些数据库中…...