自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 select,poll以及epoll的区别

与select和poll不同的是,epoll采用“事件通知”的方式,当一个文件描述符就绪时,内核会向用户态发送一个事件,而不是像select和poll那样需要遍历整个文件描述符集合。但是与select不同的是,poll没有文件描述符数量的限制,因为它使用链表来存储文件描述符,所以可以监听任意数量的文件描述符。但是select也存在一些缺点,比如它的效率比较低,在文件描述符比较多的情况下,每次调用select时都需要将所有的文件描述符从用户态复制到内核态,这样会造成较大的开销。

2023-10-25 17:17:51 156

原创 什么是IO多路复用?Redis中对于IO多路复用的应用?

而非阻塞IO模型中,一个线程可以同时处理多个连接,当一个连接没有数据可读时,线程可以立即切换到其他连接上进行处理,从而提高了系统的并发处理能力。总之,IO多路复用是一种高效的IO处理方式,它可以提高系统的并发处理能力。在Redis中,IO多路复用被广泛应用于网络通信模块,通过使用非阻塞IO和IO多路复用技术,Redis实现了高并发的网络通信,提高了系统的性能和稳定性。IO多路复用是一种高效的IO处理方式,它允许一个进程同时监控多个文件描述符(包括套接字、管道等),并在有数据可读或可写时进行相应的处理。

2023-10-25 17:16:54 387

原创 MyBatis中的一二级缓存

一级缓存是MyBatis默认开启的缓存机制,它是基于线程的缓存,每个SqlSession都有一个独立的一级缓存。当SqlSession执行查询操作时,查询结果会被存储在一级缓存中。当再次执行相同的查询时,MyBatis会先检查一级缓存中是否存在相同的查询结果,如果存在,则直接从缓存中获取查询结果,而不再去数据库中执行查询操作。当多个SqlSession执行相同的查询时,如果查询结果在二级缓存中存在,则所有的SqlSession都可以直接从缓存中获取查询结果,而不再去数据库中执行查询操作。

2023-10-22 15:30:01 272

原创 MyBatis实现延时加载的方式

例如,假设有一个User实体类和一个Order实体类,一个User可以有多个Order。以上是两种常用的方式实现延时加载,具体的实现方式可以根据具体的需求和场景选择。

2023-10-22 13:04:45 293

原创 Spring中事务失效的几种场景及解决办法

事务方法被同一个类中的其他方法调用:如果一个事务方法被同一个类中的另一个方法调用,事务可能会失效。事务方法被非公共方法调用:如果一个事务方法被同一个类中的非公共方法调用,事务也可能会失效。不支持的事务传播行为:Spring中的事务传播行为定义了事务方法在调用其他事务方法时如何处理事务。异常被捕获:如果在一个带有事务的方法中抛出异常,但被捕获并处理了,Spring也无法检测到事务失败,从而无法回滚。未抛出异常:如果在一个带有事务的方法中没有抛出异常,Spring无法检测到事务失败,从而无法回滚。

2023-10-22 11:08:34 694

原创 SpringBoot 3 + RocketMQ Starter 踩过的坑,血淋淋的教训!!!!!

当你使用SpringBoot 3进行项目开发时,你一旦用到了RocketMQ的starter,你一定要先看这篇文章,真是血淋淋的教训。按照正常来说,starter一般都是使用配置式就可以进行工作,但是今天我碰见了一个只用配置无法解决的问题。其实这就是告诉Spring RocketMQ的自动装配类的路径。

2023-10-07 00:00:17 361 1

原创 Java中如何在抽象层统一获取泛型类型

总之,在Java中使用泛型可以有效地提高代码的可读性和可维护性。同时,通过反射机制和工厂模式的配合使用,我们可以更加方便地处理泛型类型和注册消息处理器。在Java中,我们经常会使用泛型来增强代码的可读性和可维护性。但是,在处理泛型的时候,我们有时会遇到一些问题,比如在抽象层如何统一获取泛型类型。那么,如何解决这个问题呢?其实很简单,我们只需要使用Java反射机制中的Type类和ParameterizedType类就可以了。当然,这只是获取泛型类型的一种方法,具体实现还需要根据不同的场景进行调整。

