自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(107)
  • 资源 (1)
  • 收藏
  • 关注

原创 【Java】常用的正则表达式

正则表达式通过其基本的标识语法,定义了字符串的模式,可以用来搜索、编辑或处理文本。在不同的编码语言和环境中,可能会有略微的区分,但其定义的模式都是统一的。本文主要介绍通用的正则表达式规则,以及在 Java 应用中的一些注意事项。

2023-09-27 11:05:34 409

原创 【Java】Pattern 与 Matcher 类的常见应用

Java 正则表达式通过包下的 Pattern 类与 Matcher 类实现Pattern 类的实例适应正则表达式的编译表示形式,指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,根据正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都会保留在匹配器中,因此多个匹配器可以共享同一模式。生成编译后的正则表达式matcher()生成匹配器matches()执行匹配操作,并记录下匹配结果状态单独用 Pattern 只能使用。

2023-09-22 17:21:19 403

原创 【机器学习】模型常用评估指标

机器学习模型可以通过不同的评估指标对其进行评估,具体选用哪种方式,则由模型自身的特征,以及具体的需求来决定的。

2023-07-21 00:27:45 270

原创 【Java】拷贝工具之 Orika 的介绍与演示

在现在流行且广泛应用的各类 Java 分层代码框架中,不同的层定义了不同类型的实体类,如 Entity、DO、DTO、VO 等。层与层之间的对象总是需要进行各种转换和映射,这些操作重复繁琐,于是催生了各种各样的工具,用来快捷、高效地完成这些操作。本文先介绍一款 Java 的拷贝工具Orika,简单讲解一下它的特性,以及进行一些常用的、基础的代码演示。Orika使用反射来访问数据对象的属性,它会自动收集类的元数据,生成映射对象。这些映射对象可用于将数据从一个对象递归拷贝到另一个对象。

2023-07-20 20:00:49 1030

原创 【设计模式】代理模式

Java 的代理模式是一种设计模式,它可以让一个对象(代理对象)代替另一个对象(目标对象)去执行一些操作,并且可以在执行前后添加一些额外的功能。代理模式可以实现对目标对象的功能扩展和保护。Java 的代理模式有两种实现方式:静态代理和动态代理。静态代理是在编译时就生成了代理类的字节码文件,而动态代理是在运行时动态生成代理类并加载到 JVM 中。

2023-06-02 16:58:03 663

原创 雪花算法(Snowflake)

Snowflake 算法是一种分布式唯一 ID 生成算法,主要用于生成分布式系统中的唯一 ID。它的核心思想是,一个 Long 类型占 8 个字节,每个字节占 8 比特,也就是说一个 long 类型占 64 个比特。

2023-05-31 15:54:49 1731

原创 【设计模式】责任链模式的设计与示例

责任链模式是一种行为设计模式,执行上它允许请求沿着一条处理链路依次向下传递,每个处理节点都能对当前状态的请求进行处理,满足一定条件后传递给下一个处理节点,亦或者直接结束这一次处理流程。多层条件准入控制,如人事审批流程、权限检验、游戏通关判断等多环节拦截处理,如 Java 过滤器 Filter、组装生产链路等在这些场景里,使用责任链模式的优势在于,当其中的某个环节需要进行新增、移除、修改时,可以只对单个节点进行操作,不会影响其他节点的执行过程,保证了整个责任链的稳定,代码更加容易维护和迭代。

2023-04-30 07:00:00 1073

原创 在线工具整理大全(持续更新中……)

在线工具整理

2023-04-24 17:15:12 356

原创 【Spring】Spring 自带的工具方法 - 持续更新中

好的工具能够提升工作的效率,可靠稳定的工具能够提升工作的质量。在开发的过程中,身边的同事陆续写了不少新的工具类方法,然而方法中出现很多重复的、与业务强耦合的处理,不利于复用;而且新写的工具类方法没有经过充分的测试和验证,难免容易会出现一些问题,影响线上业务。因此,这里整理了一些 Spring 里面自带的工具类方法,日常开发中可以用到。毕竟通用、稳定的工具还是更加靠谱的。

