自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JAVA12

2019年3月19日,java12正式发布了,总共有8个新的JEP(JDK Enhancement Proposals)Features低暂停时间的GC http://openjdk.java.net/jeps/189微基准测试套件 http://openjdk.java.net/jeps/230switch表达式 http://openjdk.java.net/jeps/325JVM常量API http://openjdk.java.net/jeps/334。

2024-04-26 21:24:32 474

原创 JAVA11迭代更新

2018年9月26日,Oracle官方发布JAVA11,Oracle 表示会对 Java 11 提供大力支持,这一支持将会持续至 2026 年 9 月。这是JAVA大版本周期变化后的第一个长期支持版本。非常值得关注,最新发布的JAVA11将带来ZGC HttpClient等重要特性,一共17个需要我们关注的JEP,参考文档。181:基于嵌套的访问控制309:动态类文件常量315:改进Aarch64 Intrinsics318:Epsilon:一个无操作的垃圾收集器。

2024-04-25 22:48:57 520

原创 JAVA10迭代更新

2018年3月21日, Oracle官方宣布JAVA10正式发布JAVA9和java10 都不是 LTS (Long-Term-Support)版本.和过去的JAVA大版本升级不同,这两个只有半年左右的开发和维护时间. 而JAVA11 也是就是18.9,才是JAVA之后的第一个长期支持版本JAVA10 一共定义了109个新特性,其中包含JEP,对程序员来说,真正的新特性也就一个,还有一些新的API和JVM规范以及JAVA语言规范上的改动.

2024-04-25 21:40:09 620

原创 JAVA9迭代特性

经过4次推迟,历经曲折的Java9最终在2017年9月21日发布。因为里面加入的模块化系统,在最初设想的时候并没有想过那么复杂,花费的时间超出预估时间。距离java8大约三年时间。Java 9提供了超过150项新功能特性,包括备受期待的模块化系统、可交互的REPL工具: jshell, JDK编译工具,语法层面的改变:Java公共API和私有代码,以及安全增强、扩展提升、性能管理改善等。可以说Java 9是一个庞大的系统工程,完全做了一个整体改变。但是这个巨大改变的功劳,都给了java11了,

2024-04-24 21:31:58 728

原创 Netty-优化与源码

### 3)ulimit -n* 属于操作系统参数* 可以设置一个进程同时打开的文件描述符的数量。### 4)TCP_NODELAY* 属于 SocketChannal 参数* 默认 false 开启了 nagle 算法### 5)SO_SNDBUF & SO_RCVBUF* SO_SNDBUF 属于 SocketChannal 参数* SO_RCVBUF 既可用于 SocketChannal 参数,也可以用于 ServerSocketChannal 参数(建议设置到 Se

2024-04-23 20:29:13 577

原创 Netty 进阶