2023-10-05 16:43:17 180

原创 如何获取图片的宽高

FileReader对象用于读取文件,而Image对象则用于加载图片。我们可以通过FileReader读取图片文件,并将其转换为DataURL。然后,我们可以创建一个Image对象,并将DataURL赋值给它的src属性。这样,Image对象就可以加载图片了。在网页设计和开发中,获取图片的宽高是一个常见的需求。在这篇文章中,我将向大家介绍如何获取图片的宽高。当Image对象加载完成后,我们可以获取它的width和height属性,从而得到图片的宽高。以上就是获取图片宽高的方法。

2023-10-04 20:29:26 864

原创 四种经典限流算法的实现思路以及各自的优缺点

然后,它比较当前请求数量与漏桶的大小,如果当前请求数量小于漏桶的大小,则允许请求通过,并将请求数量更新为漏桶的大小;其次,窗口的滑动可能会导致请求速率的突然变化,因为新窗口的请求数量可能会比旧窗口的请求数量多。然后,它比较当前令牌数量与令牌桶的大小,如果当前令牌数量大于等于令牌桶的大小,则将令牌数量更新为令牌桶的大小,并返回。它通过维护一个固定大小的窗口,并根据请求的时间戳来计算窗口内的请求数量,从而实现对请求速率的限制。:这是一个基于请求队列的限流器,可以根据请求的特征和系统的处理能力来限制请求的速率。

2023-09-21 09:48:47 272

原创 如何使用正则表达式实现Java日志信息的抓取与收集

另一方面,对于大型应用程序来说,日志信息可能非常庞大,手动查找和分析非常困难,因此需要自动化工具来完成这项工作。其中,(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})匹配时间戳,(INFO|DEBUG|WARN|ERROR)匹配日志级别,([^\s]+)匹配类名和方法名,(.+)匹配具体信息。有了这个正则表达式,我们就可以轻松地从Java日志中抓取出需要的信息,并进行收集和分析。总之,正则表达式是一个非常强大的工具,在Java日志信息的抓取和收集中也能发挥重要作用。

2023-09-20 22:52:29 648

原创 事务中调用第三方接口时,如果接口没有回应几种常用的解决方案

为事务设置超时时间,如果在超时时间内没有收到接口的回应,则事务可以自动回滚或执行其他失败处理逻辑。:可以对第三方接口的调用情况进行监控,并设置报警规则,以便在接口出现问题时及时收到通知并进行处理。:可以在一定的时间间隔后重新调用接口,以确保网络问题或其他短暂性问题不会影响事务的执行。:在调用接口时,可以捕获异常并根据异常类型执行相应的处理逻辑,例如记录日志、发送通知等。:如果第三方接口不可用,可以考虑使用备用方案,例如使用缓存数据、调用本地存储的数据等。

2023-09-19 09:38:09 585

原创 RabbitMQ中的死信队列产生的几个条件和应用场景

在本文中,我们介绍了RabbitMQ中的死信队列概念、产生的条件以及应用场景。在RabbitMQ中,死信队列是一个非常有用的概念,它可以帮助我们解决一些常见的问题。在本文中,我们将探讨死信队列的概念、产生的条件以及应用场景。当这些消息进入死信队列后,我们就可以采取一些特殊的处理措施,比如重新发送、丢弃等。当一个消息无法被正常处理时,我们可以将它发送到死信队列中,并设置一些重试机制。我们可以利用死信队列来收集一些无法被正常处理的日志信息,并将它们发送到专门的日志收集系统中。

2023-09-19 09:35:52 421

原创 @ControllerAdvice和@RestControllerAdivice的区别

除了用来处理异常之外,@ControllerAdvice和@RestControllerAdvice还有一些其他的用途。而@ControllerAdvice和@RestControllerAdvice就是两种处理异常的方式。总之,@ControllerAdvice和@RestControllerAdvice都是非常有用的工具,可以帮助我们更好地处理异常和添加全局功能。需要注意的是,@ControllerAdvice和@RestControllerAdvice只能处理当前应用程序中的异常。

