- 博客(34)
- 收藏
- 关注
原创 Spring系列之Spring Cache缓存注解的使用
Spring Cache 是 Spring Framework 提供的一个用于操作缓存的抽象层,它简化了在 Spring 应用程序中集成和使用缓存的过程Spring Cache 不直接实现任何缓存技术,而是定义了一套标准接口和注解,使得开发人员可以轻松地切换底层缓存实现,而无需修改业务逻辑代码是不是有点似懂非懂,那么使用一个🌰来了解@Service@Autowire@Autowired//查询用户if(user!= null) {
2024-08-23 12:32:19
1307
原创 Java中自定义注解的使用
以【记录操作日志】为例,一般在开发中为了记录用户操作,当系统出现问题时,可以追溯日志所提供详细的错误信息,帮助开发者快速定位问题的原因最简单的方法:在每个方法中增加日志信息打印代码,来记录操作日志,但是这样重复代码也很多,也不易扩展,而且易出错使用自定义注解就会方便很多,减少不必要的重复代码,减少非业务代码的侵入性,如果需要扩展操作用户的信息以及IP就会很方便,易于扩展和维护@interface在需要使用自定义注解的地方使用该注解@LogOperation("新增")// 方法实现。
2024-08-22 14:33:27
984
原创 Redis持久化(RDB、AOF、混合持久化)
Redis 需要持久化主要是为了保证数据的安全性和持久性,防止数据丢失Redis 持久化功能默认是开启的,这样做的目的也是为了保证程序的稳定性,防止缓存雪崩、缓存击穿等以及保证数据不丢失。若要手动关闭 Redis 持久化,需要将 RDB、AOF 和混合持久化全部关闭才行,并且关闭之后需要重启 Redis 服务才能生效。
2024-08-21 14:59:54
952
原创 数据结构与算法——前缀树
(Trie,有时也称为字典树或关键词树)是一种有序树结构,用于存储具有相同前缀的字符串集合。它非常适合,并且可以显著提高查询速度。
2024-08-19 11:17:39
1079
原创 Redis中Big Key该如何解决?
Redis的Big Key会给Redis带来的意想不到的危害,需要监控、及时发现和处理Big Key。在开发过程中需要选用适当的Redis数据结构开发业务,尽量避免big key。
2024-08-16 18:21:34
1238
原创 MySQL查询分组内最新的第一条数据
由于MySQL 5不支持窗口函数,因此不能使用PARTITION()、ROW_NUMBER(),获取每个班级中最新注册的学号人员信息也就是从 user_info 学生表中获取每个 class_id 班级的最新一条记录。
2024-08-15 17:57:52
511
原创 Java并发编程(八)——异步编程之CompletableFuture
CompletableFuture是一种用于处理异步任务和并发编程的强大工具类,支持异步任务的创建、组合、变换和错误处理,提供了丰富的 API 来简化并发编程,提供了丰富的链式调用方式,支持非阻塞的异步编程模式。
2024-08-14 17:19:33
1633
原创 Java并发编程(七)—ThreadLocal的原理及应用详解
ThreadLocal 是 Java 中的一种特殊机制,它为每个线程提供了一个独立的变量副本,主要用于解决多线程环境下的线程安全问题通过 ThreadLocal,每个线程可以拥有自己的变量副本,从而避免了线程间的数据竞争和同步问题。
2024-08-12 18:21:44
1432
原创 Java并发编程(五)—ReetrantLock详解及应用
synchronized:适用于大多数基本的同步需求,提供了简洁的语法,自动释放锁,适合于简单的同步场景。ReentrantLock:适用于需要更高级特性的场景,如公平锁、超时等待等,需要显式管理锁的获取和释放。如果竞争比较激烈,推荐ReentrantLock去实现,不存在锁升级概念。而synchronized是存在锁升级概念的,如果升级到重量级锁,是不存在锁降级的。
2024-08-07 16:00:21
1586
原创 Java并发编程(四)—synchronized关键字的应用
synchronized 关键字是 Java 中用来确保线程安全的基本机制,特别是在需要保证多个变量之间的一致性时。通过使用 synchronized,可以锁定一个对象,从而确保同一时刻只有一个线程可以访问该对象可以将 synchronized 用于方法级别和代码块级别,要注意锁定的对象应该是一个合适的对象,不能是一个常量,使用 synchronized 可以简化并发控制逻辑,但需要注意其性能开销和潜在的死锁风险。
2024-08-05 16:28:54
1475
原创 Java并发编程(三)—CAS的原理及应用场景
CAS通过比较并交换的方式来更新共享变量,避免了使用传统锁机制带来的性能开销,但在高并发场景下可能会遇到自旋消耗CPU资源和ABA问题等。
2024-08-02 16:13:37
1251
原创 Java并发编程(二)—volatile关键字的作用及使用场景
volatile在这篇文章多次提及volatile,这是一个非常重要的概念,主要用于多线程编程中,它确保了变量的可见性和禁止指令重排序,但不保证原子性,下面详细解释。
2024-08-01 18:33:38
1029
原创 Java并发编程(一)—Java内存模型以及线程安全
线程安全:在多线程环境下,多个线程可以安全地访问和操作共享数据,而不会引发数据不一致或程序错误的问题JMM 解决并发程序中最关键的两个问题:线程间的可见性和指令重排序。线程间的可见性:确保当一个线程修改了共享变量的值时,其他线程可以立即看到这一改变。没有良好的可见性保证,一个线程对共享变量的修改可能对其他线程不可见,导致数据不一致。指令重排序:为了提高性能,编译器和处理器常常会改变指令的执行顺序(只要这种改变不影响单线程内的程序逻辑)。然而,在多线程环境下,这种重排序可能导致严重问题。
2024-07-31 18:17:49
954
原创 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
20
原创 Java使用EasyExcel自定义合并(横纵合并)、自定义行高列宽、自适应行高列宽工具、自定义样式Excel导出
之前有些过自适应行高列宽工具,在往期的文章里:那为什么还需要自定义列宽呢?自适应行高列宽工具只能根据单元格中的文本内容做自适应,而且会受上下单元格的影响,效果有时候不尽如人意。例如14行客户签章,需要盖章的地方肯定需要留足够的空间大小,14行单元格的宽度相当于5行单元格。可以合并5行,也可以定义14行的单元格的行高,那肯定是自定义行高方便4、5行的序号的列宽肯定是需要小于改造前后的列宽等等@Override//默认表头高度@Override//默认内容高度if (height!
2024-07-30 14:00:42
1040
原创 @Transactional使用的注意事项
在项目中涉及到CRUD操作时,一般都会在方法上添加该注解,以为加上@Transactional,Spring就可以自动帮我们进行事务的开启、提交但事实上,还是会有一些坑导致事务失效。
2024-07-25 20:31:45
343
原创 Redis与MySQL数据一致性问题的策略模式及解决方案
(1)实际开发中一般使用使用了缓存更新策略模式,此方案最大程度上保证了数据的一致性并且实现也最简单(2)无论是先操作数据库再删除缓存还是先删除缓存再操作数据库都有可能会出现删除缓存失败的情况,所以需要加入删除重试机制(3)如果想要Redis和Mysql的数据强一致性,可以考虑使用加锁的方式实现。
2024-07-24 18:30:28
2387
2
原创 Java之@Async注解的使用
Transactional方法内部调用 @Async 的方式,异步方法的事务是无法生效的。当方法中同时使用 @Transactional 与 @Async 时,事务是可以生效的。@Async方法内部调用@Transaction 的方式,异步方法事务是可以生效的。@Async无法进行事务管理,需要在内部使用 @Transactional。这个注解的作用在于可以让被标注的方法异步执行,但是有两个前提条件。需要异步执行的方法的所在类由Spring管理。需要异步执行的方法上添加@Async注解。
2024-07-24 15:27:30
355
原创 Redis的缓存问题:缓存穿透、缓存击穿和缓存雪崩
Key对应的书在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到压到数据库,从而可能压垮数据源比如:一个不存在的用户id,获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能会压垮数据库。
2024-07-23 16:44:34
1095
原创 Redis的应用场景及类型
Redis使用缓存的目的就是提升读写性能实际业务场景下,我们就可以把 Mysql 中的热点数据缓 存到 Redis 中,提升读取性能,同时也减轻了 Mysql 的读取压力。
2024-07-23 16:17:28
1247
原创 Java实现列表拖拽
在项目中,需要实现列表的上下拖拽,就是将活动当前id和目标id进行上下挤压,重新排序,每一个活动都有一个序号。直接使用Sortutils.sort工具类即可实现活动列表的拖拽功能。:将活动1拖拽到活动3的位置时,应该是活动2、活动3、活动1。:将活动3拖拽到活动1的位置时,应该是活动3、活动1、活动2。1、首先需要将需要活动id以及活动序号,添加上注解。保证分页进行拖拽后排序也是有效的。
2024-07-22 11:17:19
319
原创 Linux没有Ip地址的问题
Centos7 网卡默认是 ens33,是因为ens33协议没有Inet。重新启动又会出现同样的问题,所以需要设置。CentOS重启网络后依然报错。
2024-07-21 12:54:36
126
原创 Java并发编程(六)—线程池的使用
线程池其实是一种池化的技术的实现,实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行销毁,而是继续去处理其它线程已经提交的任务降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统 的稳定性,使用线程池可以进行统一的分配,调优和监控。
2024-07-20 19:26:07
992
原创 Java锁之可重入锁
ReentrantLock可以实现公平锁和非公平锁ReentrantLock默认实现的是非公平锁ReentrantLock的获取锁和释放锁必须成对出现,锁了几次,也要释放几次释放锁的操作必须放在finally中执行实例方法tryLock()会尝试获取锁,会立即返回,返回值表示是否获取成功实例方法tryLock(long timeout, TimeUnit unit)会在指定的时间内尝试获取锁,指定的时间内是否能够获取锁,都会返回,返回值表示是否获取锁成功,该方法会响应线程的中断。
2024-07-19 21:09:05
971
原创 Vue入门1:基础语法
个人喜欢将复杂概念简化,不做过多概念点的赘述,通过案例来理解和巩固知识点,由浅入深……:需要HTML、CSS和JavaScript前端基础Node和一个Vue编译器(VS Code /Sublime Text)Vue (发音为 /vjuː/,类似) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。
2024-07-19 17:58:13
708
原创 Redis的过期策略以及内存淘汰机制
在谈Redis过期概念时,先抛出几个问题:那么代入问题,根据概念思考这几个问题吧。Redis有三种数据过期策略:定时删除惰性删除定期删除。
2024-07-18 16:37:06
854
原创 程序员常用Mac工具、Idea插件以及Google插件
推荐指数:★★★★★作为程序员,Markdown工具肯定是必不可少的,可以用来记录一些技术文档,推荐,整个风格比较简约,自带的样式不太好看,推荐插件添加图片注释,不超过 140 字(可选)
2024-07-18 10:58:37
1234
原创 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
233
原创 当@Transactional遇上@synchronized生产问题
Transactional注解通过AOP实现事务管理,当标注该注解的方法执行完成后才提交事务,而synchronized代码块又是在一个事务内,就会出现第一个线程释放锁后但是事务还没提交,第二个线程就进入同步代码块获取到未提交的数据库数。@Transactional事务管理是基于动态代理对象的代理逻辑实现的,那么如果在类内部调用类内部的事务方法,这个调用事务方法的过程并不是通过代理对象来调用的,而是直接通过this对象来调用方法,绕过的代理对象,肯定就是没有代理逻辑了。Controller类。
2024-07-17 11:01:53
693
原创 Java使用EasyExcel生成动态表头和多Sheet数据的Excel
注意:需要修改headList和dataList,不可直接使用上面的headList和dataList方法。如果只生成动态表头模版,不需要数据的话,getHeadList()不变,仅供参考。getHeadList 动态生成表头。getDataList 动态生出数据。2、动态表头Excel。撒花完结❀,嘻嘻……
2024-07-17 10:53:12
927
原创 Java使用EasyExcel生成数据带有下拉框格式的Excel
由于在导入Excel前,为了方便用户输入数据,导入的模板字段需带有下拉框格式,使用EasyExcel。下拉选的选项数量超过255个后则会通过创建额外sheet保存选项,再引用到下拉选。下拉框处理 SelectedSheetWriteHandler处理器。2.动态下拉选,需自定义实现ExcelDynamicSelect。下拉框 ExcelSelectedResolve解析器。下拉框选项注解 @ExcelSelected注解。1.固定值的下拉选,使用。
2024-07-17 10:39:45
391
原创 Mac M1 Arm架构在CentOS 7上配置Yum源的相关问题
由于不想在Mac上安装开发软件,因此在PD 18虚拟机上安装了CentOS 7,在Linux上安装JDK、MySQL、Redis、Kafka等软件之前由于PD 17破解版失效,以前安装的CentOS好久都没有使用过,且很多配置失效,例如JDK、Yum源、Docker等等,在PD18安装成功后,又开始配置开发环境由于Mac M1是,网上的很多配置Yum教程基本上全都不能用,都是X86_64的Yum源是安装软件的基础命令,因此必须要安装上,废话不多说。
2024-07-17 10:31:21
367
转载 深入理解Java中的final关键字
Java中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用final关键字的实例。final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的。final关键字的含义?final在Java中是一个保留的关键字,可以声明成
2017-11-03 14:59:11
145
1
Java面试真题(136页)
2024-07-23
Java大厂面试真题以及面试流程资料(237页)
2024-07-23
高项信息系统相关管理师超级全面的备考资料2024版
2024-07-23
Java超级详细的面试文档(335页)
2024-07-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人