自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 优雅终止线程的设计模式

两阶段终止(Two-phase Termination)模式是一种用于优雅终止线程的设计模式。Java线程进入终止状态的前提是线程进入RUNNABLE状态,而实际上线程也可能处在休眠状态,也就是说,我们想要终止一个线程,首先要把线程的状态从休眠状态转换到RUNNABLE状态。利用Java线程中断机制的interrup()方法,可以让线程从休眠状态转换到RUNNABLE状态。思考:第二阶段,线程转换到RUNNABLE状态之后,我们如何再将其终止呢?

2026-04-13 21:40:08 103

原创 从0开始深入理解并发、线程与等待通知机制

1. 进程我们常听说的是应用程序,也就是app,由指令和数据组成。但是当我们不运行一个具体的app时,这些应用程序就是放在磁盘(也包括U盘、远程网络存储等等)上的一些二进制的代码。一旦我们运行这些应用程序,指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备,从这种角度来说,进程就是用来加载指令、管理内存、管理 IO的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。

2026-04-12 17:07:31 266

原创 垃圾收集器ParNew&CMS与底层三色标记算法详解

当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。比如在新生代中,每次收集都会有大量对象(近99%)死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。

2026-04-07 18:46:03 379

原创 JVM对象创建与内存分配机制深度剖析

jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩jvm配置参数:UseCompressedOops,compressed--压缩、oop(ordinary object pointer)--对象指针启用指针压缩:-XX:+UseCompressedOops(默认开启),禁止指针压缩:-XX:-UseCompressedOops。

2026-03-29 23:37:35 348

原创 JVM内存模型深度剖析与优化

如果释放了很少的空间, 那么在不超过-XX:MaxMetaspaceSize(如果设置了的话) 的情况下, 适当提高该值。对象在堆内部挪动的过程其实是复制,原有区域对象还在,一般不直接清理,JVM内部清理过程只是将对象分配指针移动到区域的头位置即可,比如扫描s0区域,扫到gcroot引用的非垃圾对象是将这些对象复制到s1或老年代,最后扫描完了将s0区域的对象分配指针移动到区域的起始位置即可,s0区域之前对象并不直接清理,当有新对象分配了,原有区域里的对象也就被清除了。-Xss:每个线程的栈大小。

2026-03-17 08:30:30 326

原创 JAVA类加载机制

虽然经理在OA系统里看不到SalaryCaler类的源码了,但是通过OA系统的源码最终还是可以找到这个jar包。那么就可以对jar包进行反编译,查看到jar包对应的源码了。所以,老王还需要考虑如何对class文件进行代码混淆,让经理无法反编译出源码。简单一点的,将class文件的后缀改一下,从.class转为.myclass。就像大家把游戏软件改成.txt结尾一样。只是修改后缀,那么经理还可以把后缀改回来再反编译。所以稳妥一点的方法,是要改一改class文件当中的二进制内容。

2026-03-15 18:13:12 337

原创 全面理解 JVM 虚拟机

JVM 虚拟机的字节码指令由一个字节长度的,代表着某种特定操作含义的数字(称为操作码,OpCode)以及跟其后的零至多个代表此操作所需要的参数(称为操作数,Operand)构成。其中操作数,可以是一个具体的参数,也可以是一个指向class文件常量池的符号引用,也可以是一个指向运行时常量池中的一个方法。因此,在 JVM 中,类并不直接保存在最宝贵最核心的堆内存当中,而是挪到了堆内存以外的一部分内存中。实际上,我们需要了解的是,Java 官方实际上只定义了JVM的一种执行规范,也就是class文件的组织规范。

2026-03-14 22:02:30 372

原创 MQ常见问题梳理