2023-09-14 21:56:34 388

原创 如何优雅的实现无侵入性参数校验之spring-boot-starter-validation

在上面的代码中,@Validated 注解表示需要进行参数校验,@RequestBody 注解表示接收的是一个 JSON 对象,而 User 类中的 @NotBlank、@NotNull 等注解表示对 User 对象中的相应属性进行校验。但是,传统的参数校验方法往往需要在代码中手动添加大量的 if-else 语句,这不仅繁琐,而且容易出错。然后,在需要校验参数的方法中添加 @Validated 注解,并在需要校验的参数前添加 @NotBlank、@NotNull、@Min、@Max 等注解即可。

2023-09-12 16:13:48 399 1

原创 Java中线程共享变量的可见性问题

当一个线程进入synchronized代码块时,它会自动获取该对象的锁,并清空本地内存中该对象相关的变量值,强制从主内存中重新读取变量值。当一个线程修改了共享变量的值后,这个值会先被更新到该线程的本地内存中,而不是直接更新到主内存中。当一个变量被声明为volatile时,每个线程都会强制从主内存中读取该变量的值,并将自己本地内存中该变量相关的值刷新回主内存中。例如,如果一个线程修改了共享变量的值,而另一个线程在此之前已经从主内存中读取了旧值并进行了计算,那么它得到的结果可能是错误的。

2023-08-29 20:14:07 312

原创 Vue3.3+中的新特性defineModel

而现在,有了defineModel,我们只需要定义一个modelValue就好了。Vue会自动帮我们生成value和update事件。不仅如此,defineModel还支持自定义事件名,让我们可以更灵活地控制双向绑定。而且,它还支持多个modelValue同时绑定到同一个组件上,这样就能实现多个值之间的联动啦。Vue 3.3+又有新特性啦!听起来很高级的样子,其实它就是让你更方便地定义双向绑定的模型。总之,Vue 3.3+的defineModel让双向绑定变得更加简单易用,让我们的开发效率得到了极大提升。

2023-08-29 10:59:46 954

原创 React中的memo函数与Vue中的v-memo指令

在React中,memo函数是一个高阶组件,它接收一个组件作为参数,并返回一个新的组件。在React中,memo函数可以将一个纯函数组件转换成一个高效的组件,避免不必要的重渲染。而在Vue中,v-memo指令可以缓存组件的渲染结果,避免重复渲染相同的内容。当使用v-memo指令时,Vue会缓存组件的渲染结果,并在下一次渲染时直接使用缓存的结果。这样就可以避免重复渲染相同的内容,提高渲染效率。无论是React的memo函数还是Vue的v-memo指令,它们都可以帮助我们优化组件性能,提高应用的响应速度。

2023-08-29 10:33:58 125

原创 权限校验中的“双token”方案

注:refresh_token的过期时间一般比access_token的过期时间长一倍,甚至更长。

2023-08-29 09:24:50 1387 1

原创 使用事务隔离级别(RC,RR)解决脏读,不可重复读和幻读现象

不可重复读指的是在同一个事务中,多次读取同一数据,在这个过程中,其他事务修改了该数据,导致我们读取到了不同的结果。幻读指的是在同一个事务中,多次查询同一范围内的数据,在这个过程中,其他事务插入了新的数据,导致我们查询到了不同的结果。而RR级别则是指在一个事务中,读取的数据不会被其他事务修改,这样可以避免不可重复读和幻读的问题。在数据库中,脏读、不可重复读和幻读是一些常见的问题,这些问题可能会导致数据不一致性,给我们的应用带来很大的麻烦。但是,有一种解决这些问题的方法——事务隔离级别。

2023-08-28 19:17:26 748

原创 MySQL之脏读,不可重复读与幻读的概念及区别