魔数,用来在第一时间判定是否是无效数据包版本号,可以支持协议的升级序列化算法,消息正文到底采用哪种序列化反序列化方式,可以由此扩展,例如:json、protobuf、hessian、jdk指令类型,是登录、注册、单聊、群聊… 跟业务相关请求序号,为了双工通信,提供异步能力正文长度消息正文/*** 用户管理接口/*** 登录* @param username 用户名* @param password 密码* @return 登录成功返回 true, 否则返回 false。

2024-04-22 20:16:27 491

原创 Netty 入门

Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。

2024-04-22 10:06:40 816

原创 垃圾回收器

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。虽然我们对各个收集器进行比较,但并非要挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现,更加没有万能的垃圾收集器,我们能做的就是根据具体应用场景选择适合自己的垃圾收集器。试想一下:如果有一种四海之内、任何场景下都适用的完美收集器存在,那么我们的 HotSpot 虚拟机就不会实现那么多不同的垃圾收集器了。JDK 默认垃圾收集器(使用。

2024-04-19 23:25:16 1072

原创 网络编程ServerSocketChannel

因为 select 在事件发生后,就会将相关的 key 放入 selectedKeys 集合,但不会在处理完后从 selectedKeys 集合中移除,需要我们自己编码删除。只要向 channel 发送数据时,socket 缓冲可写,这个事件会频繁触发,因此应当只在 socket 缓冲区写不下时再关注可写事件,数据写完之后再取消关注。事件发生后,要么处理,要么取消(cancel),不能什么都不做,否则下次该事件仍会触发,这是因为 nio 底层使用的是水平触发。拷贝 01234567890abcdef。

2024-04-19 10:02:39 754

原创 JAVA AIO

AIO 用来解决数据复制阶段的阻塞问题* 同步意味着,在进行读写操作时,线程需要等待结果,还是相当于闲置* 异步意味着,在进行读写操作时,线程不必等待结果,而是将来由操作系统来通过回调方式由另外的线程来获得结果> 异步模型需要底层操作系统(Kernel)提供支持>> * Windows 系统通过 IOCP 实现了真正的异步 IO> * Linux 系统异步 IO 在 2.6 版本引入,但其底层实现还是用多路复用模拟了异步 IO,性能没有优势

2024-04-19 09:44:51 628

原创 其它IO合集

缓冲流,也叫高效流,是对4个基本的FileXxx字节缓冲流字符缓冲流缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据对象的类型和对象中存储的数据。

2024-04-17 15:33:42 943

原创 IO基础合集

类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。File类只能对文件本身进行操作,不能读写文件里面存储的数据。生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了ctrl+s,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input和输出output。

2024-04-17 12:13:20 707

原创 CompletableFuture用法详解

1.概念Fork/Join 是 JDK 1.7 加入的新的线程池实现,它体现的是一种分治思想,适用于能够进行任务拆分的 cpu 密集型运算所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直至不能拆分可以直接求解。跟递归相关的一些计算,如归并排序、斐波那契数列、都可以用分治思想进行求解Fork/Join 在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率Fork/Join 默认会创建与 cpu 核心数大小相同的线程池2.使用。

2024-04-16 12:18:09 272

原创 Java的Future机制详解

一个java对象可以看成是一段内存,各个字段都得按照一定的顺序放在这段内存里,同时考虑到对齐要求,可能这些字段不是连续放置的,用这个UNSAFE.objectFieldOffset()方法能准确地告诉你某个字段相对于对象的起始内存地址的字节偏移量,因为是相对偏移量,所以它其实跟某个具体对象又没什么太大关系,跟class的定义和虚拟机的内存模型的实现细节更相关。B图表达的是使用Future模式之后,我们主线程在invoke之后可以立即返回,去做其他的事情,回头再来看看刚才提交的invoke有没有结果。

2024-04-16 07:56:17 857

原创 Semaphore快速上手

Semaphore(信号量)是Java并发编程中的一种同步工具,它可以用来控制同时访问某个特定资源的线程数量。Semaphore维护了一个许可集合,线程可以通过获取和释放许可来进行同步。下面是一个简单的Semaphore使用示例,我们创建了一个具有3个许可的信号量,然后启动5个线程同时访问共享资源。通过使用Semaphore,我们可以更好地控制并发线程对共享资源的访问,从而提高程序的性能和稳定性。方法尝试获取一个许可,如果当前没有可用的许可,它将立即返回false,而不是阻塞线程。方法用于释放一个许可。

2024-04-15 23:04:12 554

原创 J垃圾回收

在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。内存泄漏指的是不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出。为了让程序员更专注于代码的实现,而不用过多的考虑内存释放的问题,所以,在Java语言中,有了自动的垃圾回收机制,也就是我们熟悉的GC(Garbage Collection)。有了垃圾回收机制后,程序员只需要关心内存的申请即可,内存的释放由系统自动识别完成,垃圾回收器主要负责对堆上的内存进行回收。在进行垃圾回收时,不同的对象引用

2024-04-15 18:48:38 611

原创 JAVA内存区域

其中就包含了类的字段、方法等字节码文件中的内容,同时还保存了运行过程中需要使用的虚方法表(实现多态的基础)等信息。所以s2.intern指向的是字符串常量池中的对象,而s2指向的是堆中的对象。一直执行到方法的最后一行指令,此时方法执行return语句,当前方法执行结束,程序计数器中会放入方法出口的地址(栈中讲解,简单来说就是这个B方法结束了,A调用了B,那么要回到A方法)used指的是当前已使用的堆内存,total是java虚拟机已经分配的可用堆内存,max是java虚拟机可以分配的最大堆内存。

2024-04-14 10:48:14 821

原创 类加载器

类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术,类加载器只参与加载过程中的字节码获取并加载到内存这一部分。类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。这句话可以表达得更通俗一些:比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来

2024-04-13 20:46:12 917

原创 类的生命周期

clini>()方法对于类或接口来说并不是必需的,如果一个类中没有静态语句块,也没有对变量的赋值操作,那么编译器可以不为这个类生成()方法。接口中不能使用静态语句块,但仍然有变量初始化的赋值操作,因此接口与类一样都会生成()方法。但接口与类不同的是,执行接口的()方法不需要先执行父接口的()方法,因为只有当父接口中定义的变量被使用时,父接口才会被初始化。此外,接口的实现类在初始化时也一样不会执行接口的()方法。

2024-04-13 19:33:39 1170

原创 字节码文件的组成

比如在代码中,编写了两个相同的字符串“我爱北京天安门”,字节码文件甚至将来在内存中使用时其实只需要保存一份,此时就可以将这个字符串以及字符串里边包含的字面量,放入常量池中以达到节省空间的作用。jad命令可以将类的字节码文件进行反编译成源代码,用于确认服务器上的字节码文件是否是最新的,如下将demo.MathGame的源代码进行了显示。javap是JDK自带的反编译工具,可以通过控制台查看字节码文件的内容。字节码中的方法区域是存放字节码指令的核心位置,字节码指令的内容存放在方法的Code属性中。

2024-04-13 17:09:35 783

原创 AQS 原理

全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架,它是构建锁或者其他同步组件的基础框架。

2024-04-11 11:05:50 850

原创 synchronized底层原理

Java中的synchronized有偏向锁、轻量级锁、重量级锁三种形式,分别对应了锁只被一个线程持有、不同线程交替持有锁、多线程竞争锁三种情况。描述重量级锁底层使用的Monitor实现,里面涉及到了用户态和内核态的切换、进程的上下文切换,成本较高,性能比较低。轻量级锁线程加锁的时间是错开的(也就是没有竞争),可以使用轻量级锁来优化。轻量级修改了对象头的锁标志,相对重量级锁性能提升很多。每次修改都是CAS操作,保证原子性偏向锁。

2024-04-10 15:39:46 868

原创 CountDownLatch 详解

CountDownLatch 类主要提供了以下方法:构造函数,创建一个 CountDownLatch 对象,并设置初始的计数器值为 count。阻塞当前线程,直到计数器值变为0。如果计数器已经为0,立即返回。如果在等待过程中被中断,则抛出 InterruptedException 异常。阻塞当前线程,直到计数器值变为0或者超时。如果在指定时间内计数器变为0,则返回 true ,否则返回 false。如果在等待过程中被中断,则抛出 InterruptedException 异常。

2024-04-05 23:24:36 893

原创 通用分布式锁组件

Redisson是一个基于Redis的工具包,功能非常强大。将JDK中很多常见的队列、锁、对象都基于Redis实现了对应的分布式版本。1)创建锁对象2)尝试获取锁3)处理业务4)释放锁但是,除了第3步以外,其它都是非业务代码,对业务的侵入较多:可以发现,非业务代码格式固定,每次获取锁总是在重复编码。我们可不可以对这部分代码进行抽取和简化呢?锁名称锁等待时间锁超时时间时间单位方法结束是否释放锁/*** 加锁key的表达式,支持SPEL表达式/**

2024-04-04 13:30:01 987

原创 Spring事务失效问题

这种方式的本质是利用Spring的AOP代理机制,确保调用事务方法时,是由Spring的AOP容器进行代理的调用。在某些复杂的场景下,如果以上方法都不适用,可以考虑使用Spring AOP直接对需要事务支持的方法进行增强,通过编程的方式动态地为方法调用提供事务支持。注解,但是你在获取某个对象的时候,可能并不是获取的Spring管理的对象,有可能是其它方式创建的。通过上述方法,可以有效解决Spring中非事务方法调用事务方法导致的事务失效问题,确保事务的正确执行。方法,会开启一个事务,可以成为外部事务。

2024-04-03 17:10:21 980

原创 Redis网络模型

try {// 1.建立连接// 2.获取输出流、输入流// 3.发出请求// 3.1.获取授权 auth 123456// 4.解析响应// 4.解析响应// 4.解析响应// 5.释放连接try {if (reader!if (writer!if (s!// 读取首字节// 判断数据类型标示case '+': // 单行字符串,直接读一行case '-': // 异常,也读一行case ':': // 数字。

2024-04-02 08:02:22 1003

原创 兑换码生成算法

自增id从1增加到Integer的最大值,可以达到40亿以上个数字,而占用的字节仅仅4个字节,也就是32个bit位,距离50个bit位的限制还有很大的剩余,符合要求!那因此,只要我们让数字转为二进制的形式,然后每5个二进制位为一组,转10进制的结果是不是刚好对应一个角标,就能找到一个对应的字符呢?所以,我们采用自增id的同时,还需要利用某种校验算法对id做加密验证,避免他人找出规律,猜测到其它兑换码,甚至伪造、篡改兑换码。依此类推,最终那一串二进制数得到的结果就是KCNBP2PC84,刚好符合我们的需求。

2024-04-01 18:10:56 949 2

原创 Redis数据结构

对⼀个内部表示成long型的string执行append, setbit, getrange这些命令,针对的仍然是string的值(即⼗进制表示的字符串),而不是针对内部表⽰的long型进⾏操作。String的内部存储结构⼀般是sds(Simple Dynamic String,可以动态扩展内存),但是如果⼀个String类型的value的值是数字,那么Redis内部会把它转成long类型来存储,从⽽减少内存的使用。我们可以看到,key的类型固定是string,而value可能的类型是多个。

2024-03-31 22:18:17 944

原创 MP设置动态表名

虽然无法传参,但是从计算表名,到动态表名插件执行,调用TableNameHandler,都是在一个线程内完成的。这个Map的key是旧的表名称,value是TableNameHandler,就是表的名称处理器,用于根据旧名称获取新名称。因此,一旦我们计算完表名,以某种方式传递给插件中的TableNameHandler,那么就无需重复计算表名了。计算表名的方式是获取获取上赛季时间,查询数据库中上赛季信息,得到上赛季id。流程中,我们会先计算表名,然后去执行持久化,而动态表名插件就会生效,去替换表名。

2024-03-31 10:40:24 1123

原创 分布式事务

XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。但是当我们把三件事情看做一个"业务",要满足保证“业务”的原子性,要么所有操作全部成功,要么全部失败,不允许出现部分成功部分失败的现象,这就是。但事务等待过程中,处于弱可用状态。,就必须等待网络恢复,完成数据同步后,整个集群才对外提供服务,服务处于阻塞状态,不可用。

2024-03-26 13:32:16 1028

原创 RabbitMq高可用

如何确保RabbitMQ消息的可靠性?开启生产者确认机制,确保生产者的消息能到达队列开启持久化功能,确保消息未消费前在队列中不会丢失开启消费者确认机制为auto,由spring确认消息处理成功后完成ack开启消费者失败重试机制,并设置MessageRecoverer,多次重试失败后将消息投递到异常交换机,交由人工处理。

2024-03-23 13:17:00 840

原创 RabbitMQ部署指南

在刚刚的案例中,一旦创建队列的主机宕机,队列就会不可用。用户发送给队列的一切请求,例如发送消息、消息回执默认都会在主节点完成,如果是从节点接收到请求,也会路由到主节点去完成。从RabbitMQ 3.8版本开始,引入了新的仲裁队列,他具备与镜像队里类似的功能,但使用更加方便。而镜像模式下,创建队列的节点被称为该队列的。但是,不同队列可以在集群中的任意节点上创建,因此不同队列的主节点可以不同。我们使用exactly模式的镜像,因为集群节点数量为3,因此镜像数量就设置为2.可以看到,仲裁队列的 + 2字样。

2024-03-22 21:31:22 1146

原创 微服务保护

Sentinel是阿里巴巴开源的一款微服务流量控制组件。丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。广泛的开源生态。

2024-03-22 15:30:57 998

原创 ES高可用

默认的拼音分词器会将每个汉字单独分为拼音,而我们希望的是每个词条形成一组拼音,需要对拼音分词器做个性化定制,形成自定义分词器。character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smarttokenizer filter:将tokenizer输出的词条做进一步处理。

2024-03-21 19:59:12 1211

原创 02分布式搜索引擎ES

elasticsearch的查询依然是基于JSON风格的DSL来实现的。本文了解elasticsearch的数据搜索功能。我们会分别使用DSL和RestClient实现搜索。Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:查询所有:查询出所有数据,一般测试用。例如:match_all全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:精确查询:根据精确词条值查找数据,一般是查找

2024-03-20 16:03:55 1380

原创 01分布式搜索引擎ES

文档操作有哪些?创建文档:POST /{索引库名}/_doc/文档id { json文档 }查询文档:GET /{索引库名}/_doc/文档id删除文档:DELETE /{索引库名}/_doc/文档id修改文档:全量修改:PUT /{索引库名}/_doc/文档id { json文档 }增量修改:POST /{索引库名}/_update/文档id { “doc”: {字段}}JavaRestClient操作elasticsearch的流程基本类似。

2024-03-20 15:07:21 846

原创 elasticsearch安装部署

本文将向您揭示如何部署和管理Elasticsearch,让您能够充分利用其强大的功能,构建出响应迅速且可靠的搜索服务,以应对大规模数据处理的挑战。在互联网项目中,在网络间传输的速度很快,所以很多语言是不允许在网络上传递的,如:关于宗教、政治等敏感词语,那么我们在搜索时也应该忽略当前词汇。Elasticsearch作为一款高性能的搜索引擎和分析平台,以其强大的全文搜索功能、实时数据分析能力和水平可扩展性赢得了广泛的应用。IK分词器也提供了强大的停用词功能,让我们在索引时就直接忽略当前的停用词汇表中的内容。

2024-03-18 20:58:25 1256

原创 Gateway网关

Spring Cloud Gateway是Spring官方推出的一个新一代API网关框架,目的在于为微服务架构提供一种简单有效的统一的API路由管理方式。作为微服务架构中的关键组件,Gateway承担着请求路由、权限校验、监控、限流、熔断、日志记录等多种功能,旨在提高服务的安全性、可用性和可维护性。

2024-03-18 09:22:51 950

原创 Feign

Feign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加简单。它是Spring Cloud中的一个模块,用于简化对REST服务的调用。使用Feign可以通过简单的接口描述来创建一个HTTP客户端。Feign的主要目标是让远程调用更加简单、编码更少、易于维护。Feign的核心特性声明式REST客户端:Feign提供了一种声明式的方法来定义REST客户端,使得服务之间的调用变得非常简洁。负载均衡:集成了Ribbon,Feign自带客户端负载均衡功能。容错与断路器。

2024-03-17 18:51:49 803

原创 Spring Validation

在现代Web应用开发中,确保用户输入数据的正确性和合法性是至关重要的。Spring Validation作为Spring框架中的一个重要组成部分,提供了一套强大而灵活的机制来处理数据验证。本文将深入探讨Spring Validation的各个方面,包括其工作原理、核心组件、常用注解、高级特性以及最佳实践。

2024-03-16 22:11:05 1384

空空如也

空空如也

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

TA关注的人

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