最后要注意到,这里讨论到的各种MQ消息防止丢失的方案,其实都是以增加集群负载,降低吞吐为代价的。这必然会造成集群效率下降。因此,这些保证消息安全的方案通常都需要根据业务场景进行灵活取舍,而不是一股脑的直接用上。这里希望你能够理解到,这些消息零丢失方案,其实是没有最优解的。因为如果有最优解,那么这些MQ产品,就不需要保留各种各样的设计了。这和很多面试八股文是有冲突的。面试八股文强调标准答案,而实际业务中,这个问题是没有标准答案的,一切,都需要根据业务场景去调整。所有的MQ,其实处理的都是一类相似的问题。

2026-03-10 21:01:57 333

原创 RocketMQ客户端核心编程模型

上篇文章我们从试验整理出了RocketMQ的运行架构图。同时还总结出了RocketMQ的消息模型。这是我们使用RocketMQ时最直接的指导。这一章节,我们就来看下,在这两张图的基础上,如何编写合适的客户端代码,让我们在项目中用好RocketMQ。

2026-03-05 22:13:33 348

原创 RocketMQ快速实战以及核心概念详解

MQ:MessageQueue,消息队列。是在互联网中使用非常广泛的一系列服务中间件。这个词可以分两个部分来看,一是Message:消息。消息是在不同进程之间传递的数据。这些进程可以部署在同一台机器上,也可以分布在不同机器上。二是Queue:队列。队列原意是指一种具有FIFO(先进先出)特性的数据结构,是用来缓存数据的。对于消息中间件产品来说,能不能保证FIFO特性,尚值得考量。但是,所有消息队列都是需要具备存储消息,让消息排队的能力。

2026-03-01 22:04:36 645

原创 Redis缓存设计与性能优化

以上我们针对的都是读多写少的情况加入缓存提高性能,如果写多读多的情况又不能容忍缓存数据不一致,那就没必要加缓存了,可以直接操作数据库。当然,如果数据库抗不住压力,还可以把缓存作为数据读写的主存储,异步将数据同步到数据库,数据库只是作为数据的备份。放入缓存的数据应该是对实时性、一致性要求不是很高的数据。切记不要为了用缓存,同时又要保证绝对的一致性做大量的过度设计和控制,增加系统复杂性!

2026-02-26 00:40:31 591

原创 电商系统大数据量订单导出的解决方案

电商系统每天订单1000+,订单表可能递增到上千万,现在要导出全部的订单数据,有没有什么好的解决办法,解决导出慢和内存溢出的情况?

2026-02-09 22:18:50 125

原创 Redis集群一般在什么情况下会导致整个集群不可用?

综上所述,要确保 Redis 集群的高可用性和稳定性,需要合理设计和配置集群架构,并采取适当的监控和容错措施来应对潜在的故障情况。

2026-02-08 14:31:34 70

原创 Redis事务是如何实现的?它和关系型数据库的事务区别是什么?

在 Redis 中事务是通过 MULTI/EXEC 命令实现,相对简单。

2026-02-06 22:29:34 205

原创 生产环境分布式锁的常见问题和解决方案有哪些?

当一个客户端获取了锁,但由于某些原因(如程序崩溃、异常等)无法释放锁时,会导致其他客户端永远无法获取锁。

2026-02-05 21:40:02 101

原创 分布式锁的特性是什么?如何实现分布式锁?

2026-02-04 22:05:55 69

原创 Redis的Key和Value的设计原则有哪些?

2026-02-03 22:02:37 120

原创 如何保证Redis缓存和数据库数据的一致性?

这种模式的关键在于确保数据库更新成功后再更新缓存,以避免缓存中的数据过时。

2026-02-02 22:04:02 384

原创 什么是Redis的大Key和热Key?项目中一般是怎么解决的?

通常以Key的大小和Key中成员的数量来综合判定。比如Key本身的Value过大,一个String类型的Key,它的值为10 MB;Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10000个。

2026-02-01 20:45:13 99

原创 Redis内存使用率在95%以上,请问是什么原因?如何解决?

