自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何使用注解实现接口的幂等性校验

在数学领域中对于幂等性的解释是即幂等元素x在函数f的多次作用下,其效果和在f的一次作用下相同。在编程上可以理解为,如果某个函数(方法)或接口被调用多次其行为结果和被调用一次相同,则这种函数或接口就具有幂等性。简单举个例子,天然幂等性假设对象Person中有个name属性,有个的方法,那这个方法就是天然幂等的哦,你输入相同的“小明”参数,不论你重复调用多少次都是将名字设置为“小明”,其对对象Person的影响都是一样的。这就是天然幂等性。非幂等性。

2023-12-02 22:18:05 660 2

原创 Redis为什么要使用SDS作为基本数据结构

​ 与C字符串不同,SDS的空间分配策略完全杜绝了发生缓冲区溢出的可能性,当SDS需要对SDS进行修改的话,API会先检查SDS空间是否满足修改所需的要求,如果不满足的话,API会自动将SDS的空间扩充至所需大小,然后才执行实际的修改操作,所以使用SDS既不需要动手修改SDS的空间大小,也不会出现前面所说的缓冲区溢出问题。​ 字符数量加一,数组里面可以包含未使用的字节,而这些字节的数量就由SDS的free属性记录,通过未使用空间,SDS实现了空间预分配和惰性 空间释放两种优化策略。

2023-11-10 17:30:46 340

原创 一文解密网络背后的秘密

我们需要先知道一些基础的概念,例如SYN: 请求建立连接ACK: 对请求做出响应SYN_SEND: 等待匹配连接的请求ESTABLISHED:代表一个打开的连接三次握手需要保证客户端和服务端都要保证一发、一收信息,过程如下:一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认;

2023-10-22 17:41:25 220

原创 【Es基础入门必看】

做了缓存之后虽然我们的QPS可以达到8万左右,但是对于一个大型的商业项目这也是远远不够的,所以ElasticSearch诞生了,亿级的QPS加上简单易扩展,可以独立部署,简直就是一个完美的搜索引擎。倒排索引也叫做反向索引,我们通常理解的索引可能就是通过key寻找value的键值对,倒排做因简单来说,就是通过value来寻找key,所以才叫做倒排索引。区别于关系型数据库的是,ES是一个非结构化的数据库,每个文档可以有不同的字段,并且有一个唯一标识。这个概念就不用太关注了。,带有倒排索引的文件被称为倒排文件。

2023-10-09 22:14:17 210

原创 一文搞清楚Java中常见的IO模型

首先,我们要清楚什么是IO,根据冯诺依曼结构,计算机结构分为5部分:运算器、控制器、存储器、输入设备和输出设备。输入设备和输出设备都属于外设,网卡、硬盘这种既可以属于输入设备也可以属于输出设备。输入设备向计算机输入数据,输出设备接收计算机输出的数据。从数据结构的时间来看的话,IO描述了计算机系统与外部设备之间通信的过程。为了保证操作系的稳定性和安全性,一个进程的地址划分为用户空间和内核空间。

2023-10-06 16:25:02 119 2

原创 Java基础知识回顾

浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.序列化是一种将对象转换为字节流的过程,以便可以将对象保存到磁盘上,将其传输到网络上,或者将其存储在内存中,以后再进行反序列化,将字节流重新转换为对象。序列化在 Java 中是通过接口来实现的,该接口没有任何方法,只是一个标记接口,用于标识类可以被序列化。当你序列化对象时,你把它包装成一个特殊文件,可以保存、传输或存储。

2023-09-29 21:47:31 215

原创 搞明白 行锁、表锁、意向锁、间隙锁、next-key锁。。。

最近在复习Mysql的时候发现对于锁这方面的知识掌握的真是一言难尽,起因是在看到Innodb如何解决幻读的问题。

2023-09-15 20:48:17 103

原创 Mysql事务篇——Day02

假设A和B两个事务同时在处理,事务A开始先从数据库读取小c余额,然后继续执行代码处理逻辑,在这个过程中如果事务B更新了这条数据,并且提交了事务,那么事务A再次读取该数据的时候,就会发现亲后两次读取到的数据是不一致的,这种现象就叫做不可重复读。假设A和B两个事务同时在处理,事务A先从数据库中读取小林的余额数据,然会再执行更新操作,如果这时候A还没有提交事务,而此时正好B也从数据库中读取小c的余额数据,那么事务B读取到的余额数据就是事务A更新后的数据,即使没有提交事务。

