- 博客(84)
- 收藏
- 关注
原创 【千万级数据导出excel】如何实现分钟级高效导出及防止OOM?
对于百万,甚至千万以上量级的数据导出,需要注意:①内存方面:通常jvm内存都是有上限的,数据量太大一次性读到堆内存容易oom②效率方面:数据量太大如果还是用单线程,往往会很慢为了解决上述问题,我们可以考虑将数据分批次读入内存,然后利用多线程实现边读边写,从而提高导出效率本次示例导出的文件是导出到具体文件夹下面,如果需要实现B端下载功能,可以试着结合一些文件压缩技术,将文件打成压缩包,实现下载功能。
2025-03-28 23:40:51
661
原创 记Redis集群挂掉后,尝试重启集群但失败问题
Redis 集群的 数据持久化 和 元数据自治 机制在保障数据安全的同时,也要求开发者在重建集群时严格清理旧环境。通过清除所有持久化文件,本质是触发了 Redis 的 冷启动(Cold Start) 流程,使节点以全新状态加入集群。理解这一机制后,可更灵活应对类似问题。
2025-03-18 15:44:26
752
原创 【微服务日志收集①】使用FileBeat+Logstash+ES搭建ELK日志系统
注意:默认打开的是output.elasticsearch,输入到es,这部分配置要注释掉!我们需要现将日志收集到Logstash对数据进行过滤、分析和统一格式等。当然也可以用Logstash直接收集,但是Logstash服务过重,如果在每个应用上都部署一个Logstash,会给应用服务器增加很大的负担。因此,通常会在应用服务器上,部署轻量级的Filebeat组件。Filebeat可以持续稳定的收集简单数据,比如log日志,统一发给logstash进行收集后,再经过处理存到ES。
2025-03-17 21:33:53
955
原创 Centos7使用docker搭建redis集群
命令搭建 Redis 集群,核心原因在于 Docker Swarm 提供了容器编排能力,而 Redis 集群的分布式特性需要依赖 Swarm 的底层架构实现多节点协同和管理。会创建 Swarm 集群的管理节点(Manager),负责调度服务、维护集群状态,并为后续加入的 Worker 节点提供通信基础,同时也提供了动态扩缩容能力等能力。关键参数:–advertise-addr 声明管理节点的通信地址,确保其他节点可访问36。注意:最好在服务器上找个专门的文件夹存放这些yml文件,免得后面找不到了。
2025-03-15 20:52:19
462
原创 centos7安装时采用的默认分区(比如:/dev/sda3的对应挂载点是/),如何对系统扩容?
实现扩容,无需重建LVM或格式化分区。通过以上步骤可安全扩展非LVM分区的容量,且不破坏原有数据。版本兼容性问题,无法正确解析分区信息。且存储重要数据,可通过 。工具因系统语言环境或。
2025-03-15 16:49:12
504
原创 Spring为什么要用三级缓存解决循环依赖?
循环依赖的场景有很多,本文只是通过 Debug ,来了解到循环依赖和 AOP 之间的关系,以及了解到为什么要用三级缓存
2025-03-08 11:19:01
1012
原创 cms垃圾收集器中存在由于引用删除导致的漏标问题?
CMS垃圾收集器确实存在因引用删除导致的漏标风险,其根本原因在于增量更新机制未覆盖引用删除场景,且重新标记阶段无法回溯已删除的存活路径。这一设计是CMS在低停顿与回收精度之间的权衡结果,需结合应用场景评估其适用性。
2025-02-27 16:19:47
269
原创 利用枚举实现策略模式
演示的demo 是以拉取短视频平台up主数据为背景,调用三方接口可能返回诸如:被限流、拉取数据失败、拉取数据次数超过每日上限等状态,而对于每种状态如果用 if else进行分支逻辑处理,一旦分支逻辑过多,代码会显得冗余且可读性较差,所以采用策略者模式进行代码优化。
2023-04-20 16:42:02
2039
2
原创 JVM垃圾收集算法与垃圾收集器(Serial、ParNew、CMS) —JVM系列(四)
目前大多数垃圾收集器都是采用的分代收集算法,该算法其实算是一种思想:根据对象存活周期的不同而将内存分为年轻代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法。比如在年轻代中,每次收集都会有绝大多数对象死去(没有被GC root所引用),可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集;而老年代中的对象存活几率比较高,并且没有额外的空间对其进行分配担保,所以选择标记清除算法或者标记整理算法进行垃圾回收;需要注意,通常来讲标记清除算法或标记整理算法会比复制算法慢上许多!
2023-04-09 18:24:40
1952
3
原创 与ChatGPT浅聊Pulsar
最后,Pulsar还提供了多种保证交付的机制,如At-least-once和Exactly-once,以确保每条消息都被正确地传递和处理。Pulsar的底层原理是基于分布式日志存储的架构,它采用了类似于Kafka的思想,将消息存储在一个可水平扩展的、可持久化的分布式存储引擎中,同时支持多租户。在发布/订阅模式下,消息发布者将消息发布到一个主题中,订阅者可以订阅该主题,并接收到所有发布到该主题的消息。在队列模式下,消息发送者发送消息到一个队列中,每个消费者从队列中获取消息,消费者之间实现负载均衡。
2023-04-03 09:40:15
6517
1
原创 Spring 6 IOC容器加载过程与核心方法refresh源码浅析
本篇只对主线核心逻辑进行梳理分析,本篇以AnnotationConfigApplicationContext容器为例进行切入分析【Spring版本为: v6.0.2】
2023-04-01 19:46:53
3238
4
原创 Spring 6 源码编译教程分享~
Spring Boot 3 RELEASE版本于 2022年11月24日 正式发布,此次Spring Boot里程碑的升级也要求了最低JDK 17 和 Spring Framework 6 ,其核心框架的 Spring 也在 2022年11月16日 迎来了从 5.3.x 到 6.0.x 重大版本升级,借着这个机会,写一篇关于 Spring 6 源码编译的教程分享。
2023-04-01 02:04:14
3927
3
原创 centos 7下安装Docker(附根据操作系统日志排查问题思路)
1、Docker 要求 CentOS 系统的内核版本高于 3.10,通过uname -r命令查看你当前的内核版本 2、使用root权限登录 Centos。确保 yum 包更新到最新。6、可以查看所有仓库中所有docker版本,并选择特定版本安装
2023-03-28 17:24:22
3150
原创 windows的cmd界面下使用jps命令提示:‘jps‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
使用jps提示:‘jps’ 不是内部或外部命令,也不是可运行的程序或批处理文件,但是使用java -version却正常。
2023-03-11 21:58:05
5482
3
原创 解决PageHelper循环依赖:com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration
PageHelper循环依赖解决com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration
2022-07-15 15:42:40
7767
6
原创 Mac使用brew优雅切换golang版本,丝滑
使用brew切换golang版本先升级brewbrew update解绑当前版本绑定brew unlink go🔍搜索可安装的go版本列表> brew search gogo@1.13 go@1.14 go@1.15 go@1.16 go@1.17 go@1.18选择想切换的版本,如这里安装go@1.18brew install go@1.18绑定版本关系brew link go@1.18🆕刷新下配置文件source .bash_p
2022-04-21 11:56:18
8633
原创 Java获取指定年份每一个周的日期范围
需求场景:简述项目相关背景:接到项目组需求,给定年份,返回对应该年份所有周的日期范围代码:思路:一步一步来,从第1周到最后1周,最后返回list,列表的大小即是该年份的总周数public class YearWeeksUtil { public static final String START_TIME = "startTime"; public static final String END_TIME = "endTime"; /** * 获取某年某周
2022-03-30 18:54:42
2751
1
原创 Java对象和Map互相转换
/** * 将对象装换为map * * @param bean * @return */ public static <T> Map<String, Object> beanToMap(T bean) { Map<String, Object> map = Maps.newHashMap(); if (bean != null) { BeanMap bean.
2022-01-05 19:14:33
1618
1
原创 Redisson读写锁
在高并发场景下如果只用一把互斥锁会出现哪些问题?同一时间只能有一个请求占用,如果是大量的并发上来,性能是会急剧下降的,所有的请求都得加锁比如如果数据没有进行任何修改的话,是不需要加锁的。如果读数据的请求还没读完,这个时候来了一个写请求,这个时候是不能写数据的,不然数据就不正确了,要等到前面读锁全部释放掉以后,写请求才能执行,所以需要给这个读请求加一个标识(读锁),让写请求知道,这个时候是不能修改数据的,不然数据就不一致了。如果已经有人在写数据了,再来一个请求写数据,也是不允许的,这样也会导致数据的不
2021-10-08 15:35:46
2769
1
原创 简析jvm的调优方案
调优时机:heap 内存(老年代)持续上涨达到设置的最大内存值;Full GC 次数频繁;GC 停顿时间过长(超过1秒);应用出现OutOfMemory 等内存异常;应用中有使用本地缓存且占用大量内存空间;系统吞吐量与响应性能不高或下降。调优原则:多数的Java应用不需要在服务器上进行JVM优化;多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合);减少创建对象的数量;减少使用全局变量和大对象;
2021-09-28 08:52:21
1171
原创 ThreadLocal原理分析与使用场景
什么是ThreadLocal?ThreadLocal是线程本地存储,在每个线程中都创建了一个ThreadLocalMap对象,每个线程可以访问自己内部ThreadLocalMap对象内的value。ThreadLocal的本质就是一个内部的静态的map,key是当前线程的句柄,value是需要保持的值。由于是内部静态map,不提供遍历和查询的接口,每个线程只能获取自己线程的value。这样,就线程安全了,又提供了数据共享的能力。示例:public class ConnectionManager {
2021-09-27 18:08:08
1819
原创 Java代码实现循环队列
循环队列结构Java代码实现循环队列// 基于数组实现一个循环链表public class CircleArrayQueue<T> { // 定义数组用于存放数据 private T[] arr; private int head; // 记录队列头 private int tail; // 记录队列尾 private int size; // 数组大小 // 循环链表初始化 public CircleArrayQueue(
2021-09-26 21:23:02
2327
原创 CopyOnWriteArrayList适用场景与原理分析
CopyOnWriteArrayList 简介CopyOnWrite机制又称为写时复制:public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}在很多应用场景中,读操作可能会远远大于写操作。由于读操作根本不会修改原有的数据,因此如果每次读取都进行加锁操作,其实是一种资源浪费。我们应该允许多个线程同时访问 List
2021-09-26 16:20:37
3292
原创 Java代码实现栈结构
栈结构Java代码实现栈结构// 利用数组实现一个栈结构public class ArrayStack<T> { // 声明数组 private T[] arr = (T[])new Object[1]; // 栈元素初始数量 private int num = 0; public ArrayStack(int size){ this.arr = (T[])new Object[size]; } // 入栈(压
2021-09-26 15:51:33
1477
原创 Java代码实现ArrayList
ArrayList结构图Java代码实现ArrayList注意点:注意数组下标越界问题public class MyArrayList<E> { // 数组长度 private int size; // 数组已存数据的大小 private int index; // 声明数组 private E dadaArr[]; // 构造函数完成初始化 public MyArrayList(int size){ t
2021-09-26 11:22:24
1563
原创 力扣:9. 回文数
题目:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例 2:输入:x = -121输出:false解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。解法:这题和第7题整数反转类似,比较简单,不多赘述class Solution { public boolean isPalindrome(in
2021-09-25 15:57:16
411
原创 力扣:7. 整数反转
题目:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。示例 1:输入:x = -123输出:-321解法:class Solution { public int reverse(int x) { // 注意int类型反转后的数值可能超出int的表示范围,所以结果用long来存
2021-09-25 15:50:33
375
原创 力扣:1. 两数之和
题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。解法一: 暴力解法双循环遍历,时间复杂度为O(n2)
2021-09-25 15:32:47
365
原创 Java代码实现双向链表
双向链表结构图Java代码实现双向链表public class DoubleLinkedList { Node head; // 头节点 Node tail; // 尾节点 DoubleLinkedList(){ head = null; tail = null; } // 从头部插入 public void insertHead(int data){ Node newNode = new
2021-09-25 10:15:19
1375
原创 力扣:2. 两数相加
描述给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} *
2021-09-23 10:29:43
359
原创 synchronized和Lock的区别
原始构成:synchronized是关键字属于JVM层面,monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象只有在同步块或者方法中才能调用wait/notify)lock是类,是api层面的锁使用方法:synchronized不需要手动释放锁,当synchronized代码执行完以后系统会自动让线程释放对锁的占用,ReentrantLock则需要手动释放锁,不然可能会导致死锁现象。是否可中断synchronized
2021-07-25 12:18:59
996
原创 搭建springboot项目与Java爬虫抓取网页数据
这是jdk版本不一致问题导致的,所以需要做以下检查:检查你的pom.xml首先检查你的模块JDK依赖。确保它是1.8;到File —> Project Structure —> Project Settings —> Project 中调整你的JDK版本,并保持一致将路径添加到存储的位置。1.8jdk1.8.0_45.jdk应用更改现在,去Structure ->Modules将ModuleSDK更改为1.8https://blog.youkuaiyun.com/shilian
2021-03-14 20:50:51
24999
4
原创 建议使用 Bcrypt加密算法 代替 MD5/SHA1
前言为了保障用户的敏感数据安全,通常都会对其进行加密,然后将加密后的数据存入数据库中,例如用户密码,在用户进行登录的时候,将其输入的密码与数据库中存放的密文进行比较,以验证用户密码是否正确。BCrypt加密: BCrypt是一种跨平台的文件加密工具。 一种加盐的单向Hash,可以简单理解为它内部自己实现了随机加盐处理,不可逆的加密算法,同一种明文(plaintext),每次加密后的密文都不一样,而且不可反向破解生成明文,破解难度很大,BCrypt生成的密文是60位。MD5加密: 是不加盐的单向Ha
2021-03-11 15:28:57
23726
1
原创 MySQL数据类型选择
前言在MySQL中,选择正确的数据类型,对于性能至关重要。 一般应从以下两个方面考量:确定合适的大类型:数值、字符串、时间、二进制;确定具体的类型:有无符号、取值范围、变长定长等。在MySQL数据类型设置方面,尽量采用更小的数据类型,因为它们占用的存储空间更小,通常有更好的性能,花费更少的硬件资源。并且,尽量把字段定义为NOT NULL,避免使用NULL。1.字符串类型类型大小用途CHAR0-255字节定长字符串,char(n)当插入的字符串实际长度不足n时,插
2021-03-01 16:03:23
20534
5
原创 http,tcp,udp协议深度分析(硬核推荐)
文章目录前言一、网络分层原理1.现实世界中的复杂网络环境2.OSI七层协议和TCP/IP协议 第一层:物理层 第二层:数据链路层 第三层:网络层 第四层:传输层 第五层:会话层 第六层:表示层 第七层:应用层3. 一个HTTP请求的分层解析流程二、HTTP协议1.基本概念超文本传输协议(HyperText Transfer Protocol,HTTP) :什么是无状态协议?什么是有状态协议?2.HTTP报文布局请求报文格式:请求行报文格式:15种HTTP请求方法:HTTP请求头信息对照表:响应报文格式:响应
2021-02-19 15:49:54
22638
9
转载 OAuth2实现单点登录SSO
本文转载自:https://www.cnblogs.com/cjsblog/p/10548022.htmlOAuth2实现单点登录SSO1. 前言技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题,“一看就会,一做就错”。网上关于实现SSO的文章一大堆,但是当你真的照着写的时候就会发现根本不是那么回事儿,简直让人抓狂,尤其是对于我这样的菜鸟。几经曲折,终于搞定了,决定记录下来,以便后续查看。先来看一下效果2. 准备2.1. 单点登录最常见的例子是,我...
2021-01-04 18:02:58
2528
原创 Maven子模块如何引用父模块的jar包
情况1:如果父pom中使用如下方式引入依赖,则子模块pom会自动使用父模块pom中的jar包;<dependencies> ....</dependencies>情况2:如果父pom使用如下方式,则子模块pom不会自动使用父pom中的jar包,如果子模块需要用到父模块的jar包,需要在自己pom中加入<dependency> 并且指定<groupId>和<artifactId>,正常情况下可以不用指定<version>(子p
2020-12-28 22:55:04
4768
转载 linux内核调优tcp_max_syn_backlog和somaxconn的区别
The behavior of the backlog argument on TCP sockets changed with Linux 2.2. Now it specifies the queue length for completely established sockets waiting to be accepted, instead of the number of incomplete connection requests. The maximum length o
2020-12-14 13:28:08
4358
原创 JS,SQL,Java这些语言是否区分大小写
文章目录前言前端语言:后端语言:数据库语言:总结前言总结了一些语言语法对大小写是否敏感,也算是复习这些常识知识啦。前端语言:html 对大小写不敏感 ,不区分大小写; css 对大小写不敏感 ,不区分大小写; JS 对大小写非常敏感 ,区分大小写(变量名,函数,关键字都要区分大小写);TypeScript 对大小写敏感 ,区分大小写; 后端语言: C语言 对大小写敏感 ,区分大写和小写字符; C++ 对大小写敏感 ,区分大写和小写字符;Java 对大小写敏感 ,区分大写和小写字符
2020-11-25 10:36:15
4792
3
原创 JVM中对象创建与内存分配机制—JVM系列(三)
前言:学习本章前先阅读之前我写的关于JVM系列的前两篇文章:JVM类加载机制深入浅出分析 -- JVM系列(1)JVM内存模型 -- JVM系列(2)
2020-11-12 10:52:38
22433
14
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人