2023-04-24 16:35:08 85

原创 【Redis】Redis 高并发常见问题

目前市场上许多软件产品,其内部都采用 Redis 作为数据缓存的主要解决方案。随着业务的不断发展,在高并发场景里,Redis 常常会出现一些问题,网络上也有很多文章对其做出了总结。这里主要针对这几类场景进行分析,并提出可能的处理方案。需要强调的是,以下的分析仅供参考,具体决策和实现效果必须要结合具体的业务场景,实事求是地进行应用。

2023-04-24 15:20:29 361

原创 时间轮算法(TimingWheel)

时间轮算法的应用非常广泛,在 Dubbo、Netty、Kafka、ZooKeeper、Quartz 的组件中都有时间轮思想的应用,甚至在 Linux 内核中都有用到。

2022-10-22 16:30:32 5542 2

原创 【计算机网络】HTTP 重定向的应用场景

HTTP 重定向在实际生产中有很多应用场景,但是需要注意的是应该尽可能减少其使用数量,毕竟每一次重定向都会在一定程度上降低服务性能。

2022-09-07 17:00:09 570

原创 【计算机网络】301 永久重定向的缓存问题

在使用 301 的时候常常会遇到一个问题:当服务端针对某个 URL 设置了 301 永久重定向后,不管怎么重新设置或者删除设置,浏览器在进行访问时仍然会使用最开始缓存的 301 重定向,而服务端无法控制用户将原来的重定向配置进行删除。对于用户来说,刚开始服务端设置了 301 重定向时,浏览器能看到 301 的响应,也能正常访问资源。但是在 301 重定向重新被设置后,浏览器还是会访问原来重定向的资源,即便该资源已经失效。

2022-09-07 15:04:49 2342 1

原创 【计算机网络】HTTP 重定向

在 HTTP 请求服务中,服务器可以通过返回一个状态码为 3xx 的重定向响应来告知调用方(通常是浏览器)当前访问的链接需要进行重定向访问,响应头中会带有一个Location字段,注明重定向后的目的地址。浏览器接收到这个重定向响应后,会访问Location中指定的链接。用户对于这个过程通常是没有太明显的感知的,一切都是在客户端和服务端之间完成,用户最直接的感知就是页面响应的时间可能稍微增加。不过如果在重定向过程中出现其他异常,例如重定向的请求不存在或者网络超时等,用户还是能够明显感受到页面加载缓存的。

2022-09-06 20:08:44 1775

原创 【Kafka】@Spring-kafka 消费功能使用总结

Kafka 的消费者模式,通过都会默认开启自动提交偏移量,但是在一些服务的消费业务中,可能由于业务本身的复杂性或者网络的不稳定,导致在设定的自动提交周期内监听器并没有及时提交偏移量,此时 kafka 服务没能接收到心跳而挂掉,就会触发 rebalance 重新分配分组给客户端,进而在消费完成后,提交偏移量失败。通过提供上述的接口,运维人员可以在服务发布上线之后,根据业务需求动态地管理 kafka 消息监听的生命周期,而不需要经过一系列的代码修改、发布等流程对监听器的状态进行修改,大大提升了业务的效率。...

2022-08-15 15:53:54 2101

原创 【Kafka】Spring-kafka 生产者消费者代码实现

Spring-kafka 配置是以 spring.kafka 为前缀的配置信息进行注入的,按照这种形式定义的 kafka 配置信息,在项目启动时会自动读取并配置到 kafka 实例中。当然也可以在配置文件中自定义配置的名称,对应的则需要手动封装配置信息的映射表,并创建相应的 Factory 和 KafkaTemplate 容器。添加启动 kafka 需要的基本配置:# kafka producerkafka.servers=127.0.0.1:9092kafka.producer.topic=kaf

2022-05-30 21:11:20 3007

原创 【Kafka】spring-kafka 简单demo实现

