- 博客(44)
- 收藏
- 关注
原创 ELK日志收集
目前,各个微服务系统的日志都保存在各自指定的目录中,如果这些微服务部署在不同的服务器上,那么日志文件也是分散在各自的服务器上。分散的日志不利于我们快速通过日志定位问题,我们可以借助ELK来收集各个微服务系统的日志并集中展示。ELK即Elasticsearch、Logstash和Kibana首字母缩写。Elasticsearch用于存储日志信息,Logstash用于收集日志,Kibana用于图形化展示。
2024-10-24 18:11:42 741
原创 Java8中Stream、Function、Opotions特性使用案例
所有数据都基于类,其中包含了 userId、userName、course、score 等字段,下面是如何使用Options、 Stream 、Function来处理 UserInfo 对象列表的一些示例所有数据都基于类,其中包含了 userId、userName、course、score 等字段,下面是如何使用 Java Stream API 来处理 UserInfo 对象列表的一些示例。
2024-10-24 17:41:06 801
原创 ConcurrentHashMap图文源码解析
同HashMap一样,Segment包含一个HashEntry数组,数组中的每一个HashEntry既是一个键值对,也是一个链表的头节点。Size方法的目的是统计ConcurrentHashMap的总元素数量, 自然需要把各个Segment内部的元素数量汇总起来。数组中的每一个Entry元素,又是一个链表的头节点。但是,如果在统计Segment元素数量的过程中,已统计过的Segment瞬间插入新的元素,这时候该怎么办呢?Segment的写入是需要上锁的,因此对同一Segment的并发写入会被阻塞。
2024-09-11 16:28:51 1124
原创 MySQL索引以及创建索引的注意事项
二叉查找树(BST):解决了排序的基本问题,但是由于无法保证平衡,可能退化为链表;平衡二叉树(AVL):通过旋转解决了平衡的问题,但是旋转操作效率太低;红黑树:通过舍弃严格的平衡和引入红黑节点,解决了AVL旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO次数太多;B树:通过将二叉树改为多路平衡查找树,解决了树过高的问题;B+树:在B树的基础上,将非叶节点改造为不存储数据的纯索引节点,进一步降低了树的高度;此外将叶节点使用指针连接成链表,范围查询更加高效。
2024-09-10 17:11:05 1399
原创 ELK在Linux上部署教程
以为是 /usr/share/elasticsearch/data/nodes目录权限不够,其实是宿主机上的/echola/elasticsearch/data目录权限不足造成。操作系统默认的mmap计数太低可能导致内存不足,我们可以使用下面这条命令来增加内存。在该路径下创建logstash-echola.conf配置文件(没有vim命令,可以使用。然后访问IP地址:http://192.168.2.203:5601/切换到/bin目录,安装json_lines插件,然后退出。在ellk目录下创建。
2024-09-05 17:41:51 802
原创 EasyExcel单行或多行表头的简单Excel导出
一般Excel不需要复杂的数据格式导出,只是在表头上略有区别,下面展示单行和多行表头Excel导出
2024-09-04 11:38:27 1389
原创 HashMap图文源码解析
反观长度16或者其他2的幂,Length-1的值是所有二进制位全为1,这种情况下,index的结果等同于HashCode后几位的值。可以为null,但是不能为可变对象,如果是可变对象,对象中的属性改变,那么Hash也要进行相应的改变,导致下次五大找到已存在的Map中的数据。但是,因为HashMap的长度是有限的,当插入的Entry越来越多时,再完美的Hash函数也难免会出现index冲突的情况。第二步:我们查看的是Next节点Entry1,Entry1的Key是apple,正是我们要找的结果。
2024-08-30 16:28:47 694
原创 SQL慢查询优化方式
MYSQL优化一般从SQL语句开始优化,再分析索引,即使有了良好的索引,糟糕的查询语句也可能导致性能问题优化查询语句可以帮助数据库更有效地利用现有的资源,减少不必要的开销。
2024-08-28 18:18:01 3725
原创 Java使用EasyExcel导出图片(原比例大小)到Excel中
为了方便客户在业务报告时,可以使用数据分析图片,从而更清晰准确地展示数据趋势,因此需要将图片不进行压缩,原比例尺寸大小导出
2024-08-26 16:23:34 1240
原创 Spring系列之Spring Cache缓存注解的使用
Spring Cache 是 Spring Framework 提供的一个用于操作缓存的抽象层,它简化了在 Spring 应用程序中集成和使用缓存的过程Spring Cache 不直接实现任何缓存技术,而是定义了一套标准接口和注解,使得开发人员可以轻松地切换底层缓存实现,而无需修改业务逻辑代码是不是有点似懂非懂,那么使用一个🌰来了解@Service@Autowire@Autowired//查询用户if(user!= null) {
2024-08-23 12:32:19 1884
原创 Java中自定义注解的使用
以【记录操作日志】为例,一般在开发中为了记录用户操作,当系统出现问题时,可以追溯日志所提供详细的错误信息,帮助开发者快速定位问题的原因最简单的方法:在每个方法中增加日志信息打印代码,来记录操作日志,但是这样重复代码也很多,也不易扩展,而且易出错使用自定义注解就会方便很多,减少不必要的重复代码,减少非业务代码的侵入性,如果需要扩展操作用户的信息以及IP就会很方便,易于扩展和维护@interface在需要使用自定义注解的地方使用该注解@LogOperation("新增")// 方法实现。
2024-08-22 14:33:27 1427
原创 Redis持久化(RDB、AOF、混合持久化)
Redis 需要持久化主要是为了保证数据的安全性和持久性,防止数据丢失Redis 持久化功能默认是开启的,这样做的目的也是为了保证程序的稳定性,防止缓存雪崩、缓存击穿等以及保证数据不丢失。若要手动关闭 Redis 持久化,需要将 RDB、AOF 和混合持久化全部关闭才行,并且关闭之后需要重启 Redis 服务才能生效。
2024-08-21 14:59:54 1573
原创 数据结构与算法——前缀树
(Trie,有时也称为字典树或关键词树)是一种有序树结构,用于存储具有相同前缀的字符串集合。它非常适合,并且可以显著提高查询速度。
2024-08-19 11:17:39 1178
原创 Redis中Big Key该如何解决?
Redis的Big Key会给Redis带来的意想不到的危害,需要监控、及时发现和处理Big Key。在开发过程中需要选用适当的Redis数据结构开发业务,尽量避免big key。
2024-08-16 18:21:34 1688
原创 MySQL查询分组内最新的第一条数据
由于MySQL 5不支持窗口函数,因此不能使用PARTITION()、ROW_NUMBER(),获取每个班级中最新注册的学号人员信息也就是从 user_info 学生表中获取每个 class_id 班级的最新一条记录。
2024-08-15 17:57:52 582
原创 Java并发编程(八)——异步编程之CompletableFuture
CompletableFuture是一种用于处理异步任务和并发编程的强大工具类,支持异步任务的创建、组合、变换和错误处理,提供了丰富的 API 来简化并发编程,提供了丰富的链式调用方式,支持非阻塞的异步编程模式。
2024-08-14 17:19:33 1754
原创 Java并发编程(七)—ThreadLocal的原理及应用详解
ThreadLocal 是 Java 中的一种特殊机制,它为每个线程提供了一个独立的变量副本,主要用于解决多线程环境下的线程安全问题通过 ThreadLocal,每个线程可以拥有自己的变量副本,从而避免了线程间的数据竞争和同步问题。
2024-08-12 18:21:44 1506
原创 Java并发编程(五)—ReetrantLock详解及应用
synchronized:适用于大多数基本的同步需求,提供了简洁的语法,自动释放锁,适合于简单的同步场景。ReentrantLock:适用于需要更高级特性的场景,如公平锁、超时等待等,需要显式管理锁的获取和释放。如果竞争比较激烈,推荐ReentrantLock去实现,不存在锁升级概念。而synchronized是存在锁升级概念的,如果升级到重量级锁,是不存在锁降级的。
2024-08-07 16:00:21 1726
原创 Java并发编程(四)—synchronized关键字的应用
synchronized 关键字是 Java 中用来确保线程安全的基本机制,特别是在需要保证多个变量之间的一致性时。通过使用 synchronized,可以锁定一个对象,从而确保同一时刻只有一个线程可以访问该对象可以将 synchronized 用于方法级别和代码块级别,要注意锁定的对象应该是一个合适的对象,不能是一个常量,使用 synchronized 可以简化并发控制逻辑,但需要注意其性能开销和潜在的死锁风险。
2024-08-05 16:28:54 1590
原创 Java并发编程(三)—CAS的原理及应用场景
CAS通过比较并交换的方式来更新共享变量,避免了使用传统锁机制带来的性能开销,但在高并发场景下可能会遇到自旋消耗CPU资源和ABA问题等。
2024-08-02 16:13:37 1466
原创 Java并发编程(二)—volatile关键字的作用及使用场景
volatile在这篇文章多次提及volatile,这是一个非常重要的概念,主要用于多线程编程中,它确保了变量的可见性和禁止指令重排序,但不保证原子性,下面详细解释。
2024-08-01 18:33:38 1092
原创 Java并发编程(一)—Java内存模型以及线程安全
线程安全:在多线程环境下,多个线程可以安全地访问和操作共享数据,而不会引发数据不一致或程序错误的问题JMM 解决并发程序中最关键的两个问题:线程间的可见性和指令重排序。线程间的可见性:确保当一个线程修改了共享变量的值时,其他线程可以立即看到这一改变。没有良好的可见性保证,一个线程对共享变量的修改可能对其他线程不可见,导致数据不一致。指令重排序:为了提高性能,编译器和处理器常常会改变指令的执行顺序(只要这种改变不影响单线程内的程序逻辑)。然而,在多线程环境下,这种重排序可能导致严重问题。
2024-07-31 18:17:49 1022
原创 Netty入门-NIO基础
Non-Blocking IO 非阻塞 IOc在这里插入图片描述从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层channelbuffer常见的 Channel 有buffer 则用来缓冲读写数据,常见的 buffer 有selector 单从字面意思不好理解,需要结合服务器的设计演化来理解它的用途socket1threadsocket2threadsocket3t
2024-07-31 14:53:41 55
原创 Java使用EasyExcel自定义合并(横纵合并)、自定义行高列宽、自适应行高列宽工具、自定义样式Excel导出
之前有些过自适应行高列宽工具,在往期的文章里:那为什么还需要自定义列宽呢?自适应行高列宽工具只能根据单元格中的文本内容做自适应,而且会受上下单元格的影响,效果有时候不尽如人意。例如14行客户签章,需要盖章的地方肯定需要留足够的空间大小,14行单元格的宽度相当于5行单元格。可以合并5行,也可以定义14行的单元格的行高,那肯定是自定义行高方便4、5行的序号的列宽肯定是需要小于改造前后的列宽等等@Override//默认表头高度@Override//默认内容高度if (height!
2024-07-30 14:00:42 1641 2
原创 @Transactional使用的注意事项
在项目中涉及到CRUD操作时,一般都会在方法上添加该注解,以为加上@Transactional,Spring就可以自动帮我们进行事务的开启、提交但事实上,还是会有一些坑导致事务失效。
2024-07-25 20:31:45 434
原创 Redis与MySQL数据一致性问题的策略模式及解决方案
(1)实际开发中一般使用使用了缓存更新策略模式,此方案最大程度上保证了数据的一致性并且实现也最简单(2)无论是先操作数据库再删除缓存还是先删除缓存再操作数据库都有可能会出现删除缓存失败的情况,所以需要加入删除重试机制(3)如果想要Redis和Mysql的数据强一致性,可以考虑使用加锁的方式实现。
2024-07-24 18:30:28 3370 2
原创 Java之@Async注解的使用
Transactional方法内部调用 @Async 的方式,异步方法的事务是无法生效的。当方法中同时使用 @Transactional 与 @Async 时,事务是可以生效的。@Async方法内部调用@Transaction 的方式,异步方法事务是可以生效的。@Async无法进行事务管理,需要在内部使用 @Transactional。这个注解的作用在于可以让被标注的方法异步执行,但是有两个前提条件。需要异步执行的方法的所在类由Spring管理。需要异步执行的方法上添加@Async注解。
2024-07-24 15:27:30 513
原创 Redis的缓存问题:缓存穿透、缓存击穿和缓存雪崩
Key对应的书在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到压到数据库,从而可能压垮数据源比如:一个不存在的用户id,获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能会压垮数据库。
2024-07-23 16:44:34 1196
原创 Redis的应用场景及类型
Redis使用缓存的目的就是提升读写性能实际业务场景下,我们就可以把 Mysql 中的热点数据缓 存到 Redis 中,提升读取性能,同时也减轻了 Mysql 的读取压力。
2024-07-23 16:17:28 1337
原创 Java实现列表拖拽
在项目中,需要实现列表的上下拖拽,就是将活动当前id和目标id进行上下挤压,重新排序,每一个活动都有一个序号。直接使用Sortutils.sort工具类即可实现活动列表的拖拽功能。:将活动1拖拽到活动3的位置时,应该是活动2、活动3、活动1。:将活动3拖拽到活动1的位置时,应该是活动3、活动1、活动2。1、首先需要将需要活动id以及活动序号,添加上注解。保证分页进行拖拽后排序也是有效的。
2024-07-22 11:17:19 640
原创 Linux没有Ip地址的问题
Centos7 网卡默认是 ens33,是因为ens33协议没有Inet。重新启动又会出现同样的问题,所以需要设置。CentOS重启网络后依然报错。
2024-07-21 12:54:36 145
原创 Java并发编程(六)—线程池的使用
线程池其实是一种池化的技术的实现,实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行销毁,而是继续去处理其它线程已经提交的任务降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统 的稳定性,使用线程池可以进行统一的分配,调优和监控。
2024-07-20 19:26:07 1079
原创 Java锁之可重入锁
ReentrantLock可以实现公平锁和非公平锁ReentrantLock默认实现的是非公平锁ReentrantLock的获取锁和释放锁必须成对出现,锁了几次,也要释放几次释放锁的操作必须放在finally中执行实例方法tryLock()会尝试获取锁,会立即返回,返回值表示是否获取成功实例方法tryLock(long timeout, TimeUnit unit)会在指定的时间内尝试获取锁,指定的时间内是否能够获取锁,都会返回,返回值表示是否获取锁成功,该方法会响应线程的中断。
2024-07-19 21:09:05 1448
原创 Vue入门1:基础语法
个人喜欢将复杂概念简化,不做过多概念点的赘述,通过案例来理解和巩固知识点,由浅入深……:需要HTML、CSS和JavaScript前端基础Node和一个Vue编译器(VS Code /Sublime Text)Vue (发音为 /vjuː/,类似) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。
2024-07-19 17:58:13 731
原创 Redis的过期策略以及内存淘汰机制
在谈Redis过期概念时,先抛出几个问题:那么代入问题,根据概念思考这几个问题吧。Redis有三种数据过期策略:定时删除惰性删除定期删除。
2024-07-18 16:37:06 922
原创 程序员常用Mac工具、Idea插件以及Google插件
推荐指数:★★★★★作为程序员,Markdown工具肯定是必不可少的,可以用来记录一些技术文档,推荐,整个风格比较简约,自带的样式不太好看,推荐插件添加图片注释,不超过 140 字(可选)
2024-07-18 10:58:37 1352
原创 Mac M1安装MySQL 8后无法连接,错误码1045/2003的问题
为什么安装MySQL8,而不是常用的MySQL 5.7呢?因为Mac M1是ARM架构,MySQL 5.7不支持,只能使用MySQL 8,额……MySQL连接过程中还是出现了一些问题的,羡慕Windows,MySQL安装教程自行搜索,这里只总结出现的问题,在此整理下。
2024-07-17 14:26:45 316
Java面试真题(136页)
2024-07-23
Java大厂面试真题以及面试流程资料(237页)
2024-07-23
高项信息系统相关管理师超级全面的备考资料2024版
2024-07-23
Java超级详细的面试文档(335页)
2024-07-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人