场景不一样,问题的原因也可能不一样,解决方案也会不一样。具体的问题原因以及解决方案如下。

2026-02-01 20:36:35 449

原创 如何处理Redis集群数据倾斜?

在正常情况下,各数据分片节点的Key数量是均匀分布的,同时内存使用率、CPU使用率等性能指标也是相近的。一般是在使用Redis的过程中,,造成redis个别的节点数据量倾斜或数据访问倾斜,最终引起数据倾斜。设计考虑不周、不规范的数据写入及突发的访问量。

2026-02-01 20:22:34 57

原创 Redis数据安全性分析

Redis的所有数据是保存在内存当中的,得益于内存高效的读写性能,Redis的性能是非常强悍的。但是,内存的缺点是断电即丢失,所以,在实际项目中,Redis一旦需要保存一些重要的数据,就不可能完全使用内存保存数据。因此,在真实项目中要使用Redis,一定需要针对应用场景,对Redis的性能进行估算,从而在数据安全性与读写性能之间找到一个平衡点。Redis提供了压测脚本redis-benchmark,可以对Redis进行快速的基准测试。# 20个线程,100W个请求,测试redis的set指令(写数据)

2026-01-31 00:22:27 587

原创 redis集群有几种模式?分别讲讲这些集群模式的基本原理是什么?

根据业务需求(如数据量、性能、复杂度)选择合适的集群模式。

2026-01-29 22:17:34 274

原创 深入理解Redis线程模型

Redis事务可以通过Watch机制进一步保证在某个事务执行前,某一个key不被修改。注意:UNWATCH取消监听,只在当前客户端有效。比如下图。只有在左侧客户端步骤3之前执行UNWATCH才能让事务执行成功。在右侧客户端执行UNWATCH是不生效的。Redis事务失败如何回滚Redis中的事务回滚,不是回滚数据,而是回滚操作。如果事务是在EXEC执行前失败(比如事务中的指令敲错了,或者指令的参数不对),那么整个事务的操作都不会执行。

2026-01-29 00:21:18 954

原创 如果生产环境Redis实例CPU使用率很高,比如达到90%以上,请问可能产生的原因有哪些? 如何解决?

例如KEYS、HGETALL或使用MGET、MSET、HMSET、HMGET一次操作大量Key等。通常情况下,命令的时间复杂度越高,在执行时会消耗越多的资源,从而导致CPU使用率上升。由于命令执行单元为单线程的特性,Redis在执行高消耗命令时会引发排队导致应用响应变慢。极端情况下,甚至可能导致实例被整体阻塞,引发应用超时中断或流量跳过缓存层直接到达后端的数据库侧,引发雪崩效应。某个或某部分Key的请求访问次数显著超过其他Key时,代表此时可能产生了热Key。

2026-01-28 21:37:05 302

原创 Redis常用的数据类型有哪些?Zset的底层数据结构是什么?

最基本类型,存储文本、数字、二进制数据;底层底层数据结构SDS。

2026-01-27 22:17:58 191

原创 你知道MySQL常用的查询优化分析方法有哪些?说下你的看法和理解

如果要看得更加详细清晰可以使用EXPLAIN FORMAT=JSON或者EXPLAIN FORMAT=TREE,EXPLAIN ANALYZE,注意后面两个是mysql 8之后的新增功能。

2026-01-27 22:10:50 314

原创 假如不小心把数据库删了,请问应该怎么把数据恢复出来?

如果因为某些原因误删误删数据或者数据库,需要面对如何快速恢复问题。

2026-01-27 22:06:05 343

原创 一张表有500万数据,100多个字段,请问如何快速把数据查出来?

在处理大数据量和多字段的表时,优化查询性能是至关重要的。

2026-01-27 21:59:23 150

原创 Redis各种架构安装部署