概述Kafka 是现今比较流行的一个异步消息队列处理中间件,经过多年来的发展和完善,已经相对比较成熟,对于大量消息数据的具有较高的性能支持。在 SpringBoot 项目中,常用的 kafka 实现主要有两种方式:一种是 SpringBoot 提供的 spring-kafka,另一种的 Apache 提供的 kafka-clients。对于 SpringBoot 项目,一般都推荐使用 spring-kafka。Spring-kafka 项目实际上在其内部封装了 Apache 的 kafka-client

2022-05-30 14:07:48 631

原创 SpringBoot 的请求参数校验注解

Validation 和 validator 包提供了一系列校验用注解,帮助我们在 RESTful 服务请求中实现期望的数据校验,其注解的功能包括但不限于入参的存在性判断、非空判断、数值取值范围限定、特定含义数据格式校验、校验失败提示信息等。Maven 依赖在 SpringBoot 2.3 版本之前的项目中,主要需要添加的依赖包括以下两个。其中 spring-boot-starter-web 包含了 spring-boot-starter-validation 这个 maven 包,而里面则添加了 j

2022-03-22 21:54:16 7865

原创 @FeignClient 注解的使用与常见问题

概述Feign 是一个声明式的 Web 服务,通过定义一个添加相应注解的接口,即可完成一个 Web 服务的接口。SpringCloud 对 Feign 进行了封装以后,其开始能够支持 Spring MVC 标准注解,同时在 SpringCloud 架构上结合 Eureka 和 Ribbon,还能够支持负载均衡。既然是一个 Web 服务,必然服务端模块与客户端模块都加入 Feign 依赖以及对接的 api 接口,这是 Feign 服务的基本前提。因此双方引入的 Feign 接口都要保持一致,包括服务地址、

2022-01-25 15:39:14 8807 2

原创 【计算机网络】参数包含特殊字符导致导致Http Get 请求报错

前言在各种生产业务中,最常出现的 IO 通信之一就是 Http 访问,而其中常见的访问方法包括 Get 请求和 Post 请求。两者的基本概念和优缺点在很多文章都有说明,如果还没了解过的朋友,可以看下这篇文章:https://blog.csdn.net/sinat_36645384/article/details/107171364从两者的对比可以知道,两者形式上最大的区别就在于参数的传输方式不同。对于 Post 请求,参数可以封装成表单,也可以格式化成 json 格式;而 Get 请求需要将参数拼接

2022-01-18 21:45:27 5850

原创 布隆过滤器(Bloom Filter)原理解析

概述布隆过滤器(Bloom Filter)是布隆在1970年提出的,它可以用来检索一个元素是否在一个集合中。实际上布隆过滤器通过一个二进制向量和一系列随机哈希函数完成元素检索,其优点在于比一般的算法具有更高的时间效率和空间效率,但其缺点是有一定的误差以及难以进行删除操作。原理布隆过滤器的核心就是哈希函数,可以将其看作是对 bitmap 的拓展,通过将添加的元素经过 k 个哈希函数映射到一个很长的 bit 向量中的 k 个位置,并将它们置为 1。检索时,通过判断这个位置是否都为 1 就能大概知道集合中是

2021-12-08 21:28:03 3473

原创 【Redis】Redis 高级数据结构 - bitmap 和 hyperLogLog

业务场景问题:假设我们现在有一个网站,需要记录每天的 UV 数据,那应该采取什么方案来实现呢?如果只是统计网站的 PV,那么给每个网页配置一个独立的 Redis Key 即可,key 中可以加上日期信息实现历史数据的记录。这样每当有一个用户访问当前网站,就对应执行一次 incrby。但是 UV 不同,它需要实现去重的操作,说到去重,大家第一时间想起的可能就是 set 或者 hashmap 这样的数据结构。但是如果网站的流量达到千万级别甚至上亿,那么它们就会十分消耗内存了。因此,我们还可以考虑使用 red

2021-11-30 21:05:50 1119

原创 Java 8 函数式接口

