自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring 注入bean的几种方式

Spring框架支持多种方式进行Bean的注入,以满足不同场景的需求。@Autowired@Resource以上是一些常见的Spring Bean注入方式,选择适当的方式取决于具体的业务需求和设计考虑。构造器注入和Setter注入是最常见的两种方式,而其他方式在一些特殊情况下可能更为适用。

2024-03-11 15:42:56 932

原创 java8 多层分组 请提供示例代码

方法的嵌套使用允许我们按照不同的属性进行多层次的分组。Java 8 中的多层分组通常使用。列表按照城市和年龄进行了多层分组。

2024-02-28 11:22:29 215

原创 Stream中map和flatmap的区别 举例

map和flatMap都是 Java Stream API 中用于对元素进行转换的操作,但它们在处理元素的方式上有一些重要的区别。map。

2024-02-28 11:00:09 486

原创 什么是内部迭代 java.util.stream.Stream#forEach

使用了内部迭代,它会遍历集合中的每个元素,并对每个元素执行指定的操作。这样的内部迭代使得代码更为简洁,而且可以利用 Stream API 提供的丰富的操作(如过滤、映射等)来处理集合中的元素。内部迭代是指对集合(如列表、数组等)的遍历过程被隐藏在集合类或其他类的内部,由底层库或语言自动处理迭代过程,而不需要显式地编写循环来进行遍历。是一个内部迭代的例子,它是Java Stream API 提供的方法之一。Stream API 允许你以声明性的方式对集合进行操作,而无需显式迭代每个元素。

2024-02-28 10:58:16 150

原创 java fori 和 forEach区别

循环可能会更繁琐,因为它隐藏了索引的细节。因此,在需要直接操作索引的情况下,选择。循环遍历数组,并将每个元素乘以其索引值。这涉及到对索引进行显式操作,因此。是两种不同的循环语法,用于遍历集合或数组。当你需要显式控制索引并对索引进行某些操作时,使用。取决于你的具体需求和代码的可读性。则更适合需要显式控制索引的情况。更适合于简单的迭代场景,而。在这个例子中,我们使用。循环更适合这种情况。

2024-02-28 10:57:40 193

原创 使用 Interceptor+ThreadLocal 实现对登陆用户信息做线程间隔离,集群环境有什么问题,怎么处理

在集群环境下,多个服务节点之间共享负载,每个请求可能被不同的节点处理,因此ThreadLocal中存储的数据在不同节点之间无法共享。在集群环境下,可以在服务网关层处理用户信息,确保在请求被路由到具体的服务节点之前,用户信息已经被正确设置。这样,即使请求跨越多个节点,用户信息也能够在服务之间传递。在使用ThreadLocal时,一定要注意在集群环境下可能产生的问题,以及采取适当的措施来解决这些问题。分布式上下文可以是一个全局的上下文对象,可以在请求处理的整个生命周期中保存和获取信息。

2023-12-26 05:14:26 431

原创 java中的序列化目的是什么, Serializable接口 和 json区别

在Java中,序列化的目的是将对象转换为字节序列,以便可以在网络上传输或将其保存到持久存储介质(如硬盘)上。序列化允许将对象的状态保存为字节流,然后在需要的时候将其还原为原始对象。对于Java对象,可以使用JSON库(如Jackson、Gson等)将对象转换为JSON格式的字符串,或将JSON字符串反序列化为Java对象。JSON是一种轻量级的数据交换格式,不同于Java中的序列化,它是一种文本格式,并且具有更广泛的应用范围。接口,类的实例可以被转换为字节序列,从而可以进行持久化或网络传输。

2023-12-21 13:09:52 456

原创 logn什么意思

logn” 通常是对以 2 为底的对数(logarithm)的简写,表示 log base 2。在计算机科学和算法分析中,经常使用 logn 来描述算法的时间复杂度。logn 的增长速度较慢,因此算法的运行时间随着输入规模的增加而以较慢的速度增长,这通常是一个好的特性。具体来说,logn 表示对数函数,即如果一个算法的时间复杂度为 O(logn),意味着算法的运行时间与输入规模的对数成正比。这种情况通常在二分搜索等分而治之(divide and conquer)算法中出现。

2023-12-17 07:58:08 1218

原创 Redis知识:Redis的五种数据结构 分别使用场景 案例

Redis缓存_张维鹏的博客-CSDN博客。

2023-12-15 21:34:53 84

原创 基于springboot2 redis 实现 可以做排行榜应用,取TOP N操作