到这⾥其实我们可以在使⽤ /opt/software/redis/redis-stable/src 或者 /usr/local/bin ⽬录下的 redis-server 启动 Redis 服务了。本教程将演示在 linux 环境下安装 Redis7,给⼤家最简单,最快捷的安装⽅式,其中包括单机部署、主从部署、哨兵部署、集群部署的安装以及相应的架构介绍。修改完成后,使⽤配置⽂件启动 Redis,并使⽤ redis-cli 连接测试,需要注意由于前⾯我们配置了安全密码,所以连接后需要先验证密码,否则会报错。

2026-01-27 00:12:51 424

原创 MySQL8.0高可用集群架构实战

InnoDB Cluster是MySQL官方实现高可用+读写分离的架构方案,其中包含以下组件。

2026-01-25 21:47:07 1152

原创 多事务并发导入数据场景题

事务1正常执行 ,事务2,3形成死锁,有一个事务会被中止。

2026-01-25 03:12:51 282

原创 MySQL(InnoDB引擎)加索引的时候会锁表吗?

从MySQL 5.6开始,创建和删除索引都支持Online DDL,意味着在索引操作过程中允许并发的DML操作(增删改查),不会对表进行锁定。这是通过INPLACE算法实现的,操作过程中不需要重建整个表。

2026-01-25 02:57:23 320

原创 MySQL 8.0 主从复制原理分析与实战

MySQL Replication是官方提供的主从同步方案,也是用的最广的同步方案。Replication(复制)使来自一个 MySQL数据库服务器(称为源(Source))的数据能够复制到一个或多个 MySQL 服务器(称为副本(Replica))。默认情况下,复制是异步的;副本不需要永久连接即可从源接收更新。根据配置,你可以复制所有数据库、指定数据库,甚至某个数据库中的指定表。说明: 旧版本的 MySQL 复制将源(Source)称为主(Master),将副本(Replica)称为从(Slave)

2026-01-23 00:14:40 968

原创 MVCC的原理是什么?谈谈你的理解!

MVCC通过为每行数据项维护多个版本来实现并发控制。当一个事务对数据进行修改时,它不会直接覆盖现有的数据,而是创建一个新的版本。这些不能数据版本形成了单向版本链。

2026-01-22 21:39:35 346

原创 mysql查询的时候使用where 1=1会不会影响性能?

在一张100多万的表里面把1=1 和<where>标签分别做了100次查询, 耗时时间相差无几。所以5.7后两种方式随便选。如果 MySQL Server版本小于 5.7,用了 MyBatis的话,建议使用<where> 标签。就是任何时候永远都为true的结果, 就会被优化器识别并优化掉,可以通过以下命令查看,就会发现1=1没有了。如果 MySQL版本大于等于 5.7,两个随便选;因为在MySQL5.7后,因为。

2026-01-22 21:38:35 151

原创 如果使用模糊查询MySQL数据库的数据,根据业务场景前缀匹配和后缀匹配都可能用到, 请问这个模糊查询该如何优化?

模糊匹配使用不当就会导致全表扫描引发慢查询的问题。问题严重的甚至会导致系统崩溃。

2026-01-21 21:32:37 306

原创 InnoDB底层原理与MySQL日志机制深入剖析

大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。

2026-01-21 01:52:47 958

原创 订单表3年积累了5000万条数据,需要删除1年前的历史订单(约3000万条),要求不影响线上业务,请说下你的方案?

先不关注订单在业务上是否允许,生产上也有类似场景,比如一些日志表。重点关注方案设计。

2026-01-20 23:43:37 233

原创 MySQL数据库:如果需要清理一下订单表历史数据,请问这三种TRUNCATE、DELETE、DROP方式哪种更好些?有什么区别吗?

是否需要保留表结构是否需要部分删除是否需要事务支持是否需要删除日志表的大小和业务影响选择合适的删除方式可以大大提高效率,同时避免不必要的风险。在实际操作中,建议先在测试环境验证,确保操作安全无误后再在生产环境执行。

2026-01-20 23:43:08 389

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除