- 博客(240)
- 资源 (10)
- 收藏
- 关注

原创 java---基本多线程问题汇总
先说java多线程1、创建多线程的方式有几种?1、 继承Thread 方式2、实现Runnable接口的方式3、实现Callable接口的方式2、使用的方式的优缺点1、继承Thread的方式对于Thread的方式,它的优点就是简单易操作,但是它的缺点是单继承2、实现Runnable 接口它解决了Thread单继承的缺点,并且能够实现多个接口,适合多个相同的程序代码的线程去处理同一个资源,但是它不能拿到线程的返回值。3、实现Callable 使用...
2022-05-01 19:40:37
737

原创 java_nignx学习
nignx用的最多应该就是反向代理了吧(将内网的地址代理到外网)1 反向代理将内部服务器代理外部请求server{ listen 80; server_name localhost; client_max_body_size 1024M; location /{ proxy_pass http://localhost:8080; proxy_set_header Host $host:$server_port; }}2 负载均衡负载均衡配置
2021-05-22 17:34:37
142

原创 java多线程总结
1 、创建多线程的方式有几种第一种是继承Thread 方式第二种是实现了Runnable接口的方式第三种 是实现Callable接口的方式2 三种的优缺点是什么对于Thread的方式 它的有点是简单易操作 但是它缺点就是单继承对于实现的Runnable 接口,它放好解决了Thread的缺点并且能够实现多个接口。但是它不能拿到线程的返回值Callable接口太复杂3 线程的状态1 (new)初始状态2 (runnable)运行状态3 (blocked)阻塞状态.
2021-05-22 17:16:26
330

原创 使用docker 部署集群
一、 获取镜像 获取最新的镜像docker pull redis如果是获取特定版本的镜像可以使用docker pull redis:5.0.5 二、 创建redis容器这里使用的host网络方式去创建容器 创建了三个容器docker create --name redis-node1 --net host -v /data/redis-data/node1:/data redis:5.0.5 --cluster-enable yes --cluster-config...
2021-04-20 21:01:20
1036
原创 Controller代码变得简洁
在ResponseBodyAdvice实现类的debug发现,只有String类型的selectedConverterType参数值是org.springframework.http.converter.StringHttpMessageConverter,而其他数据类型的值是org.springframework.http.converter.json.MappingJackson2HttpMesageConverter。beforeBodyWrite:对response进行具体的处理。
2025-01-18 19:18:36
406
原创 代码优化方案
继承链 是认知负荷天花板,你改AdminController 的代码,发现它继承了UserController ,后者又继承了GuestController ,还不止这些--改着改着,突然冒出来一个SuperuserController ,让你意识到一处改动可能引发蝴蝶效应。分层架构只有在需要明确扩展点时才有意义,否则,这些层次带来的额外认知负荷远远高于它能提供的好处。即如果判断条件很复杂的情况下,最好的方式是引入清晰的中间变量。丰富语言功能肯定不是坏事,但前提这些功能要彼此关联。
2025-01-05 15:35:02
169
原创 Mysql数据实时同步到Es上
同步双写实一种数据同步策略,它指的是在主数据库(如mysql) 上进行数据修改操作,同时将这些修改同步写入到ES 中,这种策略旨在确保两个数据库之间的数据一致性,并且优化系统的读写性能。
2025-01-05 14:55:54
1122
原创 SpringBoot的6种API请求参数读取方式
用来加载URL中?之后的参数比如: 这个请求/user?name=didspace 就可以如下面这样,使用@RequestParam 来加载URL 中的name 参数。
2025-01-05 11:46:09
407
原创 日志治理的实践之路
日志,作为系统运行的忠实记录者,不仅是问题追踪的利器,更是性能调优的指南针。通过深入分析日志,我们可以洞悉系统的每一个细节,从而快速定位问题、优化性能。同时,日志也可以作为数据分析和决策的重要依据。研发流程中,如何使用好日志,还是存在如下难点:① 为了排查问题,我们通常需要记录大量的日志,如何关联客户端当次请求的所有日志,确保信息的完整性和连贯性。② 日志记录对象过大可能导致频繁GC(垃圾回收),进而造成服务器不稳定。③核心日志的发送已经实现异步处理,但过多的发送仍会占用CPU 、内存等资源。
2025-01-01 15:15:56
899
原创 Java中StopWatch的使用详解
通过start 与stop 方法分别记录开始时间与结束时间,其中在记录结束时间的时候,会维护一个链表类型的taskList 属性,从而时该类可记录多个任务,最后的输出页仅仅是对之前的记录信息做了一个统一的归纳输出。stopWatch 是org.springframework.util 包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比。如果改用stopWatch 实现的一个示例。
2024-12-29 16:14:22
868
原创 使用Pipeline模式解耦电商保险等复杂业务
Pipeline 模式是责任链模式的一个变种,首先从责任链模式说起,看过Spring 源码的同学大概都看到过在核心Http 请求处理类DispatchServlet 中,在获取handler 的时候,具体获取到的起始是一个被包装过的HandlerExecutionChainHandlerExecutionChain 中除了handler 以外,还包含一堆实现了HandlerInterceptor 接口的拦截器。
2024-12-29 15:42:27
682
原创 架构师应如何考虑重构
第一次做某件事的时候只管去做,第二次做类似的事情的时候会反感,但无论如何还是可以去做,第三次再做类似的事情,你应该去重构,正如老话说的:事不过三,三则重构。让有经验的同学把知识传递给编写代码的同学,从而给予改进的灵感(老同学对业务更加熟悉,也更了解业务的变化点有助于作出合理的设计)③ 当然也要取舍,对于简单影响小的可以立即重构,如果比较复杂的有风险的可以先做几路,完成当前任务后或者另找时间重构。① 重写比重构还容易(到这种程度重构的风险非常高)增加策略类,用于一些更复杂的场景。③降低修改代码的风险。
2024-12-22 16:07:34
612
原创 三方接口调用方案设计
1、API密钥生成:为每个三方应用生成唯一的API 密钥对(AK /SK), 其中AK 用于标识应用,SK应用进行签名和加密。
2024-12-22 15:04:38
978
原创 软件工程师需要干什么
图中小人形象的元素,被称为元素,角色可以是人,也可以是其他系统,系统的功能可能会很复杂,所以,一张用例图可能只包含其中一小部分功能,这些功能被一个矩形框框起来,这个矩形框被称为用例的边界。组件图描述组件之间的静态关系,主要是依赖关系,如果你想要描述组件之间的动态调用关系,可以使用组件时序图,以组件作为参考者,描述组件之间的消息调用关系。在详细设计阶段,主要输出的就是类图和类的时序图,指导最终的代码开发,如果某个类方法内部有比较复杂的逻辑,那么可以将这个方法的逻辑用活动图进行描述。
2024-11-30 16:51:22
636
原创 每天100w次登录请求,8G内存该如何设置JVM参数?
任何新的业务系统在上线以前都需要去估算服务器配置和JVM的内存参数,这个容量与资源并不仅仅是系统架构师的随意估算的,需要根据系统所在业务场景去估算,推断出一个来系统运行的模型,评估JVM 性能和GC 频率等等指标① 计算业务系统每秒钟创建的对象会占用多大的内存空间,然后计算集群下的每个系统每秒的内存占用空间(对象创建速度)② 设置一个机器配置,估算新生代的空间,比较不同新生代大小之下,多久触发一次MinorGC。
2024-11-24 15:43:29
702
原创 第三方支付系统架构设计
第三方支付是指具备一定实力和信誉保障,并获得国家颁发运营拍照的独立机构,采用和各大银行签约的方式,通过与银行相关接口对接而促成交易的网络支付的模式。我们熟悉的微信支付和支付宝都属于第三方支付工具,第三方支付工具随着移动设备+互联网的 大范围普及而迅速占领日常生活中各种交易场景,逐渐取代了大部分的中小额现金交易第四方支付实际上是聚合了多个第三方支付,合作银行的渠道接口,为商户提供一站式的支付解决方案:账户是支付机构内部为其服务对象(用户、商户、银行等) 创建的物理记录(类似于表格),这些记录包含了对象的关键信
2024-11-03 12:43:39
825
原创 Linux 日志常用命令
上面说了 tail 和grep 的简单的功能,但是可能会遇到一个问题就是,就是使用tail 实时打印的日志内容太多,grep 又是历史的文件内容。如果需要再文件中搜索某个关键字,可以按下 / 键,然后 输入关键字, 按下N 键可以挑战到下一个匹配项,按下 N 键 可以跳转到上一个匹配项。其中 grep -m 1 表示多个匹配,只取到第一个匹配到的(数据几就取前几次匹配到的截止)并且是匹配最新的结果。表示查看最后1000行并实时监听文件的更新,其中输出的内容 是包含了 目标字符串 的日志内容。
2024-04-21 14:30:52
1056
原创 Redis 常用命令以及结构
Redis 的hash 类型的底层实现是一个非常优化的数据结构,它会根据实际情况选择使用紧凑的压缩列表(zipList) 或者 散列表(hashtable) 作为底层 实现。
2024-04-05 16:20:13
944
原创 Java 使用对应arthas 调试程序
对应的代码执行逻辑是 随机生成了一个 0-1 之间的随机数,然后与0.5 进行判断大小,如果小于0.5 就 抛出对应的异常。这里 -n 表示监听五次后退出, --skipJDKMethod false 表示忽略对应的jdk 函数操作耗时打印。选择对应的函数之后,右击选择 函数 arthas command ,即可选择对应的命令。(就是说有时候我记录对应的参数,然后重新以这些参数执行并对应的函数)① 抓取对应函数的耗时结构,然后分析对应的代码优化代码。查看对应的函数的执行成功次数,失败次数,总次数。
2023-12-03 14:24:14
654
原创 java--Consumer的使用
Consumer 是一个函数式接口,它位于java.util.function 包中,它定义了一个名为accept 的抽象方法,该方法接受一个参数并且不返回任何结果。Consumer 就等价于Function 只不过它将apply 换成了accept ,并且Consumer 不会返回任何结果。
2023-10-22 14:47:10
786
原创 SpringCloud整合Sa-token
1、目的之前写项目一致都使用的是 SpringSecurity ,但总是感觉SpringSecurity用起来比较繁琐,所以就打算使用sa-token 进行权限校验以及 登录验证,角色校验,集成比较简单.2、设计思路整个项目 使用SpringCloud GateWay 进行网关,统一将服务注册到nacos 上去 即 mall_auth : 提供用户登录的功能 ...
2023-05-22 19:18:20
668
1
原创 leetCode刷题---最大回文子串
描述: 给定一个字符串s ,找到s 中最长的回文子串, 你可以假设 s的最大长度为1000。以某个元素为中心,分别计算偶数长度的回文最大长度和奇数长度的回文最大长度。
2023-04-16 17:15:55
215
原创 KMP 算法简单实现
这里中心思想就是当两个字符不相同的时候,父串的元素不要动,移动子串,而移动到的位置为 nextList[j] ,因为 nextList[j] 除去 j位置的前面的字符串中相同前缀和后缀的长度。这里相当于,利用了nextList 的含义,把子串移动到了与父串相同的元素,然后再次匹配,这样就减少了父串的回溯。比如 ababd 这里的 nextList[4] 的长度为 2 ,因为 ab = ab。那么如何求nextList 数组呢?可以看这篇文章 写的很好。
2023-04-16 15:56:27
146
原创 SpringCloud GateWay与Nacos使用
网关就相当于一个内网与外网的出入口,起着 安全、验证的功能,如果没有网关,那么如果需要实现验证的功能,除非SpringCloud GateWay 作为微服务的网关,起着如下作用① 作为所有API接口服务请求的接入点② 作为所有后端业务服务的聚合点,所有业务服务都可以在这里被调用③ 实现安全、验证、路由、过滤、流控等策略,进行一些必要的中介处理④ 统一管理: 提供配置管理工具,对所有API服务的调用生命周期和相应的中介策略进行统一的管理(当然 由于多了一次中间转发,所以 QPS 就会下降)
2023-04-10 13:35:26
7111
1
原创 SpringBoot 异步与线程池的关系
SpringBoot 中基本上存在三种异步的关系,分别为1、 使用 @Async,标记在方法上2、使用parallelStream 遍历处理数组3、 自定义线程池注入这里进行分类讨论然后比较不同之处/***/@Slf4j@Bean// 创建对应的线程池log.warn("当前线程池已满,队列容量: {}", queueCapacity);// 这里可以发送邮件进行通知});// 执行初始化当我们需要使用线程池配合的使用的,注入线程池属性。
2023-04-02 14:49:18
1465
原创 leetCode 刷题日记----最长公共前缀
以第一个为遍历基准,然后逐个循环strs数组中的值,如果两者不同,将第一个字符串截取到与当前相同的部分子串,然后接着循环,最后保存的就是公共的子串。编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串。
2022-11-26 19:38:36
619
原创 leetcode 刷题日记----罗马数字转整数
通常情况下,罗马数字中小的数字在大的数字的右边。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。字符大的在字符小的右边则需要减去字符小所对应的值,其余的情况就直接加上。I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
2022-11-26 19:18:02
227
原创 leetcode刷题日记----回文数
描述:给你一个整数 x ,如果 x 是一个回文整数,返回 true;否则,返回 false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
2022-11-26 18:49:50
287
原创 leetCode 刷题日记----两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
2022-11-26 17:38:24
355
原创 Vue 如何关闭esLint
答: 在 src 同级创建一个vue.config.js 文件,然后把下面的代码复制进去,然后重新运行eslint 就关闭了。
2022-10-08 17:33:33
307
原创 Spring实现CAS登录
首选简单说明Session session 就是一种保存上下文信息的机制,它是面向用户的,每一个SessionId 对应着一个用户,并保存在服务端中。session 主要以cookie 或者URL 重写为基础来实现的,默认使用cookie 来实现,系统会创建一个为JSessionID 的变量输出到cookie 中 JSessionID 是存储于浏览器内存中,并不是写到硬盘上的,如果我们把浏览器的cookie 禁止, 则web 服务器会采用URL 重写的方式传递SessionId 。我们就
2022-08-07 16:17:19
1652
原创 java 处理大文件
前几天在开发过程中遇到一个需求: 读取一个大约5G的csv文件内容,将其转化为对象然后存储到redis中, 想着直接开大内存直接load 进入到内存中就行了,结果可想而知,5G的文件 ,Xmx 开到10G都没有解决,直接out of Memory 异常 这种处理大文件很容易造成 内存不够的问题 这种 500M的文件,堆内存一般会占用2.5G ,那么如果你去读一个5G的文件,那么内存直接起飞,所以这种不建议使用 这种因为是有按照一行行读取到内存当中, 所以耗时肯定增
2022-07-02 18:07:09
5455
原创 Spring实现日志注解
1、目的写项目的时候经常会通过日志来排查原因,一种是通过log4j将日志收集出来,然后使用elk进行数据的分类与统计,这种是针对大量的请求日志进行记录。另一种就是通过自定义注解的方式写入数据库,这种是针对特定接口来处理,将重要的操作信息记录到数据库中。这篇博客就是说的第二种方式。2、思路首先,应该使用自定义注解来标记哪些接口需要记录操作日志。然后, 使用切面来统一拦截参数和返回的结果,并将信息返回到数据库。3、实现过程 4、实现效果5、总结...
2022-05-22 15:35:11
2521
spring上传文件
2020-12-17
aspectj-1.9.4的压缩包.rar
2020-04-22
课程设计-学生信息管理系统
2020-01-07
C#--数据库课设.rar
2020-01-02
java课设--图书管理系统代码.rar
2020-01-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人