自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数组中三个数成绩最大的乘积

【代码】数组中三个数成绩最大的乘积。

2024-01-17 16:37:44 399

原创 反转链表的两种方式-递归、迭代

【代码】反转链表的两种方式-递归、迭代。

2024-01-17 15:56:01 360

原创 两数之和-两种解法

两数之和的两种解法

2024-01-17 09:36:31 374

原创 链表反转-递归

Definition for singly-linked list. 链表反转-递归。//如果传的节点为空或者是最后一个节点,直接返回。

2024-01-16 12:06:56 376

原创 观察者模式

观察者模式学习笔记

2023-03-19 13:12:25 107

原创 设计模式之美-笔记

设计模式之美,笔记

2022-11-27 23:08:19 115

原创 面试问题记录

(1)若是联合索引比如(a,b,c),若wehre条件后面未使用a,则索引失效;(2)不要再索引列上做任何操作(3)存储引擎不能使用索引中范围条件右边的列(4)Mysql在使用(或!=或is null或is not null)时无法使用索引线程安全的集合有Vector、HashTable、Stack、ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue等。Vector相当于 ArrayList 的翻版,是长度可变的数组,Vector的每个方..

2022-06-16 11:08:54 111

原创 雪花算法-原理及实现

总长度是64bit,分为4段第1段:1bit 最高位不用,因为如果是负数的话,最高位是-1,我们需要的id是正数,所以最高位不用;第2段:41bit 时间戳到毫秒级别,按照毫秒级别计算可用69年;第3段:10bit 机器ID,长度到2^10=1024;第4段:12bit 序列号,长度是2^12=4096;这么算下来就1s可以产生1000ms*4096个Id,数据非常之大。最后一步,时间戳左移动22位,机器id左移12位,再与机器数量(2进制)或运算;(1)对应的时间戳左移22位;(2)机器Id左移动12位;

2022-06-10 11:52:57 629

原创 线程池原理——高频面试题

1.为什么使用线程池,优势是什么;2.线程池如何使用;3.线程池的几个重要的参数介绍;4.线程池底层工作原理;5.线程池用过吗?生产上你如何设置合理参数;线程池稀缺资源,它的创建和销毁是比较重且好资源的操作。而java线程依赖于内核线程,创建线程需要进行操作系统状态切换,为避免资源过度消耗需要设法重用线程执行多个任务。线程池就是一个线程缓存,负责对线程进行统一分配、调优与监控。线程池优势:(1)重用存在的线程,减少线程创建,消亡的开销,提高性能;(2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就

2022-06-05 10:06:14 908

原创 TCP协议三次握手,四次挥手(解手)

SYN:同步位 SYN=1表示要进行一个链接请求;ACK: 确认位 ACK=1表示确认有效,ACK=0表示确认无效;ack:确认号 对方发送的序号+1;seq:序号;FIN=1表示断开链接,且客户端会停止向服务端发送数据

2022-06-02 12:55:13 114

原创 Redis-缓存击穿、穿透、雪崩

由于大批量缓存在同一时间失效可能导致大量请求同时穿透缓存直达数据库,可能会造成数据库瞬间压力过大甚至挂掉,对于这种情况我们在批量增加缓存时最好将这一批数据的缓存过期时间设置为一个时间段内的不同时间。示例伪代码:缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储 层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。 造成缓存穿透的基本原因有两个:第一, 自身业务代码或者数据出现问题。第二, 一

2022-06-02 11:08:38 102

原创 误删数据后除了跑路,还能怎么办

背景:只要有数 据操作权限的同学,都有可能踩到误删数据这条线。为了找到解决误删数据的更高效的方法,我们需要先对和MySQL相关的误删数据,做下分类:1. 使用delete语句误删数据行;2. 使用droptable或者truncatetable语句误删数据表;3. 使用dropdatabase语句误删数据库;4. 使用rm命令误删整个MySQL实例。下面分别介绍:1.误删行如果是使用delete语句误删了数据行,可以用Flashback工具通过闪 回把数据恢复回来。Flash

2022-05-26 12:00:52 313

原创 如何判断一个数据库是不是出问题了?

1.select 1判断实际上,select 1成功返回,只能说明这个库的进程还在,并不能说明主库没问题。现在,我们来看一下这个场景。set global innodb_thread_concurrency=3;CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;insert into t values(1,1)...

2022-05-25 12:43:15 1613

原创 MySQL的两个原则,两个优化,一个bug

背景:因为间隙锁在可重复读隔离级别下才有效,所以本篇文章接下来的描述,若没有特殊说明,默认 是可重复读隔离级别。1.加锁规则里面,包含了两个“原则”、两个“优化”和一个“bug”。(1). 原则1:加锁的基本单位是next-keylock。希望你还记得,next-keylock是前开后闭区间。(2).原则2:查找过程中访问到的对象才会加锁。(3)优化1:索引上的等值查询,给唯一索引加锁的时候,next-keylock退化为行锁。(4)优化2:索引上的等值查询,向右遍历时且最后一个值不满足

2022-05-21 11:14:38 435 1

原创 只查一行的语句,执行也很慢,原因分析

为了便于描述,我还是构造一个表,基于这个表来说明今天的问题。这个表有两个字段id和c, 并且我在里面插入了10万行记录。CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;delimiter ;;create procedure idata()begin declare i int; set i=1; while(i&...

2022-05-20 18:39:18 143

原创 “order by”的工作流程及优化

假设表的定义是这样子的CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `city` (`city`)) ENGINE=InnoDB;这时,你的SQL语...

2022-05-20 10:14:54 86

原创 MySQL不同的count用法,哪种性能最高

count几种用法,那种效率最高

2022-05-19 11:38:08 485

原创 为什么表数据删掉一半,表文件大小不变?

1.参数innodb_file_per_table表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数innodb_file_per_table控制的: 这个参数设置为OFF表示的是,表的数据放在系统共享表空间,也就是跟数据字典放在一起; 这个参数设置为ON表示的是,每个InnoDB表数据存储在一个以 .ibd为后缀的文件中。 从MySQL 5.6.6版本开始,它的默认值就是ON了。我建议你不论使用MySQL的哪个版本,都将这个值设置为ON。因为,一个表单独存储为一

2022-05-19 10:32:17 326

原创 MySQL选错索引及处理方案

背景:选择索引是优化器的工作。而优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。在数据库 里面,扫描行数是影响执行代价的因素之一。扫描的行数越少,意味着访问磁盘数据的次数越 少,消耗的CPU资源越少。当然,扫描行数并不是唯一的判断标准,优化器还会结合是否使用临时表、是否排序等因素进行 综合判断。我们这个简单的查询语句并没有涉及到临时表和排序,所以MySQL选错索引肯定是在判断扫描 行数的时候出问题了。那么,问题就是:扫描行数是怎么判断的?MySQL在真正开始执行

2022-05-18 17:07:10 1505 2

原创 死锁和死锁检测

1.两阶段锁在下面的操作序列中,事务B的update语句执行时会是什么现象呢?假设字 段id是表t的主键。这个问题的结论取决于事务A在执行完两条update语句后,持有哪些锁,以及在什么时候释放。 你可以验证一下:实际上事务B的update语句会被阻塞,直到事务A执行commit之后,事务B才 能继续执行。知道了这个答案,你一定知道了事务A持有的两个记录的行锁,都是在commit的时候才释放的。 也就是说,在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等

2022-05-18 10:21:59 741

原创 MySQL—数据库的锁

1.全局锁顾名思义,全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命 令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括 建表、修改表结构等)和更新类事务的提交语句。全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都select出来存成文本。以前有一种做法,是通过FTWRL确保不会有其他线程对数据库做更

