常见的存储引擎有MyISAM、InnoDB、Memory
在MySQL 5.5版本之前,默认的存储引擎是MyISAM
在MySQL 5.5版本之后,默认的存储引擎变为了InnoDB
而Memory是MySQL 3.23版本中引入的使用内存缓存数据,将索引存储在磁盘上的一种引擎。
在日常使用过程中我们主要用到前两种引擎,二者之间有很大差别,主要包括:
InnoDB支持事务,MyISAM不支持事务。
InnoDB最小的锁粒度为行级锁,MyISAM只支持表级锁。
InnoDB数据支持聚簇索引和非聚簇索引存储,MyISAM只支持非聚簇索引。
InnoDB支持外键关联,MyISAM不支持外键。
InnoDB支持MVCC多版本并发控制机制,MyISAM不支持MVCC。
(扩展)借助命令行查看当前使用的存储引擎查看 MySQL 版本信息1SHOW VARIABLES LIKE '%storage_engine%';
查看 MySQL支持的存储引擎(MySQL8.0.34)1SHOW ENGINES;
修改当前数据库的存储引擎将名为 users表的存储引擎从 MyISA ...
AQS与ReentrantLock什么是AQS?简单来说AQS就是起到了一个抽象、封装的作用,将一些排队、入队、加锁、中断等方法提供处出来,便于其他相关的JUC锁使用,具体加锁时机、入队时机等都需要实现类自己控制。
常见的实现类有ReentrantLock、CountDownLatch、Semaphore等等。
AQS的核心机制
状态(State):AQS通过一个volatile类型的整数state来表示同步状态。
子类通过 getState()、setState(int)和 compareAndSetState(int, int)方法来检查和修改该状态状态可以表示多种含义,例如在 ReentrantLock 中,状态表示锁的重入次数;在 Semaphore 中,状态表示可用的许可数。
队列(Queue):AQS维护了一个FIFO的等待队列,用于管理等待获取同步状态的线程。每个节点(Node)代表一个等待的线程,节点之间通过next和prev指针链接。
12345678910static final class Node { static final Nod ...
线程池原理线程池是一种池化技术,用于预先创建并管理一组线程,避免频繁创建和销毁线程的开销,提高性能和响应速度。
它的几个关键参数包括:
核心线程数
最大线程数
空闲存活时间
工作队列
拒绝策略
主要工作原理如下:
默认情况下线程不会预创建,任务提交之后才会创建线程(不过设置 prestartAllCoreThreads 可以预创建核心线程)。
当核心线程满了之后不会新建线程,而是把任务堆积到工作队列中。
如果工作队列放不下了,然后才会新增线程,直至达到最大线程数。
如果工作队列满了,然后也已经达到最大线程数了,这时候来任务会执行拒绝策略
如果线程空闲时间超过空闲存活时间,并且线程线程数是大于核心线程数的则会销毁线程,直到线程数等于核心线程数(设置allowCoreThreadTimeOut为true可以回收核心线程,默认为false)。
创建线程的方式一般来说,创建线程有很多种方式,例如继承Thread类、实现Runnable接口、使用线程池、使用completableFuture类等等。
不过,这些方式并没有真正创建出线程。准确来说,这些都属于是在Jav ...
Synchronized的实现原理synchronized实现原理依赖于JVM的Monitor(监视器锁)和对象头(Object Header)。
当synchronized修饰在方法或代码块上时,会对特定的对象或类加锁,从而确保同一时刻只有一个线程能执行加索的代码块。
synchronized修饰方法:方法的常量池会增加一个ACC_SYNCHRONIZED标志,当某个线程访问这个方法检查是否有ACC_SYNCHRONIZED标志,若有则需要获得监视器锁才可以执行方法,保证方法的同步。
synchronized修饰代码块:会在代码块的前后插入monitorenter和monitorexit字节码指令。可以把monitorenter理解为加锁,monitorexit理解为解锁。
synchronized关键字可以修饰代码块、实例方法和静态方法,本质上都是作用于对象。
对象头(Object Header)在JVM中,每个对象的内存布局主要有两部分组成:
Mark Word:用于存储对象的运行时数据,包括锁状态、哈希码、GC分代信息等。
KIass Pointer:指向对象的类型 ...
乐观锁和悲观锁详解如果将悲观锁(Pessimistic Lock)和乐观锁(PessimisticLock 或 OptimisticLock)对应到现实生活中来。悲观锁有点像是一位比较悲观(也可以说是未雨绸缪)的人,总是会假设最坏的情况,避免出现问题。乐观锁有点像是一位比较乐观的人,总是会假设最好的情况,在要出现问题之前快速解决问题。
什么是悲观锁?悲观锁总假设最坏的情况,认为共享资源被刺被访问的时候就会出现问题(比如共享数据被修改),所以被刺在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞知道锁被上一个持有者释放,也就是说,共享资源每次只给一个线程使用,其他线程阻塞,用完之后再把资源转让给其他线程。
像Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的体现。
12345678910111213public void performSynchronisedTask() { synchronized (this) { // 需要同步的操作 }}private Lock l ...
前言最近一直在用 Sublime Text 3 开发项目,当找到一些解决方案的代码和日志并拷贝到Sublime Text 3时,总会遇到缩进和换行问题,此时复制的代码就显得杂乱无章的。开始选择在线代码格式化工具处理过再复制过来,慢慢用的多了,就想要能够在 Sublime Text 3 中直接可以格式化,以此来提升效率,于是引申出来本篇要介绍的内容。
1. 使用内置的格式化功能Sublime Text 3 自带了一些基本的格式化功能,适用于 HTML、CSS 和 JavaScript 等语言,我们可以通过如下操作来使用这些功能:
打开你想要格式化的文件 或者 选中你要格式化的代码片段;
选择菜单栏中的 Edit -> Line -> Reindent。
下面让我们来格式化一下 JavaScript 代码,如下动图:
2. 安装并使用第三方插件2.1 SublimeJsPrettierSublimeJsPrettier 是一个为 Sublime Text 开发的插件,它集成了 Prettier 的代码格式化功能。
Prettier 是一个流行的代码格式化工具,支持多种编 ...
单选题(10题,共10分)
下列关于从 ORM → MVC → RPC → SOA 的演变,哪项说法是正确的? A. ORM 完全不支持面向对象编程 B. MVC 模式只适用于前端,不适用于后端或接口层 C. RPC(远程过程调用)适合微服务之间的调用和扩展 D. SOA 与微服务完全相同,没有区别 答案:C
以下哪一项是 SOA 框架的主要优势之一? A. 强化单体架构的集中式管理 B. 降低对服务抽象与复用的要求 C. 系统间实现松耦合,易扩展与维护 D. 完全屏蔽了业务层的复杂性 答案:C
在 SOA 架构中,为了实现松耦合,通常会采用的方式是: A. 所有服务都共享同一个数据库表 B. 通过服务注册与发现,让服务调用可动态绑定 C. 不使用任何接口或协议,直接内存调用 D. 在不同服务间尽量少定义契约 答案:B
关于 Restful API 的特点,下列哪项说法最准确? A. Restful API 依赖于 SOAP 协议实现 B. Restful API 强调使用 HTTP 动词来描述操作意图 C. Restful API 中不允许使用 POST 以外的请求方法 D. ...
日志是我们系统出现错误时,最快速有效的定位工具,没有日志给出的错误信息,遇到报错你就会一脸懵逼;而且日志还可以用来记录业务信息,比如记录用户执行的每个操作,不仅可以用于分析改进系统,同时在遇到非法操作时,也能很快找到凶手。
因此,对于程序员来说,日志记录是重要的基本功。
一、日志记录的方法日志框架选型有很多 Java 的日志框架和工具库,可以帮我们用一行代码快速完成日志记录。
在学习日志记录之前,很多同学应该是通过 System.out.println 输出信息来调试程序的,简单方便。
但是,System.out.println 存在很严重的问题!
首先,System.out.println 是一个同步方法,每次调用都会导致 I/O 操作,比较耗时,频繁使用甚至会严重影响应用程序的性能,所以不建议在生产环境使用。此外,它只能输出简单的信息到标准控制台,无法灵活设置日志级别、格式、输出位置等。
所以我们一般会选择专业的 Java 日志框架或工具库,比如经典的 Apache Log4j 和它的升级版 Log4j 2,还有 Spring Boot 默认集成的 Logback 库。不 ...
一、什么是IP黑白名单?一些恶意用户(可能是黑客、爬虫、DDoS 攻击者)可能频繁请求服务器资源,导致资源占用过高。因此我们需要一定的手段实时阻止可疑或恶意的用户,减少攻击风险。
通过 IP 封禁,可以有效拉黑攻击者,防止资源被滥用,保障合法用户的正常访问。
对于我们的需求,不让拉进黑名单的 IP 访问任何接口。
二、使用步骤1.通过Nacos添加配置访问Nacos后台,创建自己的配置
之后选择发布
2.pom.xml引入依赖12345678910 <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>0.2.12</version></dependency> <dependency> <groupId>cn.hutool</groupId&g ...