概述Java 8 的函数式编程是在吸收了其他语言的精髓后得到的产物,在原有的基础上新增了更多抽象的函数式接口,便于开发者实现高效优雅的编码。此前常见的函数式接口包括 Runnable,Callable,Comparator 等,新增的函数式接口定义在 java.util.function 包中,常见的基本接口主要包括 predicate,Consumer,Supplier 和 Function,他们的含义以及使用特征大致概括如下表:接口名含义入参出参形式Predicate谓词型

2021-11-23 17:49:22 958

原创 Java8 Stream流的使用

Stream 概述在 Java 8 中,新增了 Stream 这个重要的抽象概念,结合同版本出现的 Lambda 表达式,Stream 通过其 API 提供了一系列高效、友好的处理集合数据的操作方式。从字面上理解,Stream 就是把集合中将要处理的元素集合看作一个流,通过使用其 API 对流中的元素进行各种操作,如过滤、映射、聚合等。它具有以下几个特性:Stream 只是一个抽象接口概念,其本身并不是一个数据结构,所以并不能用来存储数据。Stream API 不会改变数据源,所有操作的最终结果会

2021-11-23 15:28:23 1638

原创 Java 8 Optional使用介绍

概述Java 8 引入了一个非常强大的特性就是 Optional 类,其主要解决的问题就是我们编程时常常遇到的空指针异常(NPE-NullPointerException)。在传统的编程方法里,通常都是以 if-else 条件语句对使用的对象进行判空,比如:public String getVal(ClassA obj) { if (obj == null) { return "unknown"; } else { return obj.getValue(

2021-10-22 16:09:15 1565

原创 【Java 集合类】PriorityQueue 类源码分析

基本定义PriorityQueue 是一个基于优先级堆实现的优先级队列,具体来说是通过完全二叉树实现的,因此可以通过数组作为其底层实现。队列中的元素默认按照其自然顺序(小顶堆)进行排列,或者是根据调用构建方法时传入的比较器 Comparator 对内部元素进行排序。优先级队列的元素不允许为 null,也不允许插入一个不可比较的对象,因为有可能在排序时导致类型转换异常(ClassCastException),因此不传入比较器时,元素需要本身就已经实现 Comparable 接口。优先级队列是无边界的,但是

2021-09-29 19:22:51 188

原创 SpringBoot 利用自定义注解实现AOP拦截控制

在 SpringBoot 中,利用 AOP 实现拦截控制的方法有很多,个人觉得相对比较简洁、比较简单的方式是通过自定义注解实现拦截控制。这种实现方式只需要预先定义一个新的注解,并实现拦截控制的具体业务逻辑,当我们想要拦截某一个方法进行控制时,只需要在方法前加上该注解,通常不需要做过多的调整。在实际工程应用中,这种实现方式确实有效提升了开发效率。AOP 的基本概念AOP 是 Aspect-oriented Programming 的缩写,常译作”面向切面编程“,通俗理解就是在程序运行的链路中,从某一个横切

2021-09-27 19:50:58 9236 2

原创 【Java 集合类】Java 集合的迭代器

集合的迭代器目前在集合中常用的迭代器有三种:Iterator,Iterable 和 ListIterator。Iterator 接口Iterator自 jdk 1.2 出现,取代了 Java 集合框架原来的 Enumeration 接口,两者的区别主要体现在:Iterator 允许调用方在迭代访问的过程中要友好的语法进行 remove 操作;Iterator 对方法名进行了优化。在早期的 jdk 版本里,遍历集合只能通过Iterator迭代器进行操作。目前常用的 jdk 1.8 版本的It

2021-07-06 16:44:08 298

原创 【Java 集合类】Java 集合类总览

jdk 包版本:jdk1.8.0_111Java标准库自带的java.util包提供了集合类:Collection,它是除Map外所有其他集合类的根接口,它作为一个容器,存储一系列的对象。Map是键值对的结构,存储一系列的键值对<key, value>。Java 的java.util包主要提供了以下四种类型的集合:List:一种有序列表的集合;Set:一种保证没有重复元素的集合;Map:一种通过键值(key-value)查找的映射表集合。Queue:一种队列容器,其特性与List相同

2021-07-06 16:42:32 267

原创 【Java 集合类】Collections 类源码分析

Collections 类笔记包路径:jdk1.8.0_111/src.zip!/java/util/Collections.javaCollections 类在内部定义了一系列实用的容器类,主要包括不可修改容器类(unmodifiable)、并发容器类(synchronized)、可检查容器类(checked)、空容器类(empty)和单对象容器类(singleton)。Collections 类的方法都是静态方法,每一种方法都对应一种集合算法的实现,且每一种实现都有两种,一种是适用于实现了Rand

2021-07-03 17:32:01 368 1

原创 【Redis】Redis基础数据结构

Redis 基础数据结构Redis 提供了 5 种基础的数据结构,它们分别是:String,Hash,List,Set,Sorted Set。Redis 缓存数据是以 key - value 的形式进行存储的,key 是一个唯一的字符串,通过操作唯一的 key 值来获取相应的 value 数据。不同数据结构的数据,也就决定了 value 的结构不一样。String(字符串)Redis 的 String 是一个动态的字符串,可以被修改,其内部结构实现是一个字符数组,类似于 Java 的 ArrayLis

2021-06-17 15:20:49 305 1

原创 【Redis】Redis 缓存更新方案分析

前言在业务环境中,频繁访问数据库获取数据的做法是不可取的,为了提升数据请求的效率,目前比较流行的做法就是使用 Redis 缓存服务,将频繁被请求的数据缓存起来,在下一次数据被请求时,根据设定的 key 返回相应的数据。但是,缓存系统的存在,就导致数据库和 Redis 之间需要我们考虑其数据同步的问题。由于两者的数据更新必然不是同时进行的,因此当其中一方出现数据更新时,正在进行的访问就有可能从另一方获取到“肮脏”的数据。接下来,我们就分析一下可能存在的几种方案以及他们各自的优缺点。方案一:懒加载服务运行

2021-06-09 15:35:06 2670

原创 【Redis】Redis 高并发处理策略

在现实中很多的业务场景里,人们常常使用 Redis 作为缓存使用。其性能高,支持数据结构丰富,还具备多种优势特性。在日常业务中,通常的请求处理过程为:业务系统有请求进来,先查缓存,查不到数据再去查 DB 层,命中后回写缓存,再返回数据。这种模式称之为“赖加载”模式。这样使用缓存策略一般也不会遇到问题,但是当业务平台越来越大,用户数量越来越大的时候。平台要开始考虑高并发场景下是否系统是否支撑的下去。尤其是考虑瞬间大量请求时,系统如何设计。存在读写压力,可以采用数据库分库分表的方式,不过基于成本考虑,数据

2021-06-05 17:26:59 2228

原创 【Redis】Redis简介与基本特性

简介Redis 全称为 Remote DIctionary Server,本质上是一个 key-value 存储系统,属于跨平台的非关系型数据库。Redis 官方对它的定义是:Redis is an open source (BSD licensed), in-memory data structure store, used database, cache and message broker.翻译成中文就是:Redis 是一个开源的(BSD 许可),基于内存的数据结构存储系统,可用作数据库、缓

2021-06-05 14:40:42 867 2

原创 【Java 集合类】LinkedList 类源码分析

LinkedList 类源码分析与数组一样,LinkedList 也是一种线性的数据结构,但它不像数组或者 ArrayList 那样在连续的内存空间上存储元素,而是通过引用相互链接,这也成为索引存储。LinkedList 之中的每一个元素都可以称之为节点(Node),每一个节点包括三个属性:元素本身的值。指向下一个节点的引用地址。指向上一个节点的引用地址。Node 是 LinkedList 类的一个私有静态内部类,其源码如下:private static class Node<E&g

2020-09-11 16:49:29 194

原创 【Java 集合类】ArrayList 类源码分析

ArrayList 类源码分析数组是 Java 编程中最常用的基本数据类型之一,但其本身自带的方法不多,不便于进行相对复杂的操作。因此在 Java 中有一个相对应的集合类 ArrayList,可以称得上在集合方面最常用的类了。ArrayList 类的设计逻辑如下:ArrayList 实现了 List 接口,其内在逻辑是基于数组实现的。对于数组这个基本数据类型来说,其大小在声明的时候就已经是固定了的,不能再进行动态的调整。如果依次向数组里添加数据,一旦数组满了,就不能再添加任何元素了。相比而言,Arra

2020-09-11 16:47:13 121

原创 【设计模式】单例模式

设计模式之单例模式顾名思义,单例模式就是用来保证一个类只能构建一个对象的设计模式。初级版本一个初始版本的单例模式实现如下:构建方法是私有的,只能由类内部调用;单例对象只能通过 getInstance 方法获取,不能直接访问。public class Singleton { private static Singleton instance = null; // 单例对象 private Singleton() {} // 私有构造函数 // 静态工厂方法

2020-08-07 17:19:49 137

原创 【设计模式】观察者模式

观察者模式观察者模式是一种基于事件和响应的设计模式,常常用于传统的窗体应用程序以及游戏开发领域。一个典型的场景是,在游戏操作界面中,存在游戏角色、陷阱、怪物、宝物等,当游戏角色移动到陷阱、怪物、宝物的位置时,如何让这个移动事件能够被感知到,并作出正确响应呢?传统的思路是,陷阱、怪物、宝物周期性地对自己的有效范围进行检测,当检测到主角时则作出响应。这种是“拉取”的思想,但存在明显的弊端,如果事件没有发生,那么程序就会一直“空转”,浪费资源;而且,即便事件有发生,如果检测周期太长,也无法得到实时的响应。如

2020-08-07 17:18:07 145

原创 【网络编程基础】Socket 通信

Socket 通信本地的进程间通信方式有很多种,不同进程之间可以通过进程号来区分不同的进程。那在网络中通信的进程又是如何唯一标识一个进程呢?根据 TCP/ IP 协议簇的定义,网络层的 IP 地址可以唯一标识网络中的主机,传输层的协议+端口可以唯一标识主机中的应用程序(进程),因此利用三元组(IP 地址,协议,端口)就可以标识网络中的进程了,而网络中的进程通信就可以利用这个标志实现进程间交互。使用 TCP / IP 协议的应用程序通常采用应用编程接口来实现网络进程间的通信,目前几乎所有的应用程序都是采

2020-07-29 23:13:12 483

原创 【编程基础】堆空间与栈空间

在 C 语言中,内存分布的部分情况如下图所示:有些部分并没有在图中表示出来,实际上内存分布的功能划分从高地址到低地址依次是:内核空间:应用程序不允许访问的部分,只能由内核进行操作,操作系统的内核程序映射到这个区域。栈空间:保存局部变量。文件映射区:进程打开文件后,将文件内容从硬盘读到进程的文件映射区,以后就直接在内存中操作这个文件,读写完成后保存时,再将内存中的文件写入硬盘中。堆空间:运行时使用,常用 malloc( ) / free( ) 或者 new( ) / delete( )。全局的

2020-07-20 21:25:52 4175 3

Java模式匹配demo

Java模式匹配demo

2023-09-22

MapStruct Java实例Demo

MapStruct Java实例Demo

2023-09-04

Java代理实战Demo

实现了常用的 cglib 代理以及 jdk 代理方式,涉及到各种常用的场景以及相关方法。

2023-08-09

orika Java实例Demo

orika Java实例Demo

2023-08-09

时间轮算法+延时队列实现任务队列Java Demo

多层时间轮,可根据配置的时间轮大小参数以及插入任务的相对时间,动态地创建不同层次的时间轮实例(这里的多层时间轮采用了相同的size)。引入了延时队列以减少空轮询,将时间轮的推进与任务的提交执行隔离开,提升模型的效率。

2022-10-22

vatic-install.sh

vatic 安装脚本,更新至 2020-01-27。脚本中涉及到相关 python 环境的配置安装,mysql、turkic、pyvision 文件的 clone 以及他们的启动。

2020-03-02

空空如也

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

TA关注的人

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