- 博客(153)
- 收藏
- 关注

原创 深入SpringBoot:Redis缓存的集成与实现
SpringBoot整合Redis缓存一、缓存概念知识1、是什么缓存2、缓存的优缺点3、为什么使用缓存二、Redis概念知识1、Redis简介2、为什么用Redis作为缓存3、Redis 支持的数据类型4、Redis缓存常见问题1. 缓存穿透2. 缓存击穿3. 缓存雪崩4. 缓存一致性三、SpringBoot整合redis1、使用redis缓存1. 引入redis依赖2. 修改项目启动类3. 配置redis数据库4. 创建redis配置类5. 操作redis2、使用 SpringCache 的注解1. 注解
2022-02-16 20:10:30
13288
14
原创 Java中的双亲委派模型详解
继承ClassLoader类冲洗额findClass方法即可实现// 构造方法,传入类文件路径 public CustomClassLoader(String classPath) {} // 重写 findClass 方法 @Override protected Class <?try {// 将类名转换为路径 String fileName = classPath + name . replace('.' , '/') + ".class";
2025-03-24 10:55:06
728
原创 Maven仓库加载顺序详解:settings.xml配置优先级解析
在Maven构建企业级项目时,依赖仓库的加载顺序问题常引发隐蔽的构建故障。开发者配置的私有仓库可能被镜像覆盖,导致下载失败;团队环境中SNAPSHOT版本更新异常,阻碍联调;甚至本地缓存残留引发依赖冲突。这些问题的根源在于Maven的多级仓库加载机制和配置优先级规则缺乏系统化梳理。本文将深入解析本地仓库、镜像仓库、Profile仓库与POM仓库的优先级关系,还原依赖加载的全链路逻辑。
2025-03-13 14:03:55
874
原创 Spring事务失效的十大场景及解决方案详解
在Spring框架中,注解是管理事务的核心工具,但若使用不当,事务可能失效,导致数据不一致或业务逻辑异常。本文结合开发实践与源码分析,总结十大常见事务失效场景,并提供解决方案及原理剖析。
2025-03-11 17:28:48
1072
原创 go库介绍:Golang中的lo库:让你的代码更简洁高效
lo库是一个基于Golang泛型实现的lodash风格工具库。Lodash在JavaScript世界中是一个著名的实用工具库,它通过简化数组、对象、字符串等的操作,让JavaScript代码变得更加简洁。而在Golang支持泛型之前,实现这样一个适配多种数据类型的工具库并不容易。现在,有了lo库,我们可以在Golang中享受到类似的便利。lo库是一个功能强大且简洁易用的Golang工具库。它充分利用了Golang的泛型特性,提供了丰富的工具方法,帮助我们简化了代码,提高了开发效率。
2025-03-10 15:47:33
239
原创 深入理解Java内存模型:多线程编程的基石
内存屏障是Java内存模型中的一个重要同步机制,它用于控制特定变量的读写操作的顺序。而工作内存则是每个线程私有的内存区域,用于保存从主内存中拷贝的变量的副本。Happens-Before原则是Java内存模型中定义的一组偏序关系,用于判断两个操作之间的内存可见性和有序性。Java内存模型是一种抽象概念,它规定了多线程环境下不同线程对共享变量的读写操作的可见性和有序性。简单来说,它就像是一个交通规则,确保多线程程序中的各个线程能够按照既定的规则来访问和修改共享变量,从而避免数据竞争和内存可见性问题。
2025-02-08 16:51:39
405
原创 go中的参数传递是值传递还是引用传递?
值传递:在值传递中,当函数被调用时,实参的值会被复制一份,并将这个副本传递给对应的形参。函数内部对形参的操作不会改变实参的原始值。引用传递:在引用传递中,传递的是实参的内存地址,而不是实际值。因此,函数内部对形参的任何修改都会直接影响到原始实参的值。Go语言中的参数传递默认是值传递,这意味着传递的是参数的副本。然而,对于引用类型(如切片、映射、通道、接口和指针),虽然传递的是值,但值本身就是一个引用,因此在函数内部对这些类型的参数进行修改可能会影响到原始数据。
2024-11-22 11:25:17
677
原创 Redis ZSet:底层数据结构与元素排名的奥秘
ZSet作为Redis中的一种强大数据结构,通过其底层数据结构(ziplist或skiplist)以及与之关联的dict字典,高效地存储和管理元素及其分数。同时,通过遍历这些数据结构,Redis能够快速地确定元素的排名。这使得ZSet在需要排序和范围查询的场景中表现出色,如排行榜、成绩排名等。希望这篇博客能够帮助你更好地理解Redis ZSet的底层数据结构和元素排名的原理。如果你对Redis或其他数据结构有任何疑问或想法,欢迎在评论区留言与我交流!
2024-11-19 14:31:26
447
原创 ThreadLocal如何解决内存泄漏
在某些情况下,可以创建一个自定义的 ThreadLocal 子类,并在其中添加清理逻辑。例如,可以覆盖finalize方法(尽管finalize方法通常不推荐使用,因为它不可靠且效率低下),或者在类中引入某种形式的显式清理机制。为了避免 ThreadLocal 的内存泄漏,最关键的实践是在使用完 ThreadLocal 变量后,手动调用remove方法来清除线程中的变量。这尤其重要在使用线程池时,因为线程池中的线程会被复用,如果不清理 ThreadLocal,之前的值会一直存在,可能导致内存泄漏。
2024-11-19 14:18:24
438
原创 如何优雅的写 Controller 层代码
本篇主要介绍的就是controller层的处理,一个完整的后端请求由4部分组成:1. 接口地址(URL地址)2. 请求方式(get、set,put、delete)3. 请求数据(request,有head跟body)4. 响应数据(response)
2024-11-18 14:25:41
751
原创 深入SpringBoot:Async注解的注意点
使用@Async注解能够提高系统的并发性能,但在使用时需要注意一些潜在的问题。通过深入了解Spring Boot中@Async注解的这八大注意点,并采取相应的解决方案,可以更好地应用异步编程,确保系统的可靠性和性能。
2024-11-07 16:13:03
896
原创 分布式事务解决方案
随着业务的快速发展、业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微服务架构。随之而来就必然遇到分布式事务这个难题。这篇文章首先介绍了相关的基础理论,然后总结了最经典的事务方案,最后给出了子事务乱序执行(幂等、空补偿、悬挂问题)的解决方案,分享给大家。
2024-10-25 17:29:31
1081
1
原创 SQL超时的常见原因和解决思路
SQL超时是一个复杂的问题,可以通过优化查询、处理锁竞争、合理配置连接、监控资源等多种方式加以解决和预防。定期进行数据库维护和性能监控也是非常重要的,以确保系统的稳定性和高效性。
2024-09-13 16:34:35
1792
原创 深入SpringBoot:Apollo配置中心的集成与实现
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
2024-09-13 15:13:36
2275
原创 如何实现线程池任务编排?
任务编排(Task Orchestration)是指将多个任务按照特定的依赖关系和执行顺序进行组织和管理的过程,以确保各个任务能够按照预定的逻辑顺序高效地执行。
2024-09-12 15:26:50
519
原创 什么是数据库回表,又该如何避免
回表是指在数据库查询中,使用了索引但需要回到数据表中去读取更多的列数据的过程。通常,这种情况发生在查询的 SELECT 语句中请求的列不全都包含在索引中时。回表会导致性能下降,因为它需要额外的 I/O 操作来获取数据。
2024-09-12 14:20:30
1444
原创 VMware16安装Win11虚拟机全步骤
Consumer editions 和 Business editions 两大版本区别并不大,里面都包含了专业版和教育版,可以随意下载使用。Consumer Editions(消费者版):含家庭版+专业版+教育版+专业教育版+专业工作站版。Business Editions(商业版):含专业版+企业版+教育版+专业教育版+专业工作站版。(为什么要设置这个呢?因为我们等会儿添加信任模块的时候,必须要先给虚拟机加密,才能添加)(我第二次安装的时候,就没有出现蓝色的选择项,直接进入win11的安装了)
2024-09-02 17:54:28
2060
原创 如何对40亿QQ号进行去重?
首先来看看如果要存储40亿QQ号需要多少内存?我们使用无符号整数存储,一个整数需要4个字节,那么40亿需要4*4000000000/1024/1024/1024≈15G,在业务中我们往往需要更多的空间。而且在Java中并不存在无符号整形,只有几个操作无符号的静态方法。这种存储很显然是不太优雅的,对于这种大数据量的去重,我们可以使用位图Bitmap。
2024-08-27 17:51:35
801
原创 Java 面向对象的三大特性和五大基本原则
Java 是一种广泛使用的面向对象编程语言,其设计理念基于面向对象的基本特性和原则。面向对象编程(OOP)通过封装、继承和多态来构建清晰、灵活和可重用的代码结构。而遵循五大基本原则(SOLID原则)则是提升代码质量的关键,它指导开发者优化设计,减少耦合,提高系统的灵活性和可测试性,帮助应对复杂的软件需求和变化的市场环境。接下来,我们将深入探讨 Java 面向对象的三大特性及五大基本原则。
2024-08-25 13:06:33
986
转载 Zookeeper 分布式锁详解
在单体的应用开发场景中,涉及并发同步的时候,大家往往采用synchronized或者Lock的方式来解决多线程间的同步问题。但在分布式集群工作的开发场景中,那么就需要一种更加高级的锁机制,来处理种跨JVM进程之间的数据同步问题,这就是分布式锁。
2024-08-08 15:43:51
193
原创 Maven基础知识及常用命令
Maven 是一个项目管理工具,可以对Java项目进行构建、依赖管理。Maven 基于项目对象模型(POM):Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 能够帮助开发者完成以下工作: 构建 文档生成 报告 依赖 SCMs 发布 分发 邮件列表。
2024-08-08 15:02:04
1211
原创 Redis的过期策略与内存淘汰机制详解
Redis的过期策略和内存淘汰机制是确保系统稳定运行和高效利用内存的重要手段。通过合理选择过期策略和内存淘汰策略,可以在不同场景下达到最优的性能和资源利用效果。在实际应用中,建议根据具体业务需求和系统环境来选择合适的策略,以最大化Redis的性能和稳定性。
2024-08-08 14:32:25
1404
原创 MySQL数据库分区
数据库分区是一种有效的管理大型数据集的策略,可以提高查询性能和管理效率。在 MySQL 中实现分区需要根据具体的业务需求选择合适的分区类型,并设计合理的分区方案。
2024-08-08 14:13:02
4730
原创 Gin + Gorm 实现CRUD操作的终极指南,再也不需要手写CRUD了
由于自定义api不能像CRUD那样自动生成代码,则需要人工编写完整的自定义代码了,包括路由设置、handler函数、定义请求参数和返回值、定义字段校验tag、定义业务错误码、填写swagger用的注解信息、编写业务逻辑代码等一系列步骤。1. 定义请求参数和返回结果结构体进入目录,打开文件Email string `json:"email" binding:"email"` // 邮件Password string `json:"password" binding:"min=6"` // 密码。
2024-08-06 15:19:53
1026
原创 Redisson 实现分布式锁
对于大多数的场景而言,使用 Redisson 的普通锁就可以了,如果项目对分布式锁的安全性要求很高,推荐使用基于 Raft 或 Paxos 算法的 etcd 或 ZooKeeper,他们在设计时充分考虑了分布式环境下的一致性和可靠性问题,提供了比 RedLock 更为健壮的解决方案。我们可以将一个长时间执行的任务拆分为多个独立的较短的小任务,每个步骤都有自己独立的分布式锁,这样就可以减少锁定资源的时间,同时确保每个阶段都能在适当的时间内完成。公平锁与 JUC 中的公平锁一致,遵循先到先得的原则。
2024-08-06 15:01:23
1121
原创 深入理解Java的内存管理机制
JVM的内存划分区域设计有效地支持了Java程序的执行与内存管理。合理理解这些区域的功能和作用,有助于开发者优化程序性能和内存使用。
2024-08-06 09:07:59
1023
原创 MySQL基础:int(1) 和 int(10) 有什么区别
int后面的数字不能表示字段的长度,int(num)一般加上zerofill才有效果。zerofill的作用一般可以用在一些编号相关的数字中,比如学生的编号 001 002 … 999这种,如果mysql没有零填充的功能,但是你又要格式化输出等长的数字编号时,那么只能自己处理了。
2024-08-05 21:49:52
771
原创 Java基础:线程池拒绝策略详解
线程池的拒绝策略是指当线程池无法接受新任务时,如何处理这些被拒绝的任务。提供了四种内置的拒绝策略,并且允许用户自定义拒绝策略。除了上述四种内置的拒绝策略外,还允许你通过实现接口来定义自己的拒绝策略。这提供了极高的灵活性,可以根据具体需求定制拒绝任务的行为。自定义拒绝策略示例// 在这里定义你的自定义处理逻辑 System . out . println("Task " + r . toString() + " was rejected");
2024-08-05 17:02:34
4884
原创 MyBatis的example.createCriteria()方法学习记录
多条件查询时,可以直接使用同一个条件构造器,往里面直接添加条件就行。多重条件查询时,如上面的两个括号中的条件都要分别满足时,可以分别创建条件构造器,然后分别往里添加条件。
2024-08-03 21:58:13
1505
原创 浅谈Redis集群架构与主从架构
我们要看业务选择不同的Redis方案,当然,Redis集群还可以搭配Redis主从一起使用,我们可以在某一个集群节点上配置一套主从模型。Redis 集群将数据自动分片到多个 Redis 节点,Redis 集群还在分区期间提供一定程度的可用性,当某些节点发生故障或无法通信时,Redis集群能够继续运行。Redis集群的主从模型选举主节点和Redis哨兵选举出主节点非常相似,但大家不要搞混了,Redis集群中并没有哨兵的概念。Redis主从对数据的完整性更看重,Redis主从节点都保存了完整的一套数据库状态。
2024-08-03 16:00:33
1429
原创 MySQL大表的查询速度如何优化?
大数据量的表的查询优化方案有很多,例如:创建索引、优化查询语句、缓存查询结果、提升硬件配置、数据归档和分离,以及数据分片技术(分库分表)等,而这些技术通常是一起配合使用,来共同解决大数据量表的查询速度慢的问题的,其中分库分表的实现最为复杂,所以需要根据自身业务的需要酌情使用。可以优化查询条件,使用合适的索引、合理的查询策略,减少不必要的字段和数据返回。对于大数据量的表,可以考虑采用更高性能的硬件设备,如更快的存储介质(如固态硬盘),更大的内存容量等,以提升查询的 IO 性能。
2024-08-03 15:44:52
1881
原创 MyBatis 如何通过拦截器修改 SQL
假如我们想实现多租户,或者在某些 SQL 后面自动拼接查询条件。在开发过程中大部分场景可能都是一个查询写一个 SQL 去处理,我们如果想修改最终 SQL 可以通过修改各个 mapper.xml 中的 SQL 来处理。但实际过程中我们可能穿插着 ORM 和 SQL 的混合使用,隐藏在代码中不容易被发现,还有假如项目中有很多很多的 SQL 我们不可能一个一个的去修改解决。这个时候我们就需要通过 mybatis 拦截 SQL 并且最终修改 SQL。实现Interceptor接口,并写相关逻辑。
2024-08-03 15:19:57
1010
原创 深入JVM:类加载器和双亲委派模型
如果想要了解什么是类加载器就需要清楚一个Java文件是如何运行的。我们可以看下图:类加载器把Java代码转换为字节码文件运行时数据区将字节码文件加载到内存中,而字节码文件只是JVM的一套指令集规范,并不能直接交给底层操作系统来执行,而是需要有执行能力的执行引擎来运行执行引擎将字节码翻译为底层系统指令,再交给CPU来执行,而这个时候需要调用其它语言的本地库接口来实现整个程序的功能JVM只会运行二进制文件,而类加载器(ClassLoader)的主要作用就是将字节码文件加载到JVM。
2024-08-03 12:50:43
1162
原创 Java基础:反射
反射是 Java 语言中的一种强大机制,允许程序在运行时动态地获取类的信息、访问类的成员(包括字段、方法和构造函数)以及操作这些成员。在运行时获取类的名称、父类、实现的接口等信息。访问和修改对象的私有字段的值。调用对象的私有方法。在运行时创建类的实例。Class类:表示一个类或接口在 Java 运行时的对象。Field类:表示类的字段。Method类:表示类的方法。类:表示类的构造函数。
2024-08-03 11:46:30
663
原创 基于vue2-verify图形验证码的实现
vue2-verify 是一款基于verifypicture常规验证码,由数字和字母构成,输入不区分大小写,可变形成汉字验证。compute运算验证码,主要通过给出数字的加减乘运算,填写运算结果进行验证。slide滑动验证码,通过简单的滑动即可完成验证,应用与移动端体验很好。puzzle拼图验证码,拼图。pick选字验证码,通过按顺序点选图中的汉字完成验证,ie浏览器要求9或以上。
2024-08-03 11:27:16
1506
原创 解决 Vue 页面中地址栏参数变更不刷新的问题
在一次Vue项目开发中,遇到了只改变路由中的参数,路由地址不改变页面数据不刷新的问题。造成这个问题的原因,是因为 vue-router 同一个页面地址栏参数改变(比如文章的发布和编辑是同一个页面),不会触发vue的created或者mounted钩子,所以数据不会重新渲染。
2024-08-03 11:24:54
1296
原创 基于Docker的Redis安装
如果执行docker启动命令后,使用docker ps命令,找不到正在运行的redis。请使用docker logs 容器名,如上述所创建的容器,docker logs myredis 即可查找错误日志,如下图所示,使用docker start myredis 启动容器后,容器并没有启动,所以我们这里通过查看日志的方式解决。可以自定义,因为我的docker的一些配置文件都是存放在/data目录下面的,所以我依然在/data目录下创建一个redis目录,这样是为了方便后期管理.创建本地存放redis的位置;
2024-08-03 11:01:45
614
原创 基于docker的 nacos安装部署
最后可以通过 ip:8848/nacos 访问,登录密码默认nacos/nacos。先查看一下linux有没有开放nacos的8848端口,记得使用。拉取nacos官方镜像,这里使用默认命令。解决方案:重启docker。开放后记得重启防火墙。
2024-08-02 11:15:25
605
原创 pip换国内源
windows下,直接在user目录中创建一个pip目录,如:“C:\Users\XXX\AppData\Roaming”文件夹下,添加pip文件夹,新建文件pip.ini,内容如下:(由于pip服务器在国外,导致下载速度太慢而中断,所以设置为国内的镜像源,这里使用的清华的pip源,它5分钟同步一次。
2024-08-02 11:14:44
331
原创 基于Ubuntu的Docker容器安装指南
默认情况下只有root权限才可以使用Docker,使用下列命令将用户加入到Docker组。Linux系统版本:Ubuntu 22.04 Server x64。Docker版本:Community 20.10.15。卸载前,先停止并删除容器、镜像,卷和网络。至此安装完成,输入命令验证是否安装成功。添加 Docker APT 软件源。查看是否显示Docker版本号。首先更新源,安装必要的依赖软件。安装 Docker 最新版本。先查看可用的docker版本。在安装命令中加入版本号即可。
2024-08-02 11:13:29
345
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人