- 博客(63)
- 收藏
- 关注
原创 Docker安装MySql 8.0
使用上面的命令检查一下本机的docker的运行环境。执行完成之后,会输出docker的版本号。是因为连不上默认的镜像地址。需要将镜像源地址,改成国内。拉取mysql8.0版本对的镜像。我们可以看到mysql 8.0已经启动成功。详细操作参考我的另外一篇文章。拉取镜像之后,执行下面的命令。
2025-03-28 22:44:38
309
原创 Docker 设置国内镜像源
1、一般使用Docker Desktop软件,在 Docker Desktop 的图形界面中完成镜像源的更换操作。具体步骤如下: 打开 Docker Desktop 后,在菜单栏依次点击。此时会弹出一个 JSON 编辑框,可以在此处添加国内镜像地址。找到daemon.json修改成上面的json文件内容。对于 Linux 用户,则需手动编辑。
2025-03-28 22:42:58
333
原创 深入理解ReentrantLock源码
1、可重入是指同一个线程可以多次获取同一把锁。例如,在一个方法中获取了锁,然后在这个方法内部调用了另一个也需要获取该锁的方法,此时线程可以成功获取锁,而不会被阻塞。这就好比一个人有一把自己房间的钥匙,他可以多次进入自己的房间,每次进入相当于线程对锁的一次获取。2、是独占锁,在同一时刻,只有一个线程可以获取该锁。当一个线程获取了锁之后,其他线程如果也想获取这把锁,就会被阻塞,直到锁被释放。这就像是一个只有一个入口的房间,一次只能有一个人进入。3、 它通过一个内部的同步器(
2025-03-26 21:47:19
870
原创 CDN概念和基础知识
CDN (Content Delivery Network) 是一种网络架构。主要是为了提高用户对互联网上内容的访问速度和性能。CDN 是通过在全球各地部署大量的服务器节点。将内容缓存到离用户更近的服务器上,从而减少内容传输的距离,提供访问速度和响应时间、
2025-03-15 21:27:58
403
原创 深入理解Spring事件监听机制
对于开发者来说,使用 Spring 监听机制非常简单。只需要实现事件和监听器接口,并在代码中注册监听器即可。Spring 会自动管理事件和监听器的生命周期,确保它们的正确运行。同时,由于 Spring 监听器使用了异步执行机制,因此不会影响主线程的运行效率,保证了应用程序的高并发和高效性。
2025-02-08 21:41:08
792
原创 LeetCode 128: 最长连续序列
3: 如果第一个元素-1 的值 不在 HahSet 中,则记录当前的值,循环查询当前值+1 的值是否在 HashSet中。如果存在,则连续序列的长度+1。2: 遍历整个HashSet,首先判断当前元素-1 的值是否在 HashSet中,如果不存在,才有可能是一个连续的序列。1: 首先将数组中的所有元素放入到 HashSet 中,去除掉重复元素。通过哈希集合存储整数,以快速判断是否存在相邻数字,从而高效地找出数组中的最长连续序列。,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
2025-02-08 20:48:59
364
原创 Java 中的各种锁
Java 中我们经常听到各种锁,例如悲观锁,乐观锁,自旋锁等等。今天我们将 Java 中的所有锁放到一起比较一下,并分析各自锁的特点,让大家能够快捷的理解相关知识。
2024-12-29 17:45:59
877
原创 ThreadLocal 详解
ThreadLocal是一个将在多线程中为每个线程创建单独的变量副本的类。当使用 ThreadLocal来维护变量时,ThreadLocal 会为每个线程创建单独的变量副本,避免因多线程操作共享变量而导致的数据不一致情况。
2024-12-26 10:05:14
404
原创 线程可见性问题?还是编译优化问题?
我们思考一下,count的值是类成员变量,一个线程修改count值之后,肯定会刷入到内存中的。那也就是说,在不加volatile的前提下,如果我把代码中 Thread.sleep()的方法参数中的时间调大一些,应该能够将count的最新值刷入到内存中,setCount()方法可见。变量count的值被修改了,子线程执行setCount()方法的时候,count的值一直不可见的。我们知道,JVM会对我们的代码进行编译优化,我们来验证一下,是不是编译器优化的问题。执行完成之后,你会发现,问题确实解决了。
2024-09-08 18:46:26
501
原创 深入理解并发之AtomicReference类
通过AtomicReference的源码可知,最终保证原子操作的是unsafe.getAndSetObject(this, valueOffset, newValue)。由于getAndSetObject是native方法,我需要看下JVM中该方法的实现原理。 上篇文章主要分享了基本封装类型的原子类,例如 AtomicInteger,AtomicBoolean,AtomicLong等。那么对象的原子操作如何实现?假设,我们现在要对用户进行银行卡转账操作并保证转账的安全性。
2024-06-04 16:16:44
610
原创 深入理解并发之LongAdder、DoubleAdder的实现原理
答案是否定的。那么 @sun.misc.Contended 注解就是将该变量数据强制刷到不同的缓存行中。通过阅读DoubleAdder的代码之后,你会发现DoubleAdder和LongAdder的代码几乎一样,所以两者的原理都是一样的,这里就不对DoubleAdder 的代码一行行注释了,大家自行阅读。那么我们是不是可以思考一下,将int数据进行打散,分成若干个值,分别计算,最好将值进行汇总。 根据缓存行的长度,变量不足长度的数据,进行强制填充。
2024-06-04 16:15:51
473
原创 深入理解并发原理之原子类
上文说到,CPU层次,OS层次,都已经解决了并发问题。都是采用了原子操作指令。下面我们通过Java语言的Atomic原子类,看下Java语言是如果做到原子操作的。
2024-05-30 08:51:33
553
原创 深入理解并发问题的产生原因和解决方案
这个时候,进入等待队列,也需要进行竞争(多个线程没有获取成功),所有,需要对队列的tail指针进行加锁,加锁成功,进入阻塞队列,加锁失败,进行自旋,一直能够加锁成功,进入队列。之前加锁成功,执行完代码之后,会唤醒阻塞队列中的线程,让阻塞队列中的线程重新进行标志位加锁,循环往复,直到执行完代码,线程销毁。这些并发问题就能完美解决。上面对控制总线加锁的方案,确实能够解决并发问题,但是又引入另外一个问题,性能问题: 控制总线是整个系统的资源,同一时间只能有一个CPU使用该资源,多核CPU就变得无意义了。
2024-05-30 08:50:52
806
原创 为什么是MC(Memcached)而不是Redis?
本文主要分享一下MC和redis作为缓存的一些比较,希望读者能够通过对比,了解二者的区别,能够在适合的场景中使用。以上就是本次分享的所有内容,主要讲述一下Redis和MC的一些对比和相关的实践。如有不足,请多多指正。
2024-02-21 14:24:50
666
原创 响应式编程
响应式编程(Reactive Programming)是一种面向数据流和变化传播的编程范式,其目标是实现高效、可伸缩和响应式的系统。它强调通过触发数据流的变化来实现响应式的系统。在响应式编程中,数据流被视为异步事件序列,通过使用基于事件的操作符来处理和响应这些事件。由事件模型,我们可以想到观察者模式,其实观察者模式也是响应式的一种。有兴趣的读者可以看下响应式宣言响应式宣言: https://www.reactivemanifesto.org/zh-CN。
2024-02-19 11:15:06
572
原创 网络IO模型
本篇博客主要讲解一下网络IO模型。我们常见的网络模型分为 阻塞IO模型,非阻塞IO模型,IO复用模型,信号驱动IO模型,异步IO模型。下面我详细的介绍一下这五个IO模型。前4种IO模型都是同步阻塞IO模型,因为其第二阶段数据报从内核拷贝到用户空间都是同步阻塞的,只是第一阶段等待数据报的处理不同;最后一种IO模型(异步IO模型)才是真正的异步非阻塞IO模型,内核将一切事情都干完。
2024-02-19 10:12:33
983
原创 Redis key命名规范
Redis key命名规范一、实现目标简洁,高效,可维护二、键值设计规约1 Redis key 命名风格**【推荐】**Redis key 命名需具有可读性以及可管理性,不该使用含义不清的 key 以及特别长的 key 名;【强制】以英文字母开头,命名中只能出现小写字母、数字、英文点号 (.) 和英文半角冒号(????;【强制】不要包含特殊字符,如下划线、空格、换行、单双引号以及其他转义字符;2 命名规范【强制】命名规范:业务模块名: 业务逻辑含义: 其他: value 类型1
2024-02-01 20:43:31
1226
原创 EasyExcel实现三级联动
项目中需要在导出的模板中新增三级联动的功能,类似省市区的联动。在网上找了一些方法,都不能直接使用,需要进行修改。本文主要分享一下,改后的代码,可以直接使用。以上就是excel实现三级联动的功能实现。当然如果你觉得这么写非常麻烦,也可以将设置好的excel,上传到指定目录下,通过直接下载excel的形式实现该功能。以上就是本次分享的内容,如有不足请多多指正。
2024-02-01 16:10:30
2243
6
原创 深入理解MySQL之分区表原理和注意事项
最为糟糕的形式是逐行插入。当然,限制分区的数量也是有效的。答案是你每次查询的数据都是某一个批次的时候就可以用分区,比如说字典,业务的字典和用户类型的字典一般都是存放在同一张表里面的,且你每次查询的时候不是差一个业务或者一个用户类型,而是查询整个业务或者用户类型,这就是一个批次,此时也可以用分区来实现;当更新一条记录时,分区层先打开并锁住所有的底层表,mysql先确定需要更新的记录再哪个分区,然后取出数据并更新,再判断更新后的数据应该再哪个分区,最后对底层表进行写入操作,并对源数据所在的底层表进行删除操作。
2024-01-19 11:27:48
1467
2
原创 深入理解MySQL之分区表
当我们单表数据量比较大的时候,单表查询的IO较大。这个时候,我们是不是可以将表的数据分成多个文件,按照某个条件进行单文件的查询,这样避免了大量的IO操作。通过分而治之的思想,减少IO操作,提升查询效率。本文主要是讲述MySQL中分区表,看MySQL是如何实现分区表的。
2024-01-19 11:26:13
1060
原创 敏捷开发之开发流程
敏捷如果用好了,真的可以提高产研效率,拥抱变化、快速迭代,但是敏捷也不是万金油,需要满足天时地利人和,条件有些苛刻老板大力支持:这个是一切的前提,比如我们之前是老板大力推广敏捷,全部门就能搞起来,后来老板方向变了,敏捷就不搞了;项目能支持小步迭代:敏捷比较适合探索类的项目、或者是 APP 之类的迭代快的项目,因为需求非常容易变更、任务好拆分;如果是传统项目,需求一开始就定好了,任务也不好拆,你就还是老实用瀑布模型吧;团队成员闭环。
2024-01-18 20:10:14
2154
1
原创 敏捷开发之团队组成
上篇文章分享了敏捷开发中的Scrum的流程,简单介绍了Scrum的流程和相关概念,其中Scrum的角色有三种分别是 产品负责人,团队负责人,项目执行人员。本文主要对团队中的角色以及其负责的内容,进行详细讲解。
2024-01-17 20:59:30
1244
原创 敏捷开发之Scrum
敏捷开发的实现主要包括 SCRUM、XP(极限编程)、Crystal Methods、FDD(特性驱动开发)等等。同样是敏捷开发,XP 极限编程更侧重于实践,并力求把实践做到极限。敏捷开发并不是简单地追求速度,而是在保证质量的前提下,尽可能地提高开发效率和满足客户需求。,将软件生命周期划分为固定的六个基本活动,并且规定了它们自上而下、相互衔接的次序,如同瀑布流水,逐级下落。以上就是对Scrum流程的简单介绍,后面将会通过团队角色和开发流程进一步讲解敏捷开发。 敏捷开发的核心理念是。
2024-01-17 20:40:10
1455
原创 Docker环境安装
CentOS Docker 安装脚本自动安装1: 命令如下curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun也可以通过国内 daocloud 一键安装命令curl -sSL https://get.daocloud.io/docker | sh手动安装1: 首先删除Centos 系统中旧版本的dockersudo yum remove docker \ docker-cl
2024-01-15 20:21:24
499
原创 TCP怎么保证传输过程的可靠性?
校验和发送方在发送数据之前计算校验和,接收方收到数据后同样计算,如果不一致,那么传输有误确认应答,序列号TCP进行传输时数据都进行了编号,每次接收方返回ACK都有确认序列号。超时重试这里是引用连接管理流量控制阻塞控制...
2024-01-15 20:20:41
455
原创 谈⼀谈你对TCPIP四层模型,OSI七层模型的理解
TCP/IP四层模型 对比 OSI七层模型OSI七层模型为了增强通⽤性和兼容性,计算机⽹络都被设计成层次机构,每⼀层都遵守⼀定的规则。因此有了OSI这样⼀个抽象的⽹络通信参考模型,按照这个标准使计算机⽹络系统可以互相连接物理层通过⽹线、光缆等这种物理⽅式将电脑连接起来。传递的数据是⽐特流,0101010100。数据链路层⾸先,把⽐特流封装成数据帧的格式,对0、1进⾏分组。电脑连接起来之后,数据都经过⽹卡来传输,⽽⽹卡上定义了全世界唯⼀的MAC地址。然后再通过⼴播的形式向局域⽹内所有电脑
2024-01-14 16:20:41
528
原创 说说TCP 3次握⼿和4次握手
三次握手过程client端建⽴连接,发送⼀个SYN同步包,发送之后状态变成SYN_SENTserver端收到SYN之后,同意建⽴连接,返回⼀个ACK响应,同时也会给client发送⼀个SYN包,发送完成之后状态变为SYN_RCVDclient端收到server的ACK之后,状态变为ESTABLISHED,返回ACK给server端。server收到之后状态也变为ESTABLISHED,连接建⽴完成。思考: 为什么要3次?2次,4次不⾏吗? 因为TCP是双⼯传输模式,不区分客户端和服务端,连
2024-01-14 16:19:46
533
5
原创 New一个对象的过程
new一个对象的整体过程过程解析当虚拟机遇见new关键字时候,实现判断当前类是否已经加载过,如果没有加载过,首先执行类的加载机制,加载完成后再为对象分配空间、初始化等。首先校验当前类是否被加载过,如果没有加载,执行类加载机制加载: 从字节码加载成二进制流的过程验证: 当然加载完成之后,需要校验Class文件是否符合虚拟机规范。准备: 为静态变量 常量赋默认值把常量池中符号引用(以符号描述引用的目标)替换为直接引用的过程静态代码块是绝对线程安全的。只能隐式被java虚拟机在类加载过程中
2024-01-14 16:18:30
412
原创 Lombok简介和常用注解
Lombok简介1:作用简化Pojo(不包含业务逻辑,能够控制自己内部n个属性访问的java对象)类的书写(getter, setter ,toString ,equals, hashcode…)2: 各种POJOdto:data transfer object (前台传输过来的参数)do :data object(表字段一一对应)bo : service处理对象vo : view/value object值对象 对应视图对象3: Lombok注解使用构造函数注解@NoArgsConst
2024-01-11 11:34:34
658
原创 Lombok @Data使用的坑
Lombok 是一个很优秀的Java库,简单的几个注解,可以干掉一大片的模版代码。当我们使用的时候,要知其然,也要知其所以然,这样才能避免不必要的坑。
2024-01-11 11:32:49
1274
原创 使用Notepad++将多行数据合并成一行
6、设置好之后,点击“全部替换”,即可将多行数据合并成一行。1、按Ctrl+F,弹出“替换”的窗口;3、“查找目标”内容输入为:\r\n;5、“查找模式”选择为正则表达式;4、“替换为”内容为空;2、选择“替换”菜单;
2024-01-11 10:10:24
3362
原创 Java8新特性之函数式接口
通过使用函数式接口,可以将Lambda表达式作为参数传递给方法,从而简化代码,提高代码的可读性和维护性,当然这种简洁性和可读性是仁者见仁,智者见智的事情。
2024-01-09 16:59:39
1800
原创 深入理解 MyBatis-Plus 批量保存方法
在项目开发中,需要插入批量插入20多万条数据,通过日志观察,发现在调用MyBatis-Plus中的saveBatch()方法性能非常的差,本篇文章主要分享一下saveBatch()的原理以及使用的注意事项1: 想要批量执行操作 数据库链接参数加上rewriteBatchedStatements=true2: 根据doUpdate(ms,parameter). 完成SQL的拼装的原理可以得出,如果批量插入的数据,有些数据字段值为null,不会批量查询,而是单独拼装一个SQL执行。
2024-01-09 14:39:51
9084
2
原创 设计模式-总述
设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。它是开发人员在软件开发过程中面临的一般问题的解决方案。这些方案是众多软件开发人员经过相当长的一段时间总结出来的。是一套被反复使用的,多数人知晓的,经过分类编目,代码设计经验的总结。提高了代码的复用,让代码容易被他人理解,保证代码可靠性。
2024-01-06 11:13:03
1241
1
原创 设计模式之过滤器模式
目的:使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来;实现:制定不同的规则来对一组对象进行过滤,然后对过滤结果进行分组。
2024-01-06 11:06:35
534
原创 接口性能优化思路
在开发中,项目中经常会出现一些接口响应比较慢的情况,借此,本文主要分享一些接口优化的思路接口效率问题,在开发过程中,除了业务实现,是我们需要关注的地方。站在接口设计者的角度去开发需求,会避免很多这样的问题,提高开发效率。
2024-01-05 10:53:20
1022
原创 Spring和Spring Boot的区别
最后,Spring Boot是基于Spring框架的,因此它的底层实现和Spring是一样的。总之,Spring和Spring Boot都是非常优秀的Java开发框架,它们各自有着不同的特点和优势。如果你需要更多的灵活性和控制权,那么Spring可能更适合你。首先,Spring是一个轻量级的控制反转(IoC)和面向切面编程(AOP)框架,它提供了丰富的功能和灵活的配置选项。而Spring Boot则是一个基于Spring框架的快速应用程序开发框架,它的目标是让开发者能够更加便捷、高效地构建应用程序。
2024-01-04 22:21:40
748
原创 设计模式之桥接模式
定义: 将抽象部分与它的实现部分分离,使他们都可以独立地变化。看下UML结构图:其中Abstraction为抽象化角色,定义出该角色的行为,同时保存一个对实例化角色的引用。implementor 是实例化角色,它是接口或者抽象类,定义角色必须的行为和属性。RefinedAbstraction 为修正抽象化角色,引用实例化角色对抽象化角色进行修改。ConcreteImplementor,为具体实现化角色,实现接口或抽象类定义的方法或者属性。这段是不是听着很懵,哈哈哈,没错,我也看着很懵。下面我们举个栗子。
2024-01-04 22:09:45
601
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人