2023-08-16 22:04:38 96

原创 Mysql索引篇——Day01

当我们在阅读书中的某个内容时,你会选择一页一页去翻还是直接去看目录呢?答案肯定是去看目录啊,书中的目录充当的就是数据库索引的角色,形象的说索引就是帮助存储引擎快速获取数据的一种数据结构。那么什么时存储引擎呢?说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据的实现方法。Mysql的存储引擎有MyISAM、InnoDB、Memory,其中 InnoDB 是在 MySQL 5.5 之后成为默认的存储引擎。

2023-08-11 21:22:20 271

原创 聊聊spring-cloud的负载均衡

在微服务架构中,负载均衡是非常重要的一个环节,可以有效地提高系统的可用性和稳定性。在使用Spring Cloud提供的负载均衡组件时,需要注意减少负载均衡对系统性能的影响。具体来说,可以选择合适的负载均衡算法、合理设置超时时间、缓存服务实例列表、使用断路器和使用缓存等。

2023-07-22 22:07:39 999 1

原创 RBAC详解

RPAC模型是一种基于角色的访问控制模型,它将用户分配到不同的角色中,每个角色都有一组权限。用户通过被分配到的角色来获得访问系统资源的权限。在本文中,我们详细讨论了RPAC模型的工作原理,并使用一个数据库示例来说明如何实现RPAC模型。我们还提供了相关的代码示例,帮助读者更好地理解RPAC模型的实现。

2023-07-19 09:10:25 2492 2

原创 分析eureka与nacos的区别

当我们启动服务提供者和Nacos服务注册中心后,可以在Nacos服务注册中心中看到服务提供者的注册信息。当我们启动服务提供者和Eureka服务注册中心后,可以在Eureka服务注册中心中看到服务提供者的注册信息。同时,当服务消费者需要调用服务提供者时,可以通过Eureka服务注册中心进行服务发现和负载均衡。Nacos通过使用Raft算法来实现服务注册和发现,并使用DNS和HTTP等多种方式来实现服务的发现。Nacos提供了健康检查的功能,可以定时检测服务的健康状态,并且可以配置自定义的健康检查规则。

2023-07-17 15:47:24 564 3

原创 深入理解 Spring 框架

Spring 是一个优秀的企业级开发框架,它提供了丰富的功能和工具,帮助开发者构建可靠、灵活和高效的应用程序。在学习和使用 Spring 的过程中,我们需要深入理解其核心概念和特性,以便更好地应用于实际项目中。

2023-07-12 11:22:08 729 4

原创 一个普通的线程池

线程池由一组线程组成的线程集合,它可以维护和管理这些线程的生命周期,并提供一种机制来控制线程的创建、执行和销毁。:线程池可以通过任务队列来存放待执行的任务,当线程池中的线程都在执行任务时,新的任务可以暂时排队等待执行,避免任务丢失或被拒绝。:线程池可以避免频繁地创建和销毁线程,而是通过复用已有的线程来执行任务。:线程池可以将待执行的任务按照一定的调度策略分配给空闲的线程执行。根据线程池的配置参数,决定是否创建新的线程,将任务分配给空闲线程执行,或将任务放入任务队列等待执行。线程池提供了一些策略来处理。

2023-06-10 16:21:34 731 2

原创 入门Spring Cloud

通过以上步骤,你已经成功入门了Spring Cloud,并创建了一个简单的微服务应用程序。从服务注册到服务调用,Spring Cloud提供了丰富的功能和工具,帮助开发者构建弹性可扩展的分布式系统。本文将介绍如何入门Spring Cloud,并提供了详细的代码示例和解释,帮助读者快速上手Spring Cloud微服务框架。在微服务架构中,服务注册中心用于管理所有服务的注册和发现。最后,我们创建一个服务消费者,从注册中心获取服务提供者的信息并调用其提供的服务。解压下载的压缩包,并使用IDE打开项目。