定义了向 Sorted Set 中添加元素、根据 score 范围获取元素、获取前N个元素的接口。通过访问这些接口,可以实现对 Redis 中存储的 Sorted Set 的操作。在Spring Boot 2和Redis中使用Sorted Set(有序集合)可以实现诸如排行榜、TOP N操作、延时任务和范围查找等功能。方法用于获取 Sorted Set 中的前N个元素(按 score 从高到低)。方法用于向 Sorted Set 中添加元素,进行 Sorted Set 类型的操作。

2023-12-15 16:31:54 79

原创 基于springboot2 redis set实现,交集、并集、差集的操作,计算共同喜好,全部的喜好,自己独有的喜好等功能

在Spring Boot 2和Redis中使用Set结构,可以实现全局去重、判断元素是否在Set中、以及集合运算(交集、并集、差集)等功能。定义了向 Set 中添加元素、判断元素是否在 Set 中以及集合运算的接口。通过访问这些接口,可以实现对 Redis 中存储的 Set 的操作。方法分别用于计算两个 Set 的交集、并集和差集。如果 Redis 没有密码,可以不配置。方法用于判断元素是否在 Set 中,方法用于向 Set 中添加元素,进行 Set 类型的操作。

2023-12-15 16:28:34 94

原创 基于springboot2 redis 实现 list 的应用场景非常多,比如微博的关注列表的一系列操作,代码实现

