- 博客(96)
- 收藏
- 关注
原创 linux安装node版本管理工具NVM
以下路径/usr/local/nvm/nvm-0.39.3为nvm安装路径,编辑vim ~/.bashrc。nvm 的卸载也比较简单,直接删除相关文件和配置项即可。配置环境变量:在文件末尾加上以下配置。
2025-03-12 14:39:15
168
原创 OpenResty开发环境搭建
OpenResty® 是一个基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。官方地址:http://openresty.org/cn/具备Nginx的完整功能基于Lua语言进行扩展,集成了大量精良的 Lua 库、第三方模块允许使用Lua自定义业务逻辑、自定义库。
2024-12-24 10:10:10
443
原创 Consul安装和使用:服务注册与发现
Consul是一个开源的分布式服务发现和配置管理工具。它提供了一个分布式的、高可用的数据存储,可以用来存储键值对、配置数据、服务发现信息等。同时,Consul还提供了HTTP和DNS接口,可以用来查询服务、配置和健康状态等信息。service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。health checking:健康检测使consul可以快速的告警在集群中的操作。
2024-12-22 22:05:09
415
原创 JUC中的LockSupport工具类的使用下篇
LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程。主要是通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作的。每个线程都有一个许可(permit),permit只有两个值1和0,默认是0。当调用unpark(thread)方法,就会将thread线程的许可permit设置成1(注意多次调用unpark方法,不会累加,permit值还是1)。当调用park()方法,如果当前线程的permit是1,那么将permit设置为0,并立即返回。
2024-12-09 22:24:20
478
原创 JUC中的LockSupport工具类的使用上篇
输出了上面2行之后,程序一直无法结束,t1线程调用wait()方法之后无法被唤醒了,从输出中可见, notify()方法在 wait()方法之前执行了,等待的线程无法被唤醒了。说明:唤醒方法在等待方法之前执行,线程无法被唤醒。t1线程中调用 lock.wait()方法让t1线程等待,主线程中休眠5秒之后,调用 lock.notify()方法唤醒了t1线程,输出的结果中,两行结果相差5秒左右,程序正常退出。唤醒方法需要在等待方法之后调用,线程才能够被唤醒。
2024-12-09 22:23:34
453
原创 JUC中的Semaphore(信号量)
Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能允许一个线程访问一个资源,而信号量可以控制有多少个线程可以访问特定的资源。
2024-12-05 08:28:26
1126
原创 JUC中的循环栅栏CyclicBarrier的6种使用场景
主管相当于 CountDownLatch,干活的小弟相当于做事情的线程。老板交给主管了一个任务,让主管搞完之后立即上报给老板。主管下面有10个小弟,接到任务之后将任务划分为10个小任务分给每个小弟去干,主管一直处于等待状态(主管会调用await()方法,此方法会阻塞当前线程),让每个小弟干完之后通知一下主管(调用countDown()方法通知主管,此方法会立即返回),主管等到所有的小弟都做完了,会被唤醒,从await()方法上苏醒,然后将结果反馈给老板。期间主管会等待,会等待所有小弟将结果汇报给自己。
2024-12-04 08:27:09
907
原创 JUC中等待多线程完成的工具类CountDownLatch,必备技能
CountDownLatch称之为闭锁,它可以使一个或一批线程在闭锁上等待,等到其他线程执行完相应操作后,闭锁打开,这些等待的线程才可以继续执行。确切的说,闭锁在内部维护了一个倒计数器。通过该计数器的值来决定闭锁的状态,从而决定是否允许等待的线程继续执行。常用方法:public CountDownLatch(int count):构造方法,count表示计数器的值,不能小于0,否者会报异常。
2024-12-03 10:00:34
908
原创 同步和异步、并发和并行、阻塞和非阻塞的区别
实际上,如果系统内只有一个CPU,而使用多进程或者多线程任务,那么真实环境中这些任务不可能是真实并行的,毕竟一个CPU一次只能执行一条指令,在这种情况下多进程或者多线程就是并发的,而不是并行的(操作系统会不停地切换多任务)。这天你热的是在不行了,就催着商家赶紧给你送货,于是你就在商店里面候着他们,直到商家把你和空调一起送回家,一次愉快的购物就结束了。从严格意义上来说,并行的多任务是真的同时执行,而对于并发来说,这个过程只是交替的,一会执行任务A,一会执行任务B,系统会不停地在两者之间切换。
2024-12-03 09:59:27
303
原创 spring事务源码解析-前篇
事务启动的过程中需要定义事务的一些配置信息,如:事务传播行为、隔离级别、超时时间、是否是只读事务、事务名称,spring中使用TransactionDefinition接口表示事务定义信息,下面看一下TransactionDefinition接口源码,主要有5个信息事务传播行为事务隔离级别事务超时时间是否是只读事务事务名称//传播行为:REQUIRED//传播行为:SUPPORTS//传播行为:MANDATORY//传播行为:REQUIRES_NEW。
2024-11-26 08:24:02
599
原创 Spring中的@Import-注解探讨----批量注册bean
现在我们来引出关于@Import的问题,带着问题去讨论,效果更好首先我们讨论一下为什么要用@Import我们都知道,spring批量注册组件两种方式。
2024-11-19 10:48:46
860
原创 spring-@Configuration原理解析
环境版本:java8,spring5.2.x,maven3.6@Configuration注册类的全过程,话不多说,上代码,我这里是从关键的方法人手了说明:doRegisterBean方法很复杂,我们的主题是@Configuration,所以省略一些不重要的代码。将获取到的 scope 赋值给 BeanDefinition(这步完成后刚刚创建的 AnnotatedGenericBeanDefinition 对象的 scope 属性为 scope 值)。
2024-11-19 10:47:01
1117
1
原创 SpringBoot整合Liquibase对数据库管理和迁移
Liquibase是一个用于用于跟踪、管理和应用数据库变化的开源工具,通过日志文件(changelog)的形式记录数据库的变更(changeset),然后执行日志文件中的修改,将数据库更新或回滚(rollback)到一致的状态。它的目标是提供一种数据库类型无关的解决方案,通过执行schema类型的文件来达到迁移。本文主要介绍SpringBoot与Liquibase的集成。
2024-11-07 15:32:29
1117
原创 Mybatis一级缓存,二级缓存探讨上篇
从输出中可以看出2次查询都访问了db,并且两次查询的结果是不一样的,两个集合也不相等,插入数据让缓存失效是可以理解的,插入操作可能会改变数据库中的数据,所以如果再从缓存中去获取,可能获取到的数据和db中的数据不一致的情况,mybatis为了避免这种情况,在执行插入操作的时候,会将SqlSession中的一级缓存清空。同一个SqlSession中查询同样的数据,mybatis默认会从一级缓存中获取,如果缓存中没有,才会访问db,那么我们如何去情况一级缓存呢,强制让查询去访问db呢?
2024-11-07 11:43:48
715
原创 Mybatis延迟加载、鉴别器、继承
4张表:t_user(用户表)t_goods(商品表)t_order(订单表)t_order_detail(订单明细表)表之间的关系:t_order和t_user是一对一的关系,一条订单关联一个用户记录t_order和t_order_detail是一对多关系,每个订单中可能包含多个子订单,每个子订单对应一个商品。
2024-11-07 11:41:25
975
原创 Mybatis入门篇,带你感受一下mybatis独特的魅力!
准备数据库mysql中运行下面脚本:我们的需求:对t_user表,我们有以下这些需求:实现一个通用的插入操作:支持动态插入,可以根据传入的字段的值,动态生成所需要的各种insert语句批量插入功能实现一个通用的更新操作:支持动态更新操作,可以根据传入的字段,动态生成所需要的各种update语句实现一个通用的查询操作:支持各种组合条件查询、支撑排序、分页、支持返回列的控制等各种复杂的查询需求引入mybatis依赖:子项目为:创建mybatis相关文件user.xmlchat01/src/mai
2024-11-05 14:20:42
403
原创 Mybatis类型处理器,这个你得会玩!
id int AUTO_INCREMENT PRIMARY KEY COMMENT '用户id',name VARCHAR(32) NOT NULL DEFAULT '' COMMENT '用户名',age SMALLINT NOT NULL DEFAULT 1 COMMENT '年龄',sex SMALLINT DEFAULT 0 COMMENT '性别,0:未知,1:男,2:女') COMMENT '用户表';
2024-11-05 14:19:25
582
原创 JVM调优(jdk8)与垃圾回收器详解
负载屏障的目标是在指针加载时插入一个处理逻辑。在压缩阶段,如果指针指向将要被移动的对象的区域,指针指向的对象将被移动,然后纠正指针。如果你要创建一个大于这个大小的对象,比如一个超大的数组,或者是别的啥东西,此时就直接把这个大对象放到老年代里去,压根不会经过年轻代,有一个JVM参数,就是“-XX:PretenureSizeThreshold”,可以把它的值设置为字节数,比如“1048576”字节,就是1MB。在这个阶段,ZGC会遍历堆中的所有活动对象,并将它们移动到新的位置,以便将未使用的内存空间紧凑起来。
2024-11-05 14:16:25
914
原创 JVM出现OOM错误排查
对应线程出现的OOM错误,其实分好几类:堆内存溢出、栈溢出、方法区溢出,下面我们要区分两个概念内存泄漏是指GC垃圾回收的速度跟不上内存消耗的速度,造成OOM的情况内存溢出是指程序员在申请内存时,没有足够的内存空间供其用,OutOfMemoryError。
2024-10-31 08:54:53
552
1
原创 Forest入门和使用
ForestForest是一个开源的Java HTTP客户端框架,它能够将 HTTP 的所有请求信息(包括URL、Header以及Body等信息)绑定到您自定义的Interface方法上,能够通过调用本地接口方法的方式发送HTTP请求,类似于的openFeign框架。创建一个interface,比如命名为MyClient,并创建一个接口方法名为,用@Get注解修饰之。
2024-10-31 08:53:09
628
原创 java设计模式之监听者模式
继承了 AbstractEvent 类/*** @description: 用户注册事件*/@Getter发送优惠券/*** @description: 注册成功后发优惠券*/@OverrideSystem.out.println(event.getUsername() + "注册成功,赠送优惠券。。。。。");发短信/*** @description: 注册成功后发短信*/@Override。
2024-10-30 16:36:42
974
原创 Java内存模型和Java内存区域的区别和联系
Java作为—种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构Java内存模型和Java对象模型这三者的概念及其间的区别。甚至我见过有些面试官自己也搞的不是太清楚。不信的话,你去网上搜索Java内存模型,还会有很多文章的内容其实介绍的是JVM内存结构。
2024-10-30 16:18:28
905
原创 三方接口调用设计方案
API密钥生成:为每个三方应用生成唯一的API密钥对(AK/SK),其中AK用于标识应用SK用于进行签名和加密。AK:Access Key Id,用于标示用户。SK:Secret Access Key,是用户用于加密认证字符串和用来验证认证字符串的密钥,其中SK必须保密。通过使用Access Key Id / Secret Access Key加密的方法来验证某个请求的发送者身份。接口鉴权:在进行接口调用时,客户端需要使用AK和请求参数生成签名,并将其放入请求头或参数中以进行身份验证。
2024-10-28 08:45:24
1213
原创 AQS-源码解析实现原理
AQS( AbstractQueuedSynchronizer )是一个用来构建锁和同步器(所谓同步,是指线程之间的通信、协作)的框架,Lock 包中的各种锁(如常见的 ReentrantLock, ReadWriteLock), concurrent 包中的各种同步器(如 CountDownLatch, Semaphore, CyclicBarrier)都是基于 AQS 来构建,所以理解 AQS 的实现原理至关重要,AQS 也是面试中区分侯选人的常见考点,我们务必要掌握,本文将用循序渐近地介绍 AQS,相
2024-10-28 08:35:32
704
原创 MySql如何实现分布式锁
本篇我们使用mysql实现一个分布式锁。环境:mysql8,navicat,maven,springboot2.3.11,mybatis-plus。
2024-10-26 21:07:40
743
1
原创 数据库设计的六大范式
最近在看数据库设计伦理,顺便里来理清一下数据库设计的六大范式。首先我们来了解几个概念。例如,对于表3中的数据,找不到任何一条记录,它们的学号相同而对应的姓名不同。所以我们可以说姓名函数依赖于学号,写作 学号 → 姓名。但是反过来,因为可能出现同名的学生,所以有可能不同的两条学生记录,它们在姓名上的值相同,但对应的学号不同,所以我们不能说学号函数依赖于姓名。例如 学号 F→ 姓名,(学号,课名) F→ 分数例如 (学号,课名) P→ 姓名。
2024-10-26 21:05:17
683
原创 事务的原理、MVCC的原理
所谓的MVCC指的就是在使用READ COMMITED 和 REPEATABLE READ这两种隔离级别的事务在执行select操作时,访问记录版本链的过程,这样可以使不同事务的读-写操作并发执行,从而提升系统性能。事务完全的串行会严重的降低系统的吞吐量和资源利用率,仔细发现,引发事务一致性问题的根本原因在于多个事务访问了相同的数据,更合理的做法是,在某个事务访问某个数据时,对其他想要访问该数据的事务进行限制,当该事务提交后,其他事务才能继续访问这个数据。**两者的根本区别在于幻读关注的是。
2024-10-26 21:03:07
1353
原创 MySql用户相关操作,管理员的必备技能
通过命令的方式操作用户和权限不需要刷新,下次登录自动生效通过操作mysql库中表的方式修改、用户信息,需要调用flush privileges;刷新一下,下次登录自动生效mysql识别用户身份的方式是:用户名+主机本文中讲到的一些指令中带主机的,主机都可以省略,默认值为%,表示所有机器mysql中用户和权限的信息在库名为mysql的库中。
2024-10-24 10:49:17
1006
原创 MySQL索引原理及分析
联合索引页也是二级索引,他和普通索引类似,唯一的区别是目录页和数据页存储的key是联合索引的key,假设是为a,b两个字段做联合索引,则在构建索引的时候,会先按照a排序,如果a有相同的就按照b排序,这就是最左匹配原则的道理,因为b的排序是乱的,所以使用b不会走索引。目录页面的记录类型有个不一样,他的索引项的记录类型是1,而且索引项的内部结构是指向一个页面的指针,页面可以是数据页面,也可以是其他页面。为了避免索引失效,需要仔细设计数据库表结构,合理创建索引,并确保查询语句能够充分利用索引。
2024-10-24 10:47:01
967
原创 mysql培训笔记
内核参数调优 sysctl -a 打印系统参数,使用sysctl -w 设置值,也可以直接写入sysctl.conf文件,不过生效sysctl -p。innodb 修复 innodb_force_recovery=0。mysql自带估计分析慢查询日志,mysqldumpslow。分表:单表数据量过大,查询瓶颈。硬件层,系统层,软件层,应用层,架构层。在内存足够情况下,减少swap分区使用。分区: 数据放在不同的磁盘上,磁盘瓶颈。监控可视化zabbix。2,分库,分表,分区。
2024-10-22 10:41:13
988
原创 windows安装mysql8
3,mysqld --initialize-insecure 无密码 或者mysqld --initialize-insecure --user=mysql。7,修改密码 alter user ‘root’@‘localhost’ identified by ‘123456’1.2,解压后,在目录里面可以没有my.ini,这个时候我们需要自己建一个,文件内容如下,可以根据需要更改。1,解压包,一般需要下载最新版本,选择版本我们之间下载就好。5,无密码等 mysql -u root -p。
2024-10-22 10:40:31
153
原创 Nginx 实现动态封禁IP
配置简单轻量,对服务器性能影响小。多台服务器可以通过共享 Redis 实例共享黑名单。动态配置,可以手工或者通过某种自动化的方式设置 Redis 中的黑名单。
2024-10-21 15:19:58
730
原创 HTTPS证书生成、验签-、证书链
证书的,然后 “GlobalSign Root CA” 证书信任 “GlobalSign Organization Validation CA - SHA256 - G2” 证书,而 “GlobalSign Organization Validation CA - SHA256 - G2” 证书又信任。如果你的电脑中毒了,被恶意导入了中间人的根证书,那么在验证中间人的证书的时候,由于你操作系统信任了中间人的根证书,那么等同于中间人的证书是合法的。,后面我们可以用这个根证书去颁发服务器证书和客户端证书。
2024-10-21 14:51:39
1373
原创 HTTPS深入浅出原理解析
HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。HTTPS主要作用是:(1)对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全;(2)对网站服务器进行真实身份认证。我们经常会在Web的登录页面和购物结算界面等使用HTTPS通信。使用HTTPS通信时,不再用http://,而是改用https://。另外,当浏览器访问HTTPS通信有效的Web网站时,浏览器的地址栏内会出现一个带锁的标记。
2024-10-21 14:51:07
649
原创 TCP三次握手,四次挥手
TCP(Transmission Control Protocol) 传输控制协议,是一种 面向连接的、可靠的、基于字节流的传输层 通信协议。TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),将端口号拼接到IP地址即构成了套接字,例如 192.1.1.6:50030。
2024-10-21 14:50:07
747
原创 Kafka之原理解析
Kafka是一个分布式流媒体平台,kafkaKafka是一种高吞吐量、分布式、基于发布/订阅的消息系统,最初由LinkedIn公司开发,使用Scala语言编写,目前是Apache的开源项目。发布和订阅记录流,类似于消息队列或企业消息传递系统。以容错的持久方式存储记录流。记录发生时处理流。Kafka构建可在系统或应用程序之间可靠获取数据的实时流数据管道构建转换或响应数据流的实时流应用程序Topic 是生产者发送消息的目标地址,是消费者的监听目标一个服务可以监听、发送多个 Topics。
2024-10-21 14:48:07
1544
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人