2023-06-03 16:00:38 520

原创 布隆过滤器

我们可以把布隆过滤器看作有二进制向量或者说位数组和一系列随即映射函数零部分组成的数据结构。相比于我们平时用到的List、Map、Set等数据结构,它占用的空间更少并且效率更高,但其缺点是返回结果是概率性的,而不是非常准确。理论上添加到集合中的元素越多,误报的可能性也就越大。并且存放在布隆过滤器中的数据不易删除。

2023-05-27 11:21:49 771

原创 Spring IOC

Bean就是IOC所有管理的内容,也是我们new出来的“对象”,作为一个面向对象的语言,在程序中我们不得不创建出大量的对象,这就造成了对象与对象之间严重依赖,一旦某一个对象出现异常,就可能导致程序不能正常运行,也不方面我们添加新的功能。但是在Bean交给容器管理后,一切开始变得十分方便。//或者我们可以直接通过注解,去获取Bean对象 //@Autowired //@Resource。

2023-05-19 21:27:18 536 1

原创 聊聊Java中的代理机制

代理在Java中有着广泛的应用,无论是spring的AOP还是注解对象的获取,又或者是事务处理,都少不了代理的存在。

2023-05-11 16:56:40 738 4

原创 Redis基础

Hash类型,也叫做散列,其中value是一个无需的字典,类似于Java中HashMap结构,String结构是将对象序列化为Json字符串后进行储存,当我们要修改对象的某个属性值的时候很不方便,Hash就可以解决这个问题。Redis是以键值对存储信息的,所以对象又分为键对象和值对象,即存储一个key-value对象的时候会创建两个对象,键对象是一个字符串类型,而值对象可以是五大对象中的任意一个。Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。

2023-05-06 08:21:28 409

原创 MYSQL进阶03

所有的MySQL列类型都可以被索引,对相关列使用索引是提高select操作性能的最佳途径。根据存储引擎可以定义每个表的最大索引和最大索引长度,没中存储引擎对每个表至少支持16个索引,总索引长度至少为256字节,大多数存储引擎有着而更高的限制。MyISAM和InnoDB存储引擎默认创建的都是BTREE索引。

2023-05-02 11:31:22 993

原创 MYSQL进阶02

而text只能保存字符数据。当定义一个varchar类型的列时,也需要指定该列所能存储的字符数,例如varchar(10)代表该列可以存储最多10个字符。与char不同,当存储的数据长度小于指定长度时,它不会自动补齐空格,而是只占用实际存储数据所需的存储空间。当定义一个char类型的列时,需要指定该列所能存储的字符数,例如char(10)代表该列可以存储10个字符。当一个字段被定义为浮点类型后,如果插入的精度超过该列定义的实际精度,则插入的值会被四舍五入到实际定义的精度,然后插入,四舍五入的过程不会报错。

2023-04-30 09:57:46 869

原创 MYSQL进阶01

在聚簇索引中,数据行的物理存储顺序和索引顺序是一致的,这意味着相邻的数据行存储在相邻的磁盘块中,可以提高数据的访问速度。自动增长的必须是索引,如果是组合索引也必须是组合索引的第一列,但是对于MyISAM,自动增长列可以是组合索引的其他列,这样插入数据后,自动增长列是按照组合索引的前面几列进行排序后递增的。这个指定的列通常是另一个表的主键列。聚簇索引:InnoDB 存储引擎使用聚簇索引来组织数据,每张表都有一个主键,主键索引是一个聚簇索引,它将数据按照主键的值来组织,这样可以提高数据的访问速度。

2023-04-29 20:46:49 1090

原创 CAS详解

CAS(Compare and Swap)是一种常用的并发编程技术,用于实现线程安全的数据操作。它通过原子性地比较内存中的值和期望值,如果相等则将新值写入内存,否则什么也不做。本文将介绍CAS的基本原理、应用场景和实现方法。

2023-04-21 08:23:01 833

原创 关于maxwell

前面提到MaxWell是一个mysql二进制binlog日志分析工具,既然它可以分析mysql日志,那么他的应用场景是不是就很广泛,除了上面提到的实时更新Elasticsearch,我们还可以维护缓存、收集表级别的dml指标、数据分区迁移、切库binlog回滚方案等。那么除了Maxwell我们还有其他选择吗?答案是肯定的。