幻读是指在同一个事务中,多次执行同一个查询语句时,由于其他事务的插入或删除,导致每次查询到的数据行数不同。这种情况下,如果另一个事务回滚了,那么读取到的数据就是无效的。不可重复读是指在同一个事务中,多次读取同一数据时,由于其他事务的修改,导致每次读取到的数据不同。这种情况下,如果需要保证数据的一致性,就需要使用锁机制来避免。总的来说,脏读、不可重复读和幻读都是MySQL中常见的问题,需要我们在使用时注意避免。MySQL是一种常用的关系型数据库管理系统,它的数据读取方式有三种:脏读、不可重复读和幻读。

2023-08-28 18:56:14 318

原创 React中的性能测试工具组件Profiler的基本使用

例如,我们可以在一个大型的React应用程序中使用Profiler组件来测试每个组件的性能,并找出潜在的性能瓶颈。在上面的例子中,我们定义了一个名为MyComponent的简单React组件,并在App组件中使用了Profiler组件来测试它的性能。总结一下,Profiler组件是React中一个非常有用的性能测试工具,它可以帮助我们找出React应用程序中的性能瓶颈,并进行优化。React中的性能测试工具组件Profiler是一个非常有用的工具,它可以帮助我们分析React应用程序的性能瓶颈。

2023-08-28 10:41:02 1327

原创 React中的flushSync与Vue中的nextTick的比较

在React中,当需要更新UI时,React会将更新操作放入一个队列中,然后异步地执行这些更新操作。和React类似,当需要更新UI时,Vue也会将更新操作放入一个队列中,然后异步地执行这些更新操作。但是有时候,我们需要在DOM更新之后立即执行一些操作,比如获取更新后的DOM元素。nextTick会在DOM更新之后执行回调函数,确保我们可以在更新后立即访问到最新的DOM元素。总的来说,flushSync和nextTick都是非常有用的工具,它们可以帮助我们更好地处理异步更新,提升应用的性能和用户体验。

2023-08-28 10:22:56 2156

原创 React钩子函数之useDeferredValue的基本使用

如果一个组件的某个值在短时间内多次改变,而这些改变并不会导致UI上的变化,那么使用useDeferredValue可以避免多余的渲染。如果一个组件的某个值在用户交互过程中频繁改变,那么使用useDeferredValue可以让UI更加平滑,不会出现卡顿或闪烁。我们可以使用useState来管理计数器的状态,并使用useDeferredValue来延迟更新计数器的值。总之,useDeferredValue是React 18中非常有用的一个钩子函数,它可以帮助我们优化渲染性能,并让UI更加流畅。

2023-08-27 21:25:28 1468 1

原创 React内置函数之startTransition与useTransition

通过使用startTransition函数,我们可以告诉React,这次状态的变化是一个次要的变化,不需要立即更新到用户界面上。这样一来,React就可以在适当的时机,选择最佳的时间点来进行状态的更新,以提供更好的用户体验。首先,我们需要确保在函数组件的顶层作用域内使用这两个函数。通过使用useTransition函数,我们可以告诉React,在状态变化的过程中,需要展示一个过渡效果给用户看。这两个函数的出现,旨在提供一种简单而强大的方式,来处理组件状态的变化,并在用户界面上提供平滑的过渡效果。

2023-08-27 21:23:51 1280

原创 React性能优化之memo缓存函数

此外,如果你的组件具有副作用(例如,它修改了全局状态),则使用memo可能会导致未预期的行为。为了解决这个问题,React提供了一个称为memo的功能,它可以缓存函数并避免不必要的重新渲染。memo是React中的一个高阶组件(HOC),它接收一个组件并返回一个新的组件。这个新组件具有与原始组件相同的功能,但具有一个额外的优化:如果组件的输入没有改变,则不会重新渲染。只有当你知道组件的输入不会改变时,才应该使用它。总之,memo是React中一个非常有用的功能,可以帮助你优化性能并避免不必要的重新渲染。

2023-08-27 18:48:13 1133

原创 React钩子函数之useEffect,useLayoutEffect与useInsertionEffect的区别

