- 博客(100)
- 收藏
- 关注
原创 MySQL中的in和exists的区别
SQL中IN与EXISTS运算符的区别及使用建议: IN用于判断值是否在集合中(静态列表或子查询),适合外层表有索引的情况。EXISTS只关心子查询是否有结果,适合外层数据量少、子查询能利用索引的场景。实际性能取决于优化器转换,两者可能被互相优化。 关键警示:NOT IN存在严重缺陷,当集合包含NULL时结果必然为空集。应始终使用NOT EXISTS替代NOT IN查询,如示例中NOT EXISTS正确返回无订单用户,而NOT IN因NULL值返回空集。最佳实践:永远用NOT EXISTS代替NOT IN以
2025-08-10 21:16:21
403
原创 MySQL的隔离级别及MVCC原理解析
事务的四大特性(ACID)包括原子性、一致性、隔离性和持久性,确保数据库操作的可靠性。并发操作可能引发脏读、不可重复读和幻读问题,不同隔离级别(读未提交、读已提交、可重复读、串行化)通过锁或MVCC机制解决这些问题。MVCC利用隐藏字段、undo log版本链和ReadView实现非阻塞读取,通过快照读避免锁冲突,提高并发性能。特别地,InnoDB在可重复读级别下通过MVCC和间隙锁解决了大部分幻读问题。
2025-08-10 21:08:11
1129
原创 MySQL连接算法和小表驱动大表的原理
本文介绍了MySQL中四种主要的连接算法:Nested Loop Join(NLJ)、Block Nested Loop Join(BNL)、Batched Key Access(BKA)和Hash Join。重点分析了小表驱动大表的核心优化原则,指出驱动表应选择结果集更小的表,而被驱动表连接字段必须有索引。不同算法下小表驱动大表的性能差异显著:NLJ/BKA必须小表驱动,Hash Join则无影响。文章还对比了不同MySQL版本对连接算法的支持优先级,并提供了如何识别和优化驱动表顺序的实用建议。
2025-08-03 19:45:16
805
原创 Obsidian结合CI/CD实现自动发布
文章摘要 本文介绍了一种基于CI/CD、QuickAdd插件和脚本自动化实现Hugo博客发版的方案。作者通过整合Obsidian的QuickAdd插件、Sync to Hugo功能以及自动化脚本,将原本需要8个手动步骤的发版流程简化为3次点击即可完成。方案核心包括:使用QuickAdd模板创建文章并添加属性,Sync to Hugo推送指定文章到Hugo目录,编写bat和shell脚本实现构建和部署自动化,最后通过Coding平台的持续集成功能完成服务器端的自动更新。
2025-08-03 14:42:12
1024
原创 使用docker部署webdav实现Nas效果
摘要:本文介绍了使用Docker部署WebDAV服务的详细步骤。通过docker-compose配置文件实现WebDAV服务的快速搭建,包括数据卷挂载、多用户权限配置(区分读写权限)和端口映射。同时提供了Windows客户端使用RaiDrive挂载WebDAV为本地磁盘的方法,实现类似网盘的文件访问体验。配置示例包含多个隔离的WebDAV目录,分别设置不同的用户名/密码和读写权限,适用于团队文件共享场景。部署后可通过浏览器或挂载本地磁盘的方式访问服务器文件,实现便捷的文件上传下载功能。
2025-06-16 23:31:52
664
原创 常用的Linux命令分享
本文介绍了Linux下Java应用的启动和管理方法,主要内容包括: 启动Java程序:使用nohup和&后台运行JAR包,设置内存参数(-Xms/-Xmx),配置堆转储路径(-XX:HeapDumpPath)用于内存溢出分析,并重定向日志到指定文件。 进程管理:通过jps查看Java进程,kill -15优雅终止进程或kill -9强制终止,以及ps -p查看进程详情。 文件操作:包括chmod修改权限、find查找文件、mv/cp移动复制文件、mkdir创建目录等常用命令。 目录导航:使用cd切换
2025-06-16 23:00:28
976
原创 常用的Docker命令
本文总结了常用的Docker命令操作指南,包括容器日志查看、镜像/容器管理、容器状态控制(暂停/停止/启动)、容器创建与删除等核心功能。特别介绍了docker run的详细参数配置,以及如何通过docker-compose管理容器集群。还提供了容器文件映射、进入容器终端等实用技巧,并对比了暂停容器与停止容器的区别。最后分享了将容器内文件映射到宿主机的操作方法。这些命令覆盖了Docker日常使用的主要场景,适合开发运维人员快速查阅。
2025-06-04 23:57:27
650
原创 封装一个小程序选择器(可多选、单选、搜索)
因为Uniapp没有提供一个好用的选择器,所以自己封装了一个Uniapp可多选,可单选、可搜索的选择器组件
2025-05-28 21:08:37
494
原创 通过觅思文档项目实现Obsidian文章浏览器在线访问
觅思文档(MrDoc)是一个开源项目,用户可以通过GitHub或Gitee获取其代码。部署步骤包括在服务器上拉取代码、使用Docker进行安装、创建管理员账号,并通过指定IP地址访问。此外,觅思文档支持与Obsidian笔记软件的同步,用户需安装特定插件并设置访问地址和token。具体操作包括在Obsidian中配置觅思文档的访问信息,生成token,并通过右键菜单进行同步。这些步骤使得用户能够轻松管理和同步文档内容。
2025-05-18 21:39:42
481
原创 Hugo 安装保姆级教程(搭建个人blog)
本文详细介绍了如何在Windows系统上安装和配置Hugo静态网站生成器。首先,从Hugo的GitHub项目地址下载并解压Hugo可执行文件。接着,创建博客文件夹并配置环境变量,以便在任意位置使用Hugo命令。然后,通过命令行创建博客网站,并生成测试文章。文章创建后,需修改草稿状态以便展示。随后,从Hugo官网选择合适的主题,并将其放入themes文件夹中,同时在配置文件中指定主题。最后,通过命令行启动本地服务器,访问并测试博客网站。整个过程简洁明了,适合初学者快速上手Hugo。
2025-05-18 21:33:41
1156
原创 idea中的--、-D、-X的区别
含义:-D用于设置JVM的系统属性(System Properties),格式为-Dkey=value,这些属性在程序运行时可以通过System.getProperty(“key”)读取。使用场景用于配置JVM或应用程序的运行时环境,比如调试开关、路径、配置文件等。是JVM级别的参数,影响整个程序。在IDEA中设置:在“Run/Debug Configurations”的“VM options”字段中输入。例子配置:-Dlog.level=debug -Dfile.path=/tmp。
2025-04-01 10:25:04
778
原创 在 Windows 中查看 Nginx 当前占用的端口
在 Windows 中查看 Nginx 当前占用的端口,可以通过以下步骤操作:Win + Rresmonnginx.exe80。
2025-03-29 14:51:18
861
原创 Quartz知识点总结
简单的定时任务使用Timer或者ScheduledExecutorServicequartz支持复杂的定时执行功能。支持ram存储(内存存储)和持久化存储。quartz有分布式和集群能力例子:使用了 Builder 模式(建造者模式):Quartz基本的实现原理job和jobdetail的关系是什么?Job(任务)是一个接口,表示一个具体的任务。你需要实现这个接口,并在 execute 方法中定义任务的具体逻辑。Job 只关注任务的执行逻辑,即 做什么。JobDetail(任务详情)JobD
2025-03-19 21:47:57
868
原创 方法引用和lambda表达式的奥妙
下面代码中两处使用了lambda表达式,一个是filter内,一个是forEach内。其中,forEach内的lambda表达式可以被方法引用替代,但是filter内的lambda表达式不能被方法引用替代。使用方法引用取代的做法:为什么filter内的lambda表达式不能使用方法引用取代,但是forEach内的lambda表达式可以被方法引用取代呢?这个需要看lambda表达式里面的内容了。在上面案例中,filter内的lambda表达式是写一个对流中元素进行处理的逻辑。而forEach内的lambd
2024-12-14 23:52:45
816
原创 重载方法匹配规则
方法重载后,方法调用处可能会遇到应该选择哪个重载方法的问题,如果只有唯一个重载方法可以匹配,那么就没问题,肯定选择这个唯一匹配的重载方法进行执行。但是,如果是有多个重载方法可以匹配调用的实参,那么这时候就会选择最合适的重载方法去执行。那么jvm选择的规则是什么呢?
2024-12-05 11:18:04
734
原创 lambda表达式的规则
成员内部类需要通过外部类的实例去调用。返回值是外部类名.内部类名,创建内部类实例的做法是外部类实例.new 内部类名。这种成员内部类的使用其实比较少,所以印象不是很深,要记一下。//其实这个要理解也好理解,就理解为new的优先级比点号的优先级高就行了,这样就可以理解new Outer().new Inner();了,理解为:外部类实例的内部类实例。点号理解为“的”。内部类中方法或者代码块中使用this.属性名或者直接使用属性名。
2024-12-04 11:49:37
800
原创 mybatis从浅入深一步步演变分析
超详细的mybatis笔记。mybatis从浅入深的分析怎么一步步变为springboot集成的mybatis
2024-10-31 23:07:33
1119
原创 java代理模式(动态代理、静态代理、需要实现类的JDK代理、不需要实现类的JDK动态代理、CGLIB代理)
java代理模式(动态代理、静态代理、需要实现类的JDK代理、不需要实现类的JDK动态代理、CGLIB代理)。其中mybatis使用的就是没有实现类的动态代理。
2024-10-07 22:49:28
1029
原创 SpEL表达式相关知识点
Spring 表达式,即 Spring Expression Language,简称 SpEL。那么是什么SpEL表达式呢?SpEL表达式的语法是什么样的?SpEL表达式主要用于哪里?在注解**@Value**中使用(这个其实我个人觉得和第三点类似,@Value中能写SpEL表达式,是因为@Value的解析程序用了Expression对象来解析了SpEL表达式,SpringBoot会自动调用这个内部解析程序,所以可以写。就像SpringSecurity中方法上的注解@PreAuthorize(“@ss.ha
2024-07-07 16:13:41
1263
1
原创 AOP、注解、EL表达、若依权限,Security原理综合分析
本文最开始只想记录AOP的使用,后来又扩展了很多其他的相关内容,比如SpringSecurity、SpEL表达式等知识点
2024-05-26 23:58:05
582
2
转载 mybatis各种批量操作(优秀摘录)
是扩展运算符,是es6的新语法for:简单、可以通过索引访问或者修改原数组while、do while:循环条件确定,和java一样for in:可以遍历对象出对象的属性和属性值。for of:既可以遍历列表也可以遍历对象。可以拿到列表的索引和值,也可以拿到对象的属性和属性值forEach:省内存,但是不能使用for寻找中的break。可以拿到数组的索引和元素。可以获取对象中的属性值。注意:forEach会改变原来数组中的值。forEach方法没有返回值,一般用于直接修改原数组;
2024-03-20 00:08:44
785
原创 for、while、do While、for in、forEach、map、reduce、every、some、filter的使用
是扩展运算符,是es6的新语法for:简单、可以通过索引访问或者修改原数组while、do while:循环条件确定,和java一样for in:可以遍历对象出对象的属性和属性值。for of:既可以遍历列表也可以遍历对象。可以拿到列表的索引和值,也可以拿到对象的属性和属性值forEach:省内存,但是不能使用for寻找中的break。可以拿到数组的索引和元素。可以获取对象中的属性值。注意:forEach会改变原来数组中的值。forEach方法没有返回值,一般用于直接修改原数组;
2024-03-10 22:13:23
1069
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人