2023-04-15 22:09:03 614

原创 Java内存模型

顺序一致性模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会一顺序一致性内存模型为参照。在设计时,JMM和处理器内存模型会对顺序一致性模型做一些放松,因为如果完全按照顺序一致性内存模型来实现处理器和JMM,那么很多的处理器和编译器优化都要被禁止,这对执行性能将会有很大影响。根据对不同类型的读/写操作组合的执行顺序的放松,可以把常见的处理器内存模型划分为如下几种类型。放松程序中写-读的顺序,由此产生了Total Store Ordering 内存模型(简称TSO)

2023-04-09 15:26:12 65

原创 synchronized的实现原理以及如何进化

当一个线程访问同步块并且获取锁的时候,会在对象头和栈帧中的锁记录里存储锁偏向的线程id,以后该线程在进入和退出同步块时就不需要进行CAS操作来加锁和解锁,只需要简单的测试一下对象头里面的Mark Word是否存储着指向当先线程的偏向锁。如果线程仍然活着,拥有偏向锁的栈会被执行,遍历偏向对象的锁记录,栈中的锁记录和对象头的Mark Word要么中心偏向于其他线程,要么恢复到无锁或者标记对象不适合作为偏向锁,最后唤醒暂停的线程。锁可以升级但是不能降级,目的就是为了提高获得锁和释放锁的效率。

2023-04-02 08:14:08 325

原创 双重检查锁定与延迟优化

在Java多线程程序中,有时需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延迟初始化技术,但它是一个错误的用法。本文将分析双重检查锁定的错误根源,以及两种线程安全的延迟初始化方案。

2023-03-25 17:11:42 760

原创 深入理解spring源码 Day01 ( 自己手写一个Bean容器吧!)

**} }在Bean工厂的实现中,包括了Bean的注册,这里注册的是Bean的定义信息。同时在这个类中还包括了获取Bean的操作。目前的BeanFactory仍然是非常简化的实现,但这种简化的实现内容也是整个Spring容器中关于Bean使用的最终体现结果,只不过实现过程只展示出基本的核心原理。在后续的补充实现中,这个会不断变得庞大。

2023-03-19 21:34:29 264 2

原创 Java中原子操作的实现原理

我们在学习MySQL的时候就了解过原子性,即整个事务是不可分割的最小单位,事务中任何一个语句执行失败,所有已经执行成功的语句也要回滚,整个数据库状态要恢复到执行事务前到状态。Java中的原子性其实跟先前在数据库的内容里面说的类似,就是不可在分割,在我们的多线程里面就是相当于一把锁,在当前的线程没有完成对应的操作之前,别的线程不允许切换过来,那么Java中是如何实现代码操作中的原子性的呢?在说明这个问题之前,我们先来看一些术语,方便接下来的理解。

2023-03-18 14:31:21 1178

原创 Java对象结构与内置锁

Java内置锁的很多重要信息都存放在对象结构中。

2023-03-11 16:00:51 490

原创 对于ThreadLocal的理解

在Java的多线程并发执行的过程中,为了保证多个线程对变量的安全访问,可以将变量放到ThreadLocal类型的对象中,是变量在每一个线程中都有独立的值,不会出现一个线程读取变量时被另一个线程修改的现象。ThreadLocal类通常被翻译为本地变量类或者线程局部变量。ThreadLocal位于JDK的java.lang核心包中。如果程序创建了一个ThreadLocal实例,那么在访问这个变量的值时,每个线程都会拥有一个独立的、自己的本地值。

2023-03-04 08:33:30 439

原创 记录直播功能的实现

这里的直播功能依赖的是腾讯云的云直播接口,我们只负责编写的配置类中自己的参数即可实现,甚至不需要导入额外的依赖。

2023-02-28 20:26:02 561

原创 对象的 生 | 死

​ 线程私有的程序计数器、虚拟机栈、本地方法栈随着线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊的执行者入栈和出栈。每一个栈帧中分配多少内存基本是在类结构确定下来时就已知的。,因此这几个区域的内存分配回收都具备确定性,在这几个区域内就不需要过多考虑垃圾回收的问题,当方法结束或者线程结束的时候,内存自然就跟着回收了。