如果你需要处理布局相关的副作用,并且需要在渲染之前获取元素的尺寸、位置等信息,那么你应该使用useLayoutEffect;它们的语法非常相似,都是接受两个参数:一个是处理副作用的函数,另一个是依赖项数组。当依赖项数组中的值发生变化时,才会重新执行处理副作用的函数。useEffect用于处理副作用,例如发送网络请求、修改DOM等,而useLayoutEffect则用于处理布局相关的副作用,例如获取元素的尺寸、位置等。如果你的副作用处理很耗时,那么你应该使用useEffect,因为它不会阻塞组件的渲染过程。

2023-08-27 17:59:28 732

原创 Redis持久化机制之RDB,AOF与混合AOF

RDB是Redis默认的持久化方式,它会在指定的时间间隔内将内存中的数据写入磁盘中。RDB的优点是它非常快,因为它只需要将整个数据库的数据写入磁盘一次即可,而且生成的文件非常小,因为它只包含了数据库最后一次保存时的数据。缺点是如果Redis崩溃,那么最后一次保存后的所有数据都会丢失。如果你想兼顾两者的优点,并且可以容忍一定程度的复杂性,那么混合AOF是一个不错的选择。Redis是一款高性能的NoSQL数据库,它的速度非常快,同时也支持多种持久化机制,其中最常用的是RDB和AOF,还有一种混合AOF方式。

2023-08-27 13:04:11 169

原创 React钩子函数之forward结合useImperativeHandle钩子的基本使用

在上面的例子中,我们首先定义了一个Child组件,并使用forwardRef函数将其转换为可接收ref属性的组件。最后,在Parent组件中使用useRef钩子函数创建一个childRef引用,并将其传递给Child组件。这样父组件就可以直接调用子组件中的方法或属性,而不必通过props来传递。Parent组件需要调用Child组件中的方法,而不必通过props来传递。React钩子函数是React框架中非常重要的一部分,其中forward和useImperativeHandle是两个常用的钩子函数。

2023-08-27 09:01:00 663

原创 React钩子函数之forwardRef

在上面的示例中,我们创建了一个Input组件,并使用forwardRef将其暴露给父组件。然后,在父组件中,我们创建了一个ref,并将其传递给Input组件。如果我们想在父组件中访问子组件的DOM元素,我们需要将ref从父组件传递到子组件,并将其传递给DOM元素。forwardRef允许我们在父组件中创建一个ref,并将其传递给子组件。然后,在子组件中,我们可以将该ref传递给DOM元素,以便在父组件中访问它。然后,我们可以将其传递给组件的props,或者在组件内部使用this.refs访问它。

2023-08-27 07:59:42 1183

原创 React钩子函数之useRef的基本使用

然后,我们定义了一个handleClick函数,每次按钮被点击时,它会增加counterRef.current的值,并打印出新的值。在使用时,我们需要创建一个ref对象,并把它赋值给元素的ref属性或者一个变量。然后,我们可以通过ref.current来访问元素的值或者变量的值。在这个例子中,我们创建了一个inputRef对象,并把它赋值给了输入框的ref属性。然后,我们定义了一个handleClick函数,当按钮被点击时,它会打印出输入框的值。在这篇文章中,我们将会讨论useRef的基本使用。

2023-08-27 07:54:16 1181

原创 Typescript中的内置类型Partial,Parameters和ReturnType

在上面的例子中,我们分别使用了ReturnType类型来获取add函数和createObject函数的返回值类型。Parameters类型可以从一个函数类型中提取出其参数类型的元组类型。ReturnType类型可以从一个函数类型中提取出其返回值类型。在上面的例子中,我们分别使用了Parameters类型来获取add函数和concat函数的参数类型。这样,我们就可以在编写泛型函数时更加灵活地使用这些参数类型。在上面的例子中,我们使用了Partial类型来定义updateUser函数的参数。

2023-08-26 23:13:28 253

原创 代理模式之静态代理

抽象角色定义了真实角色和代理角色共同的接口,真实角色是需要被代理的对象,而代理角色则持有真实角色的引用,并在其基础上增加额外的功能。如果真实对象的接口稳定且不会发生变化,而且只需要对其进行简单的扩展和增强,那么静态代理是一个不错的选择。但如果真实对象的接口可能发生变化,或者需要对多个真实对象进行代理,那么动态代理可能更加适合。首先,由于代理对象需要手动编写,所以当真实对象的接口发生变化时,代理对象也需要相应地进行修改。在软件开发中,代理模式被广泛应用于各种场景,例如网络请求的代理、权限控制的代理等。

