- 博客(32)
- 收藏
- 关注
原创 接口性能提升
这时候,我们可以采取预取思想,提前把将来可能需要的数据计算好,放到缓存中,等需要的时候,去缓存取就行。不管你是synchronized加锁还是redis分布式锁,只需要在共享临界资源加锁即可,不涉及共享资源的,就不必要加锁。等系统B的接口处理完,通过事件回调通知,我们接口收到通知再进行对应的业务操作即可。如果你每次需要用到线程,都去创建,就会有增加一定的耗时,而线程池可以重复利用线程,避免不必要的耗时。把要查的数据,提前放好到缓存里面,需要时,直接查缓存,而避免去查数据库或者计算的过程。
2024-10-27 19:39:51
247
原创 IDEA开发工具使用技巧积累
第一步:打开idea工具,选中 File ——> New Projects Setup ——> Settings for New Projects。第三步:选中 Build Tools ——> Maven,让后就可以设置自己安转的maven和settings.xml。第二步:先设置下自动构建项目这个选项。
2024-10-22 15:27:51
879
原创 JAVA防止订单重复提交
你可以在订单表中针对某些关键字段(比如订单号、用户 ID)设置唯一索引,这样在订单重复提交时,数据库会直接报错,防止同一订单被重复写入。订单重复提交是许多系统都会面临的常见问题,尤其是在电商等高并发场景中,如果没有合适的防重策略,可能会导致同一订单被处理多次,进而引发库存、支付等严重问题。你提到的 3 毫秒内订单重复提交的问题,涉及到一个非常短的时间窗口,要解决这个问题,可以采取一些简单但有效的防重策略,下面我们逐步讲解几种常见的方案。接口幂等性是指同样的请求,无论调用多少次,最终的结果都是一致的。
2024-10-16 22:21:05
1187
原创 JAVA实现自定义注解
该注解功能最为强大,其所标注的方法用于编写包裹业务模块执行的代码,通知的第一个参数必须是 ProceedingJoinPoint 类型。,@Pointcut切点表达式非常丰富,可以将 方法(method)、类(class)、接口(interface)、包(package) 等作为切入点,非常灵活,常用的有@annotation、@within、execution等方式,上面的示例使用的是@annotation方式,意思就是说被Spring扫描到方法上带有@annotation中的注解 就会执行切面通知。
2024-10-12 11:06:22
6241
原创 一文带你了解K8S
再打个形象的比喻,在同一个Pod里的几个Docker服务/程序,好像被部署在同一台机器上,可以通过localhost互相访问,并且可以共用Pod里的存储资源(这里是指Docker可以挂载Pod内的数据卷,数据卷的概念,后文会详细讲述,暂时理解为“需要手动mount的磁盘”)。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes是用于自动部署、扩展和管理容器化应用程序的开源系统,简单理解就是一个编排容器的工具。
2024-09-27 16:20:44
688
原创 云原生架构模式
服务化架构的典型模式是微服务和小服务(Mini Service)模式,其中小服务可以看做是一组关系非常密切的服务的组合,这组服务会共享数据,小服务模式通常适用于非常大型的软件系统,避免接口的颗粒度太细而导致过多的调用损耗(特别是服务间调用和数据一致性处理)和治理复杂度。)都由 Mesh进程完成,即使在业务代码的制品中并没有使用这些三方软件包;·构建开放式接口:在 EDA 下,事件的提供者并不用关心有哪些订阅者,不像服务调用的场景 – 数据的产生者需要知道数据的消费者在哪里并调用它,因此保持了接口的开放性;
2024-09-20 16:00:11
1466
原创 云原生架构原则
可观测性与监控、业务探活、APM 等系统提供的能力不同,前者是在云这样的分布式系统中,主动通过日志、链路跟踪和度量等手段,让一次 APP 点击背后的多次服务调用的耗时、返回值和参数都清晰可见,甚至可以下钻到每次三方软件调用、SQL 请求、节点拓扑、网络响应等,这样的能力可以使运维、开发和业务人员实时掌握软件运行情况,并结合多个维度的数据指标,获得前所未有的关联分析能力,不断对业务健康度和用户体验进行数字化衡量和持续优化。此外,由于在进程级实现了模块的分离,每个接口都可以单独升级,从而提升了整体的迭代效率。
2024-09-20 14:30:28
844
原创 并发容器:都有哪些“坑”需要我们填?
通过下图你可以看到,读写是可以并行的,遍历操作一直都是基于原array执行,而写操作则是基于新array进行。Map接口的两个实现是ConcurrentHashMap和ConcurrentSkipListMap,它们从应用的角度来看,主要区别在于ConcurrentHashMap的key是无序的,而ConcurrentSkipListMap的key是有序的。而在实际工作中,你不单要清楚每种容器的特性,还要能选对容器,这才是关键,至于每种容器的用法,用的时候看一下API说明就可以了,这些容器的使用都不难。
2024-09-13 16:19:12
820
原创 搞懂redis
先来看一个常见的缓存使用方式:读请求来了,先查下缓存,缓存有值命中,就直接返回;缓存没命中,就去查数据库,然后把数据库的值更新到缓存,再返回。读取缓存缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。通俗点说,读请求访问时,缓存和数据库都没有某个值,这样就会导致每次对这个值的查询请求都会穿透到数据库,这就是缓存穿透。
2024-09-11 23:42:31
1030
原创 虚拟机与宿主机网络
桥接、NAT和host-only三种网络连接方式的区别一、不同网络连接方式对网络网络影响简介:二、三种网络连接方式详细介绍:我本机宿主机使用win10系统,IP地址为:192.168.1.117。1、桥接方式桥接方式下,虚拟机和宿主机处于同一网段,真实存在于网络中,像是一台真实的主机。虚拟机和宿主机彼此互通,且网络中的其他主机也可以互通。就像是连接在hub中的主机一样。获取的IP地址网段为:192.168.1.X,实际获取的为192.168.1.220。优点:可以轻松实现上网,同网段中的主机
2021-12-02 10:53:33
4179
原创 快速失败(fail-fast)和安全失败(fail-safe)
java中快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。 原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/
2021-12-01 18:29:09
210
原创 MySQL知识积累
mysql数据库分表及实现项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多。以至于查询书读变慢,而且由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈。当出现这种情况时,我们可以考虑分表,即将单个数据库表进行拆分,拆分成多个数据表,然后用户访问的时候,根据一定的算法,让用户访问不同的表,这样数据分散到多个数据表中,减少了单个数据表的访问压力。提升了数据库访问性能。我们可以进行简单的设想:现在有一个表products存储产品信息,现在有100万用户在线访问,就要进行至少10
2021-11-07 16:23:17
125
原创 Java-JDK动态代理(AOP)使用及实现原理分析
第一章:代理的介绍介绍:我们需要掌握的程度动态代理(理解) 基于反射机制掌握的程度:1.什么是动态代理?2.动态代理能够做什么?后面我们在用Spirng和Mybatis的时候,要理解怎么使用的.
2021-03-28 22:50:20
177
原创 maven下载不了jar包解决方法
maven下载不了jar包解决方法配置阿里的URL依然下载不了<id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url> 阿里不再支持http下载,只支持https。因此,先将mav
2020-12-12 09:22:27
671
1
原创 Git
1.svn和git的对比SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就郁闷了。Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完
2020-11-08 23:56:49
139
原创 spring Boot实现定时任务的四种方法
spring Boot实现定时任务的四种方法1.Timer2.使用ScheduledExecutorService3.Spring TaskTimer:这是java自带的java.util.Timer类,这个类允许你调度一个任务,使用这个方式可以让你的程序按照某一个频度执行,但不能在指定时间执行。ScheduledExecutorService:也是jdk自带的一个类;是基于线程池设计的定时任务类,每个调度都会分配到线程池中的一个线程去执行,也就是说,任务是并发的,互不影响。Spring Tas
2020-11-05 17:04:47
606
原创 Object static final
Object static final1.Object中equals对两个对象的地址进行比较,String重写了equals放法比较字符串内容相同,2.如果两个对象根据equals方法是相等的,那么调用二者各自的hashCode方法必须产生同一个integer值。3.static关键字static 关键子修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。被static关键字修饰的变量等,是随着类的加载而加载,并且只加载一次。静态变量被所有的对象所共享,在内存
2020-11-02 20:32:04
248
1
原创 java基本类型
java基本数据类型二级目录三级目录java有八种基本数据类型,其中六种数据类型(四种整数型,两种浮点型),一种字符数据类型,一种布尔类型byte:1个字节 -127~128short:两个字节 负2的15次方到2的15次方减一int:4个字节 负2的31次方到2的31次方减一long:8个字节 负2的63次方到2的63次方减一float:4个字节double:8个字节( float和double的范围是由指数的位数来决定的。float的指数位有8位,而double的指数位有
2020-11-02 20:23:02
101
原创 @GetMapping,@RequestMapping,@PostMapping
@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。该注解将HTTP Get 映射到 特定的处理方法上。同理PostMapping也是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。特别说明:@RequestMapping如果没有指定请求方式,将接收Get、Post、Head、Options等所有的请求方式。...
2020-11-02 10:11:40
97
原创 数据结构
@数据结构数组数组是一种线性表数据结构,数组可以在内存中连续存储多个元素,在内存分配上也是连续的,数组中的元素通过数组下标开始访问,数组下标从0开始优点:按索引查询快:时间复杂度o(1)按照索引遍历数组方便缺点:数组大小固定后就无法改变大小数组只能存储一种数据类型添加删除速度慢 ,删除数据时间复杂度为o(n)注:线性表(Linear List)就是数据排成像一条线一样的结构。每个线性表上的数据最多只有两个方向。除了数组,链表、队列、栈也是线性表结构。线性表如下图引用:https://ww
2020-10-29 23:40:03
246
原创 MyBatis中#{}和${}
在MyBatis中有两种动态传递参数的方式#{},${}#{}:占位符KaTeX parse error: Expected 'EOF', got '#' at position 9: {}:拼接符 #̲{}是预编译,{}是字符串拼接变量替换后#{}会自动加上单引号,${}不会加上单引号#{}能防止sql注入 ${}不能防止sql注入#{} 和 KaTeX parse error: Expected 'EOF', got '#' at position 20: …实例:假设传入参数为 1
2020-10-28 23:52:02
3921
转载 commons-lang3
maven使用commons-lang3工具包1.maven引入jar包org.apache.commonscommons-lang33.92.API使用字符串判断字符串 不为空和nullStringUtils.isNotEmpty(xxxx)移除两边空字符串StringUtils.trim(xxxx)移除空格StringUtils.deleteWhitespace(xxxx)移除指定开头字符StringUtils.removeStart(“www.foxwho.com”,“
2020-10-24 20:17:50
1645
原创 springBoot单元测试
**springBoot单元测试**1.在pom包中添加spring-boot-starter-test包引用org.springframework.bootspring-boot-starter-testtest2.代码开发package com.test;import junit.framework.TestCase;import lombok.extern.slf4j.Slf4j;import org.junit.Test;import org.junit.runne
2020-10-24 20:02:39
126
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人