xuMengqi's Blog

什么是依赖注入? 宽泛地讲,依赖注入(Dependency Inject,DI)是控制反转(Inversion of Control,IoC)的一种实现方式,本质上就是将依赖的创建和管理委派给IoC容器,使用者只需要声明要注入的依赖便可完成依赖的获取。在日常开发中,最常使用的Spring注解是@Component和@Autowired(或@Resource),前者将Bean注册到Sprin...
2023年07月25日
徐梦旗

当共享资源被多个线程同时访问时,可能会产生不符合预期的并发问题。为了保证共享资源在某一时刻只能被一个线程访问到,则需要对资源进行加锁,为此Java提供了一种易用的内置锁synchronized[^1]。锁的添加和释放过程如下: 在访问共享资源前,线程需要获取锁。如果获取锁成功,则访问共享资源;如果获取锁失败,则阻塞该线程,等待其他线程释放锁之后重新尝试获取锁。 在访问共享资源后,持有锁...
2024年04月22日
徐梦旗

索引的概念 什么是索引? 索引[^1](Index)是一种数据结构,用来加快查询的速度。如果表中的记录较少时,不创建索引也能满足查询的需求,但如果表中的记录较多时,如果不建立索引查询的速度会很慢。索引本质上是一种空间换时间的策略。 > 可以通过show index from <table_name>命令可以查看指定表中建立的索引。 什么是索引组织表? 索引组织表(Index O...
2024年01月19日
徐梦旗

当只有一个任务时,使用单个线程执行可以很好地满足需求;但由于单个线程是串行执行任务的,随着任务的增多,处理速度会很慢,如下代码: java List<Task> tasks = IntStream.range(1, 100) .mapToObj(Task::new) .collect(Collectors.toList());...
2024年05月27日
徐梦旗

相比于synchronized内置锁隐式地加锁和释放锁的方式,ReentrantLock则采用显式地加锁和释放锁的方式,如下代码: java private final ReentrantLock lock = new ReentrantLock(); public void m() { lock.lock(); try { // ... method b...
2024年05月18日
徐梦旗

当多个线程对同一个变量进行修改时,可能会产生以下线程安全问题: CPU缓存导致的可见性问题。 指令重排序导致的有序性问题。 线程切换导致的原子性问题。 线程不安全的累加器 如下代码,UnsafeCount类是一个累加器: java public class UnsafeCount { private int value = 0; public void in...
2024年05月15日
徐梦旗

相比于JDBC的编程式事务,Spring提供了一种更便捷的处理事务的方式,即声明式事务。我们只需要在方法或类上标注@Transactional注解便可完成事务的声明,如下示例: java @Transactional(rollbackFor = Exception.class) public void pay() { jdbcTemplate.execute("update balanc...
2024年04月10日
徐梦旗

得益于SpringBoot的封装,我们只需要简单的几行代码便可启动一个Spring应用,如下示例: java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplicatio...
2024年03月30日
徐梦旗

为什么需要优化SQL语句? 从开发人员的角度来说,优化SQL语句是为了能够支撑更大的数据量,提供更快性能更好的业务接口。 从用户的角度来说,优化SQL语句是为了给用户提供更好的服务,如更低的响应时间(RT)和更高的每秒事务处理数(TPS)。 如何定位并优化慢的SQL语句? 1. 保持良好的习惯,在每编写完一条SQL语句后都分析下该语句的执行计划,以评估该语句的查询速度,排查潜在的...
2024年03月19日
徐梦旗

数据库调优 为什么需要数据库调优? 数据库调优是为了提高数据库的性能、降低接口的响应时间等。体现在以下几个指标: 响应时间(Response Time,RT) 每秒事务处理量(Transaction Per Second,TPS) 每秒查询处理量(Query Per Second,QPS) 如何进行数据库压力测试? 可以使用JMeter工具进行数据库压力测试。下图是使用主键...
2024年03月08日
徐梦旗

锁 数据库中的锁有什么作用? 锁是一种并发控制手段,避免多个事务同时对同一条记录进行修改,用来解决线程安全问题。 数据库中的锁有哪些分类? 按照锁的功能来划分: 读锁(Read Locks),也叫共享锁[^1](Shared Locks,S锁)。 写锁(Write Locks),也叫排他锁[^1](Exclusive Locks,X锁)。 按照锁的粒度来划分: 全局锁(G...
2024年01月22日
徐梦旗

事务 什么是事务? 事务是指一组操作要么全部成功,要么全部失败。事务具有四大特性[^1](ACID): 原子性(Atomicity):指一组操作是原子的,要么全部成功,要么全部失败。 一致性(Consistency):指事务执行前后,数据需要是一致的状态。 隔离性(Isolation):指一个事务执行时,不能受其他事务影响。 持久性(Durability):指事务提交后,对数...
2024年01月17日
徐梦旗

MySQL逻辑架构 MySQL的逻辑架构由哪些部分组成? MySQL的逻辑架构由服务层和存储引擎层组成。其中服务层有以下几部分: 连接器:管理权限,验证连接。 查询缓存:命中缓存直接返回结果(在MySQL8.0版本移除)。 分析器:词法分析,语法分析。 优化器:生成执行计划,选择合适的索引。 执行器:调用存储引擎接口,返回结果。 其中存储引擎层有InnoDB,MyISAM和...
2024年01月14日
徐梦旗

什么是自动配置? 当我们需要集成某些功能时,只需要依赖Spring Boot或第三方提供的Starter即可,自动配置机制会将相关的配置注册到容器中,开箱即用,降低了开发人员的使用成本。通过@EnableAutoConfiguration注解可以开启自动配置。 以Spring Boot应用集成Redis为例,首先在pom文件中依赖springbootstarterdataredis,然后在...
2023年12月06日
徐梦旗

什么是代码的可读性? 首先我们来看一段代码,并推测其实现了什么业务? java public double getA(double a, double b) { return 3.14 * a * a * 2 + 2 * 3.14 * a * b; } 然后我们再来看一段代码,并推测其实现了什么业务? java public double getSurfaceAreaOfCyli...
2023年11月16日
徐梦旗

得益于Spring框架的封装,我们只需要简单的几行代码便可创建一个HTTP服务,如下代码: java @SpringBootApplication @RestController public class DemoApplication { public static void main(String[] args) { SpringApplication.run(De...
2023年11月11日
徐梦旗

Queue接口详解 Queue接口有哪些实现? plantuml interface Queue<E> interface Deque<E> class LinkedList<E> class ArrayDeque<E> class PriorityQueue<E> Deque u|> Queue LinkedList .u.|> Deque ArrayDeque .u.|> Deq...
2023年10月24日
徐梦旗

Set接口详解 Set接口有哪些实现? plantuml interface Set<E> interface SortedSet<E> interface NavigableSet<E> class HashSet<E> class LinkedHashSet<E> class TreeSet<E> abstract class EnumSet<E extends Enum<E>>...
2023年10月17日
徐梦旗

Map接口详解 Map接口有哪些实现? plantuml interface Map<K,V> interface SortedMap<K,V> interface NavigableMap<K,V> class HashMap<K,V> class LinkedHashMap<K,V> class TreeMap<K,V> class EnumMap<K extends Enum<K...
2023年09月28日
徐梦旗

现象 个人邮箱在2023年9月15日上午2点36分收到腾讯云的一封服务违规提醒邮件,邮件中说个人服务器存在违规情况,违规内容是服务器存在对其他服务器22端口的攻击行为,而本人并未运行相关程序,怀疑是木马植入。邮件内容如下图: <img src="tencentservermail.png" style="width: 70%;"/> 排查过程 通过netstat anop | g...
2023年09月27日
徐梦旗

List详解 List接口有哪些实现? Java平台提供了两种常规用途的List接口的实现,分别是ArrayList和LinkedList。 在一般场景下,ArrayList有着更好的性能。 在特定场景下,LinkedList有着更好的性能。 plantuml interface Iterable<E> interface Collection<E> interface Lis...
2023年09月25日
徐梦旗