在Spring Boot 2和Redis中使用List结构可以实现很多应用场景,比如微博的关注列表。在pom.xml中添加Spring Boot对Redis的支持:</</</在(或如果Redis没有密码,可以不配置。上述代码中,使用进行List类型的操作,followUser方法用于进行关注操作,和方法用于获取关注列表和粉丝列表。上述代码中,使用和定义了关注用户、获取关注列表和获取粉丝列表的接口。通过访问这些接口,可以实现对Redis中存储的关注列表的操作。

2023-12-15 16:23:03 36

原创 基于springboot2 redis 实现用户的信息修改 Hash适合用于存储对象,因为一个对象的各个属性,正好对应一个hash结构的各个field,可以方便地操作对象中的某个字段。

当使用Spring Boot 2和Redis来存储用户信息时,使用Hash结构确实是一个合适的选择。每个用户对应一个Hash,Hash的field可以表示用户的各个属性。定义了存储用户、获取用户和更新用户邮箱的接口。通过访问这些接口,可以实现对Redis中存储的用户信息的操作。确保Redis服务器已启动,并根据实际情况修改配置信息和代码中的key,就可以运行这个简单的示例了。如果Redis没有密码,可以不配置。进行Hash类型的操作,方法用于存储用户信息,方法用于获取用户信息,方法用于更新用户邮箱。

2023-12-15 16:19:29 57

原创 基于springboot2 redis 实现 String是最简单的数据类型,一般用于复杂的计数功能的缓存:粉丝数 增加和减少 ,代码实现

在Spring Boot 2中使用Redis实现String数据类型的缓存,特别是用于复杂计数功能,比如粉丝数的增加和减少,可以使用。确保Redis服务器已启动,并根据实际情况修改配置信息和代码中的key,就可以运行这个简单的示例了。定义了增加、减少和获取粉丝数的接口。通过访问这些接口,可以实现对Redis中存储的粉丝数进行操作。获取String类型的操作对象,然后可以使用。如果Redis没有密码,可以不配置。进行递增和递减操作,同时通过。进行Redis操作,通过。

2023-12-15 16:16:57 19

原创 项目性能优化

(4)声明式注解@Transactional控制加的粒度不要过大(可以缩小粒度抽出来函数或用java8函数式编程灵活解决问题),大事务可能会引发死锁,回滚时间长,并发情况下数据库连接池占满,锁等待,接口超时,db主从延迟等。如果接口容易出现故障,可以考虑使用熔断技术来避免故障的蔓延。使用静态资源服务器,如果接口返回的内容包含大量的静态资源,可以考虑使用独立的静态资源服务器来加速资源的加载。使用异步处理技术,如果接口需要执行大量的耗时任务,可以考虑使用异步处理的方式来避免阻塞接口的响应。

2023-12-15 10:24:05 13

原创 arthas

JVM诊断调优工具Arthas 教程到实战(CPU飙高,线程死锁,请求回放,方法监控)_哔哩哔哩_bilibili。

2023-12-15 10:04:50 19

原创 我一般开发环境用debug,过滤调试,只断点自己的请求 怎么实现

在开发环境中,使用调试工具进行调试是很常见的做法。如果你想只断点自己的请求,可以通过在调试器中设置条件断点或使用条件断点的方式来实现。

2023-12-14 21:06:51 37

原创 什么是aop,解决什么问题,使用场景是什么,基于springboot2 给出案例代码,使用有什么注意点

AOP(Aspect-Oriented Programming)是一种编程范式,它的主要目的是提供一种切面(Aspect)的概念,通过在代码中定义横切关注点(cross-cutting concerns),将这些关注点与主要业务逻辑分离。AOP是通过代理来实现的,因此在同一个类中调用方法不会触发切面。AOP的使用可能会对性能产生一定的影响,尤其是在切面逻辑比较复杂的情况下。在Spring框架中,AOP是通过代理实现的,通常使用动态代理或者字节码生成来创建代理对象,实现横切逻辑。接口来指定切面的执行顺序。

2023-12-14 20:02:39 71

原创 读已提交 有什么问题,举个例子 事务的隔离级别 事务的传播行为

这个过程展示了在"读已提交"隔离级别下,同一个事务在不同时间点读取相同的数据可能得到不同的结果。事务的传播行为是指在一个事务范围内调用另一个事务时,新的事务如何与现有事务进行交互的规则。事务的隔离级别是指在并发执行的情况下,一个事务对其他事务的影响程度。在"读已提交"隔离级别下,一个事务在读取某个数据后,如果另一个事务修改了这个数据并且提交了,那么第一个事务再次读取该数据时会得到不同的结果,从而发生了不可重复读。例如,在一个方法内调用的其他方法可能需要和当前事务共享一个事务,或者需要独立开启一个新的事务。

2023-12-14 18:09:39 164

原创 Java语言 有哪些特点

Java语言是一种高级编程语言,具有以下特点:面向对象:Java语言是一种纯面向对象的编程语言,它支持面向对象编程的三个基本特性:封装、继承和多态。跨平台:Java语言的程序可以在不同的平台上运行,这得益于Java虚拟机(JVM)的存在,JVM将Java代码解释为机器码,从而使得Java程序可以在不同平台上运行。安全性高:Java语言具有很高的安全性,它使用了一系列安全机制,如类加载器、字节码校验器、安全管理器等来保证程序的安全性。

2023-12-14 18:09:13 26

原创 举个代码例子,解释java 内存分配,堆 栈 方法区

Java 的内存分配主要包括堆(Heap)、栈(Stack)、方法区(Method Area)等,每个区域有不同的作用和生命周期。需要注意的是,方法区和堆是被所有线程共享的,而栈是每个线程独有的。此外,栈上的局部变量的生命周期随着方法的执行而结束,而堆上的对象则由垃圾回收器负责管理其生命周期。存放类的结构信息,如类的成员变量、方法信息等。在上面的例子中,静态变量、静态方法的信息都存放在方法区。关键字创建的对象实例都存放在堆上。在上面的例子中,字符串常量。存放在栈上,方法调用的信息也存放在栈上。

2023-12-14 18:08:17 25

原创 java juc Semaphore CountDownLatch CyclicBarrier

在集群环境下,Java中的JUC(Java Util Concurrency)工具类仍然能够用于控制并发。JUC提供了一系列的工具和框架,用于处理并发编程中的各种问题,包括同步、线程池、原子操作、并发集合等。LockSemaphore请注意,虽然JUC工具类可以在一定程度上帮助你处理并发问题,但在分布式环境中,涉及到更多的问题,例如分布式锁、一致性、事务性等,可能需要使用分布式系统的解决方案,例如ZooKeeper、Redisson等。

2023-12-14 17:50:05 35

原创 java使用队列,实现排队买车票效果

你可以根据实际需求扩展和调整这个例子,例如添加更多的购票信息、处理购票逻辑等。方法中,演示了模拟排队买票的过程,以及处理买票请求的过程。方法用于处理队首的买票请求。方法用于将买票请求添加到队列,接口的实现类来模拟队列,例如。在Java中,你可以使用。来实现一个简单的队列。

2023-12-14 14:26:08 79

原创 java使用stack 栈 使用示例

你可以使用两个栈实现一个简单的前进后退效果。一个栈用于存储前进的页面,另一个栈用于存储后退的页面。方法中,演示了如何使用这个方法来反转字符串并输出结果。在实际应用中,你可以根据需要调整方法,例如处理空字符串或返回。方法中,演示了如何使用这个类来模拟浏览器的前进和后退操作。你可以根据实际需求进行扩展和调整。将字符串中的每个字符压入栈,然后从栈中弹出字符以实现字符串反转。方法接受一个字符串作为输入,使用。,分别用于存储前进和后退的页面。你可以使用 Java 中的。方法用于访问新页面,

2023-12-14 14:24:05 19

原创 java continue; break; return; 在for循环中区别 和 使用场景 请提供示例代码

提前退出方法(也导致循环提前结束)。具体使用取决于代码的具体需求和实现逻辑。循环中有不同的作用。跳过当前迭代的代码,

2023-12-14 11:01:45 61

原创 java 数组 集合 使用技巧

在实际开发中,根据具体业务需求,你可能会使用到更多的方法和操作。在Java中,数组是一种常见的数据结构,它允许你在单个变量名下存储多个相同类型的元素。在实际开发中,根据具体业务需求,你可能会使用到更多的方法和操作。这些是 Java 数组的一些基本用法,根据具体需求,你可能会用到更多高级的数组操作。包下的双向链表实现,它提供了对列表中元素的快速插入和删除操作。是线程不安全的,如果在多线程环境中使用,应该考虑使用线程安全的替代类,例如。包下的动态数组实现,它提供了一种动态调整大小的数组结构。

2023-12-14 10:14:22 29

原创 拦截器 aop 过滤器 的区别和使用场景

拦截器(Interceptor)、AOP(Aspect-Oriented Programming)和过滤器(Filter)都是在软件开发中用于处理横切关注点的概念,但它们在实现方式、使用场景和功能上有一些区别。在实际应用中,选择使用哪种机制取决于具体的需求和设计目标。通常,在Web应用中,拦截器和过滤器用于处理HTTP请求和响应,而AOP则用于解耦业务逻辑中的横切关注点。

2023-12-14 08:16:09 31

原创 @RabbitHandler 怎么监听不同的消息体

在 Spring Boot 2 中,配置 RabbitMQ 的序列化通常涉及到消息的序列化和反序列化,确保消息在发送和接收过程中正确地进行序列化和反序列化操作。请注意,确保你的消息对象能够正确地被 Jackson 库序列化和反序列化,通常需要提供默认的构造函数和符合 JavaBean 规范的 getter 和 setter 方法。检查你的应用程序使用的 Spring Boot、Spring AMQP 和 RabbitMQ 客户端的版本,确保它们是最新的。注解监听一个队列,并处理两种不同类型的消息是可能的。

2023-12-13 22:26:51 305

原创 设计一个订单支付超时处理方案

设计一个订单支付超时处理方案 https://v.douyin.com/i8j4uCoL/

2023-12-12 20:51:55 43

原创 VO/DTO/PO

在基于Spring Boot 2的Java Web项目中,VO(View Object)、BO(Business Object)、DTO(Data Transfer Object)和POJO(Plain Old Java Object)是常见的设计模式,用于在不同层之间传递数据和组织代码结构。假设有一个简单的用户管理系统,包含前端展示、业务逻辑和持久化存储。我们可以使用上述概念来设计数据传输和业务逻辑。这样的设计使得各层之间的职责清晰,降低了耦合度,提高了代码的可维护性和可读性。

2023-12-12 16:24:10 20

原创 秒杀库存预热,先从数据库中扣除一部分库存以redisson信号量的形式存储在redis中 基于springboot2 请提供示例代码

在秒杀开始前,从数据库中扣除一部分库存,并将这部分库存信息存储到 Redis 中。这样可以在 Redis 中保留一部分库存供秒杀使用。在秒杀开始时,使用 Redisson 信号量进行库存控制。Redisson 信号量是一种分布式锁的实现,可以用于控制并发访问。方法尝试获取信号量,如果成功表示有库存可以秒杀,否则表示秒杀失败。成功的用户可以执行秒杀逻辑,失败的用户得到秒杀失败的提示。方法,该方法从数据库中扣除一部分库存,并将剩余库存存储到 Redis 的信号量中。在秒杀开始时,用户请求通过。

2023-12-10 11:33:54 71

原创 使用 `UPDATE` 语句时,不进行查询而直接更新是存在并发问题的,并且可能导致超卖问题。在多线程或多用户并发情况下,两个或多个线程可能同时执行 `UPDATE` 语句,而不会互相感知对方的操作,从

Power谭的抖音 - 抖音version是好,但是意味着同一时刻只能有一个人能购买商品,假设库存有1000,这个时候1000个用户同时购买,应该都成功,但是通过version就会导致只有1个成功,999个失败,因为版本不一致用stock很不好,假如第三条线程进来把数据改回了最初的值,实际上此stock已经非彼stock了。虽然这个秒杀场景可以,但一旦涉及可以修改回最初值的业务,这个做法就不安全了 还是version最好这个 SQL 语句是在更新t_sku表中的stock。

2023-12-10 10:53:26 205

原创 你知道java序列化为什么要实现Serializable接口 并指定serialVersionUlD值吗?

在 Java 中,序列化是将对象的状态转换为字节流的过程,而反序列化则是从字节流中恢复对象的状态的过程。为了支持对象的序列化和反序列化,类需要实现接口。这个接口是一个标记接口,没有包含任何方法,主要是用来表示一个类的实例可以被序列化。为什么要实现接口?接口是一个标记接口,用来表示类的实例可以被序列化。当一个类实现了接口,表明该类的实例可以被转换为字节流,从而可以在网络上传输、保存到文件等场景中使用。

2023-12-09 21:40:23 57

原创 spring 两个service相互引用,会有循环依赖吗

当两个 Service 相互引用时,Spring 容器会先创建 Service 的代理对象,而不是直接创建真实的对象。然后,当第一个 Service 需要使用第二个 Service 的实例时,实际上获取到的是代理对象,而不是真实的对象。需要注意的是,虽然 Spring 能够解决相互引用的问题,但在设计时还是建议尽量避免循环依赖,因为它可能会增加代码的复杂性和理解难度。在这个例子中,当容器初始化 ServiceA 时,它会创建 ServiceA 的代理对象,并在代理对象中包含了对 ServiceB 的引用。

2023-12-09 21:39:50 735

原创 mybatis 批量插入数据 有哪些方式,请提供示例代码

在 MyBatis 中,有多种方式可以进行批量插入数据。<foreach>MyBatis 提供了<foreach>标签,用于遍历集合,并将集合中的元素拼接到 SQL 语句中。这个标签可以用于批量插入。</</MyBatis 提供了接口,可以通过手动执行批量操作。注意:在使用时,需要手动调用commit()来提交事务。选择哪种方式取决于个人或团队的偏好和项目的具体需求。一般而言,使用<foreach>标签是较为常见和简便的方式,而则提供了更为灵活的控制。

2023-12-09 18:45:26 45

原创 系统分层次 基于springboot2 相对在controller和service加一层比如biz层比较好,controller做薄,biz做业务聚合,service做原子操作。 请提供示例代码

太小的比如只有一点点业务,那还是三层。四层就是service只做自己的单表业务原子能力。比如我的这张表的插入逻辑。biz层可能聚合了好几个service封装一个业务。controller只做校验,很薄弱。目前几个中大型项目跑了几年稳定。开发便捷。在 Spring Boot 2 中,如果你想引入一个业务聚合层(例如Biz层)来处理业务聚合逻辑,可以在 Controller、Service 和 Biz 之间进行适当的分层。在这个示例中,UserBiz被引入为一个业务聚合层,负责处理业务聚合逻辑。

2023-12-09 18:44:57 194

原创 springboot2 在Java项目中你们是如何配置时间格式响应给前端呢

在 Spring Boot 2 项目中配置时间格式,通常可以通过配置文件(application.properties 或 application.yml)或者通过 Java 代码进行配置。

2023-12-09 18:00:09 49

原创 springboot2 在Java项目中你们是如何配置时间格式响应给前端呢

在 Spring Boot 2 项目中配置时间格式,通常可以通过配置文件(application.properties 或 application.yml)或者通过 Java 代码进行配置。

2023-12-09 17:35:02 60

原创 统一响应结果vo 全局异常处理器 统一返回

springboot2 项目 统一响应结果vo 返回类3个基础参数,一个code,一个msg,一个data,data就用来做具体返回的内容,用泛型,想返回啥就返回啥;在 Spring Boot 项目中,你可以创建一个统一的响应结果类(VO),其中包含了三个基础参数:code、msg、data。你可以使用泛型来表示data字段的类型,以便实现灵活的数据返回。在这个示例中,类包含了一个带有泛型的data字段,用于表示具体的返回内容。类中提供了两个静态方法success和error。

2023-12-09 17:23:10 78

原创 什么是git pr

Git PR” 指的是 Git 中的 Pull Request,是一种协作开发的工作流程。Pull Request 提供了一种将代码从一个分支(通常是开发者个人的分支)合并到另一个分支(通常是主分支)的机制,并在合并前进行代码审查和讨论的平台。开发者首先会 Fork 项目的主仓库,从而在自己的 GitHub 账号下复制一份仓库。在自己 Fork 的仓库中,开发者创建一个新的分支,通常是用于解决某个问题或实现某个功能。在新创建的分支中进行代码的修改、添加、删除等操作,并将更改提交到这个分支。

2023-12-09 11:26:56 958

空空如也

空空如也

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

TA关注的人

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