2023-02-24 17:41:39 380

原创 Jvm -堆对象的划分

所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区,在《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组对象都应当在运行时分配在堆上。为对象分配内存是意见非常严谨和复杂的任务,jvm的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC完成垃圾回收后在内存空间产生的内存碎片。Java堆区域的大小在jvm启动时就已经被确定下来了,是jvm管理的最大的一块内存空间,但对的大小也是可以调节的。对GC指向垃圾回收的重点区域。

2023-02-18 16:53:41 702

原创 寒假~小结

无论大家选择的方向是南北还是东西,往前走终归是对的。

2023-02-07 20:29:30 84

原创 Class文件结构

在版本号之后,紧跟着就是常量池的数量,以及若干个常量池表项。目前,高版本的 JVM 可以执行由低版本编译器生成的 Class 文件,但是低版本的 JVM 不能执行由高版本编译器生成的 Class 文件,所以在实际的开发中,我们需要特别注意编译时使用的 JDK 版本与生产环境的 JDK 版本是否一致,如果不一致的话,会报出。在数量之后,就是常量池中各项的实际内容,不同类型的常量项的内容内容结构各不相同,但是一般都是以 “类型 - 长度 - 内容” 或者 “类型 - 内容” 的格式依次排列。

2023-02-05 19:03:13 381

原创 Class文件结构

常量池是class文件中内容最丰富的区域之一,随着Java虚拟机的不断发展,常量池的内容也不断丰富。同时,常量池对于Class文件中的字段和方法解析也有着至关重要的作用,可以说,常量池是整个class文件的基石。在版本号之后,紧跟着就是常量池的数量,以及若干个常量池表项。Java代码可以跨平台运行的基础就是因为jvm的跨语言特性,无论哪种语言编写的程序,只要能编译成class文件,就能通过Jvm在各种平台上运行。实现这一特性的关键就是同意而强大的Class文件结构,它是异构语言与jvm之间的重要桥梁。

2023-01-15 15:22:55 112

原创 【无标题】

无论是通过哪种方法退出,在方法推出后都要返回到方法被调用的位置,方法非正常退出时,调用着的pc计数器的值作为返回地址,即调用该方法指令的下一条指令的地址,而通过一场退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。每一个操作数栈都会拥有一个明确的栈深度用于储存数值,其所需要的最大深度在编译时就定义好了,保存在方法的Code属性中名为max-stack的值。操作数栈就是jvm执行引擎的一个工作区,当一个方法开始执行的时候,一个新的栈帧也会随之被创建出来,这个方法的操作数栈是空的。

2022-12-11 12:39:53 294

原创 JVM 垃圾回收

Java自动内存管路主要是针对对象的内存回收和对象的内存分配,其中Java自动内存管理中最核心的就是堆内存中对象的分配和回收1.引用计数法给对象中添加以恶搞引用计数器2.可达性分析算法这个算法的基本思想就是通过一系列的“GC Roots”的对象作为起点,从这些加点开始向下进行搜索,节点所走过的路径被称为引用链,当一个对象到“GC Roots”没有任何引用链相连的话,则证明此对象是不可用的,需要被回收。哪些对象可以作为 GC Roots 呢?3.引用无论是通过桔树算法判断对象的引用数量,还是通过可达

2022-12-03 20:47:23 510

原创 详解jvm的5种引用

在Java虚拟机中有5中常见的引用,强引用,软引用,弱引用,虚引用和终结器。强引用:直接引用。软引用和弱引用在没有没强引用引用且进行垃圾回收时,如果内存不足,软引用对象就会被垃圾回收,而弱引用只要进行垃圾回收就会被回收掉。虚引用虚引用并不会决定对象的生命周期,在任何时间内都会被回收掉在使用虚引用的时候,必须和引用队列一起使用,虚引用的构造器必须传入一个该类型的引用队列。一般用来跟踪垃圾回收的过程,在对象被垃圾回收时收到一个系统消息。程序可在收到某个虚引用对象被回收后做相应的措施。

2022-11-26 19:18:59 342

空空如也

空空如也

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

TA关注的人

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