2023-08-26 16:26:20 892

原创 RabbitMQ之TTL+死信队列实现延迟队列

如果在10秒钟内没有消费者处理这个消息,它就会被标记为“过期”,并被发送到一个名为“dead_letter_queue”的死信队列中。接下来,什么是死信队列?当消息被标记为“过期”或无法被消费者处理时,它就会被发送到死信队列。这个过程可以用来处理那些无法被处理的消息,例如因为消费者不可用或由于某种原因而无法处理的消息。如果你正在使用RabbitMQ,并且需要实现延迟队列,那么TTL和死信队列是你需要使用的工具。如果消息在这个时间段内没有被消费者处理,那么它就会被标记为“过期”,并被发送到死信队列。

2023-08-12 02:27:53 808

原创 什么?200?跨域?

就是请求显示的状态都是正常的,但是在浏览器控制台却报了200的错误,后面问了GPT发现原来是后端网关和业务服务跨域设置不同,比如:请求头和请求原信息之类的。

2023-08-08 10:15:55 1096

原创 聊一聊雪花算法的整体架构设计

在分布式系统中,生成唯一的 ID 是非常重要的,因为它可以用来标识不同的实体,比如订单、用户等等。(1)ID 结构:雪花算法生成的 ID 是一个 64 位的整数,其中第 1 位是符号位,0 表示正数,1 表示负数;存储器的作用是防止重复生成已经存在的 ID。当生成器生成一个新的 ID 的时候,会先检查这个 ID 是否已经存在于存储器中,如果存在就重新生成一个新的 ID。当生成器生成一个新的 ID 的时候,会先调用检查接口检查这个 ID 是否已经存在于存储器中,如果不存在就调用添加接口添加这个新的 ID。

2023-08-06 19:31:30 158

原创 聊一聊关于前端语法 ?? 的那些事

当我们在编写前端代码时,语法是非常重要的。正确的语法可以确保我们的代码能够正常运行,并且易于维护和理解。在本文中,我们将探讨一些前端语法的问题,例如空值合并运算符(??空值合并运算符是ES2020引入的一个新特性,它可以用来处理变量为空或未定义的情况。在上面的代码中,如果username变量为空或未定义,那么变量将被设置为"Kkuil"。否则,它将被设置为username的值。除了空值合并运算符之外,还有其他一些前端语法问题需要注意。例如,JavaScript中的分号是可选的。

2023-08-06 11:21:50 103

原创 我的创作纪念日

我成为一名CSDN博主的机缘,是因为我在学习编程的过程中,遇到了很多问题和困惑,希望能够通过写博客的方式来记录和分享自己的学习过程,和更多的人交流学习。同时,我也希望通过写博客来提高自己的技能和知识水平,让自己更加专业和有竞争力。在我的CSDN博客上,我获得了很多读者的关注和正向的反馈,这让我感到非常开心和满足。通过写博客,我不仅提高了自己的技能和知识水平,还认识了很多志同道合的领域同行,和他们交流学习,相互促进,让我不断进步。在有限的精力下,我会尽量平衡写博客和工作学习,让两者相互促进,相得益彰。

2023-08-05 10:14:44 97

原创 为什么内部调用不会触发AOP?

【代码】为什么内部调用不会触发AOP?

2023-07-28 19:31:09 166

原创 TreeMap的底层实现

【代码】TreeMap的底层实现。

2023-07-28 17:56:07 233

原创 扒一扒HashMap的“底牌”

就是对当前HashMap是否需要扩容起决定性因素的一个因子,例如:现在HashMap的初始化长度为16,加载因子为0.75,这个时候扩容门槛(threshold)就是16*0.75 = 12,意思就是当HashMap中的节点(node)数量超过了12(不等于),将会触发扩容事件进行HashMap扩容。

2023-07-28 10:56:36 40

空空如也

空空如也

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

TA关注的人

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