2022-05-18 09:44:29 309

原创 MySQL事务隔离级别的实现

MySQL的事务隔离级别,在实现上,数据库里会创建一个视图,访问的时候以视图的逻辑结果为准。在“可重读读”的隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。在“读提交”的隔离级别下,这个视图是在每个SQL开始执行的时候创建的。这里需要注意的是,“读未提交”隔离级别下直接返回记录的最新值,没有视图概念,而“串行化”隔离级别下直接用加锁的方式避免并行访问。我们可以看到在不同的隔离级别下,数据库行为是有所不同的。Oracle数据库的默认隔离级别其 实就是“读提交”,因此对于一些从Ora

2022-05-16 16:26:38 647

原创 垃圾收集器的底层算法实现

三色标记背景:在并发标记过程中,因为并发标记期间应用线程还在继续跑,对相间的引用可能发生变化,多标和漏标的情况就有可能发生。这里我们引入“三色标记”来给大家解释下,把Gcroots可达性分析遍历对象过程中遇到的对象, 按照“是否访问过”这个条件标记成以 下三种颜色:黑色: 表示对象已经被垃圾收集器访问过, 且这个对象的所有引用都已经扫描过。 黑色的对象代表已经扫描过, 它是安全存活的, 如果有其他对象引用指向了黑色对象, 无须重新扫描一遍。 黑色对象不可能直接(不经过 灰色对象) 指向某个白色对象。

2022-05-07 17:02:59 75

原创 垃圾收集器回顾

重点看下CMS垃圾收集器CMS(Concurrent Mark Sweep) 是一款以获取最短停顿时间为目标的垃圾收集器。它非常符合在注重用户体验的应用上使用,他是Hotspot虚拟机第一款真正意义上的并发收集器,第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。从名字上看,它是使用的“标记清除”算法,它的运作过程相对其他垃圾收集器复杂一些,整个过程分为四个步骤:初始标记:暂停所有的其他线程(STW),并记录下gc roots直接能引用的对象,速度很快。并发标记:并发标记阶段就是从..

2022-05-07 16:19:36 256

原创 JVM对象创建与内存分配机制相关

1.对象创建的主要流程1.类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 new指令对应到语言层面上讲是,new关键词、对象克隆、对象序列化等。2.分配内存在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类 加载完成后便可完全确定,为对象分配空间的任务等同于把 一块确定大小的内存从Java堆中划分出.

2022-05-07 12:40:54 150 2

空空如也

空空如也

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

TA关注的人

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