- 博客(44)
- 收藏
- 关注
原创 SpringAOP+自定义注解实现限制接口访问频率,利用滑动窗口思想Redis的ZSet(附带整个Demo)
在日常开发中,为了保证系统稳定性,防止被恶意攻击,我们可以控制用户访问接口的频率,颜色部分表示窗口大小在指定时间内,只能允许访问N次,我们将这个指定时间T,看出一个滑动的窗口宽度,Redis的zset的score为滑动窗口,在操作zset的时候,只保留窗口数据,删除其他数据
2024-03-24 18:45:06
15180
3
原创 策略模式+工厂模式实现选择多方式登录,微信登录或qq登录,如何实现登录功能,登录的实现
要实现解耦版的登录切换功能,策略模式+工厂模式+ConcurrentHashMap+在Bean的生命周期期间就进行策略绑定,带有Aware的接口进行方法增强:策略模式是一种行为型设计模式,定义一系列算法,并使这些算法可以相互替换,使得算法的变化独立于使用算法的客户。策略模式通常包含一个策略接口和多个实现这个接口的策略类。:工厂是创建型模式,它的作用就是创建对象。将对象统一管理,在业务不同时在调用不同的对象进行使用。
2024-03-08 14:43:56
18344
6
原创 Spring Boot整合Aop面向切面编程实现权限校验,SpringAop+自定义注解+自定义异常+全局异常捕获,实现权限验证,要求对每个接口都实现单独的权限校验。
SpringAop+自定义注解+自定义异常+全局异常捕获,实现权限验证,要求对每个接口都实现单独的权限校验
2024-03-06 15:25:13
25691
3
原创 Mysql的锁有哪些?超详细Mysql的锁介绍,表锁,行锁,间隙锁,临键锁,意向锁,元数据锁。Mysql数据库索引有哪些?从数据结构角度,从物理存储角度,从逻辑角度来分析
Mysql的锁有哪些?超详细Mysql的锁介绍,表锁,行锁,间隙锁,临键锁,意向锁,元数据锁。Mysql数据库索引有哪些?从数据结构角度,从物理存储角度,从逻辑角度来分析
2024-03-05 10:40:34
13252
1
原创 深度解析:基于 ZooKeeper 的生产级分布式锁实现(附完整代码)
本文深入解析了基于ZooKeeper的分布式锁实现方案,重点介绍了LockImpl的核心设计原理和关键实现细节。该方案通过三级节点结构(根节点、业务锁节点、临时顺序节点)实现锁的互斥性和公平性,利用Watcher监听机制确保高效唤醒,同时加入超时控制、异常处理和资源清理等优化措施。文章详细剖析了锁生命周期的完整流程,包括初始化连接、获取锁、释放锁、节点清理和资源关闭五大模块,并提供了生产环境配置建议和最佳实践。相较于Redis方案,ZooKeeper分布式锁在强一致性和自动释放方面更具优势,适用于对数据一致
2025-09-19 10:08:17
1637
原创 ThreadLocal 详解:原理、误区、风险与最佳实践,ThreadLocal作为局部变量,静态变量真的就不会发生内存泄漏嘛?
ThreadLocal是多线程编程的高效工具,但 “便利” 与 “风险” 并存,核心总结如下:核心要点结论原理本质基于Thread-ThreadLocalMap-Entry的关联,实现线程私有变量存储泄漏根源value的强引用未清除 + 线程长期存活安全使用核心无论ThreadLocal声明位置,使用后必须调用remove()线程池环境风险最高,需严格遵循 “用完即清”+ 避免静态ThreadLocal替代方案(优先选择)
2025-09-18 10:39:34
1338
原创 主线程如何传递信息给子线程,子线程如何拿到主线程的用户信息
线程间通信的核心在于对象是否可变:不可变对象(final修饰)直接传递,天然线程安全,适合只读场景;可变对象需加锁同步,适用于需修改数据的场景。推荐显式传递(构造方法/参数)而非隐式共享,在非线程池和线程池环境中均需注意数据安全,首选不可变对象方案。
2025-09-17 17:38:05
924
原创 批量操作性能天花板?原生 JDBC/MyBatis/MyBatis-Plus/Hibernate 优劣势与选型指南
主流数据库批量操作框架性能对比显示:原生JDBC性能最优(10万条数据10-20秒),MyBatis通过合并SQL或批处理模式(15-25秒)平衡性能与灵活性,MyBatis-Plus(18-30秒)牺牲部分性能提升开发效率,Hibernate/JPA(30-70秒)因ORM开销性能最差。性能差异主要源于SQL生成方式、内存管理和事务控制机制,建议根据数据量选择方案:超大数据用JDBC,中等数据用MyBatis,已用Hibernate需开启批处理优化但性能仍受限。
2025-09-16 10:35:42
1038
原创 hibernate和mybatis的差异,以及这种类似场景的优缺点和选择
Hibernate与MyBatis是Java持久层的两大主流框架,核心差异在于设计理念:Hibernate是全自动ORM框架,通过操作对象来操作数据库,适合简单CRUD和复杂对象关系;MyBatis是半自动化SQL映射框架,保留SQL控制权,适合需要精细优化SQL的性能敏感场景。Hibernate优势在于开发效率高、跨数据库适配好,但复杂查询性能较差;MyBatis优势在于SQL灵活性高、批量操作性能好,但需要手动编写更多代码。选择时应根据项目规模、性能需求、团队技术栈等因素权衡,没有绝对优劣,只有场景适配
2025-09-16 10:03:48
747
原创 深入浅出 MySQL 的 MVCC:多版本并发控制的工作机制与应用
MySQL的MVCC机制通过保存数据历史版本实现高并发事务处理。核心是通过隐藏字段(DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID)实现版本控制,不同隔离级别下表现不同。MVCC优点是读不阻塞写、避免锁竞争、支持快照读,但存在存储开销和幻读问题。其实现依赖UndoLog、ReadView和Purge机制,并与锁机制协同工作。该机制大幅提升了数据库并发性能,理解MVCC有助于优化事务设计和SQL查询。
2025-09-15 11:42:47
830
原创 jasypt对yml文件进行加密解密
在日常开发中,我们一般会把以及一些都放入yml文件中,这时就有必要对yml文件进行加密处理了,jasypt是一款简单的对yml加密的工具。
2024-06-22 15:04:21
3047
原创 Java表单重复提交问题
采用redis,切面编程,自定义注解,对获取ip和uri作为key,时间戳作为value每次访问接口,若是该key存在,则进行限制,若是存在,则判断现在距离上次提交时间小于设置的默认时间 则 判断为重复提交 否则 正常提交 -> 进入业务处理
2024-06-22 11:52:51
3233
原创 SpringBoot整合WebSocket实现聊天室
1.简单的实现了聊天室功能,注意页面刷新后聊天记录不会保存,后端没有做消息的持久化2.后端用户的识别只简单使用Session用户的身份
2024-05-22 11:12:52
18391
原创 Redis的应用场景有哪些
基于的数据结构存储系统,它可以用作数据库、缓存和消息代理。Redis 支持多种数据结构,包括以及更复杂的数据结构。:Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s。:Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。:Redis 的所有操作都是原子性的,意味着要么成功执行要么失败完全不执行。:Redis 还支持 publish/subscribe, 通知, key 过期等等特性。
2024-04-23 09:44:30
18150
原创 Java8特性,Stream流的使用,收集成为map集合
Java 8引入了Stream API,这是Java集合操作的一个重大改进。Stream API提供了一种高效且易于使用的处理数据的方式。Stream是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。注意:Stream自己不会存储元素,它不会改变源对象,反而它的操作会返回一个全新的Stream,且它的操作是延迟执行的,这意味着它们会等到需要结果的时候才执行。以下是Stream的一些常用操作:java4.1将流转为map5.Match: 检查Stream中的元素是否
2024-04-18 15:42:22
17093
原创 CAS简单易懂解释,什么是CAS?java代码实现CAS?什么是ABA问题?
CAS(compareAndSwap)比较与交换,在不加锁的情况下保证数据操作的原子性和安全性,也是一种典型的乐观锁,主要有三部分组成,old(旧值),val(期望值),new(新值)。通过比较val(期望值)和old(旧值)是否相等来决定old是否需要替换成新值。(old==val){old=new;}
2024-04-18 11:06:44
19569
原创 MySql中truncate,delete有什么区别?什么情况下id会不会连续呢?
在一个添加事务执行时,若是事务没有提交,那么其实以及申请了id。后面插入的数据会默认id以及有了,然后就会越过这个不存在的id。需要注意的是在什么情况下id会不会连续呢?发现两次的查询结果,id并没有续上。两次的执行结果id都是续上的,发现id1,2的数据并不存在。
2024-04-17 11:27:28
20444
原创 SpringBoot事件发布和监听,ApplicationEventPublisher发布事件,实现ApplicationListener<>监听事件
观察者模式:当一个对象的状态发生改变的时候,所有依赖于它的对象都会得到通知,比如ApplicationListener所以,我们可以用这个来做日志,或者其他事情,
2024-04-15 14:17:30
19699
1
原创 Redis的Hash数据结构中100万对field和value,field是自增时如何优化?优化Hash结构。
ZipList使用是有条件的,当entry数据量太大时就会启用,占用内存空间。
2024-03-30 19:55:24
13921
原创 MySQL索引优化,MySQL索引失效的场景(超详细!)
1.不遵循最左前缀原则2.在索引列上使用(计算,函数,or,类型转换),都是导致失效而导致全表扫描3.范围查询4.Select * 导致回表查询5.不等空值还有or导致索引失效6.like %写在左边导致索引失效7.字符串不加单引号也会导致索引失效8.SQL优化1.字段的选择2.创建索引,并使用索引3.避免走回表,尽量走覆盖索引4.遵循最左前缀原则9.索引技巧
2024-03-21 11:59:43
26361
1
原创 Excel文件导入导出,SpringBoot整合EasyExcel批量导入导出,采用的JDBC+EasyExcel(附带整个Demo)
EasyExcel的入门导入导出,批量导入导出
2024-03-17 19:33:48
15609
4
原创 MySQL的事务隔离级别?MySQL的事务的特性(ACID)?MySQL的事务会出现哪些问题?当前读和快照读的区别?MVCC是什么?
在内部定义了一些匹配规则和当前的一些事务id判断该访问那个版本的数据,不同的隔离级别快照读是不一样的,最终的访问的结果不一样。来保证数据不丢失,在宕机的时候用redolog来恢复数据,由于Buffer Pool刷新磁盘是随机io,性能消耗大,redolog file(日志文件)是追加形式,是顺序io,性能好。隔离性的保证是通过,读已提交,读未提交,可重复度,串行化,MVCC多版本并发控制来保证的。一个事务修改数据,还没有提交,第二个事务就读到了没有提交的数据,也称为脏数据。
2024-03-11 17:57:00
14214
1
原创 java排序,插入排序(java版),附带动图解析
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2024-03-09 15:15:10
6341
1
原创 java排序,选择排序(java版),附带动图解析
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。重复第二步,直到所有元素均排序完毕。
2024-03-09 14:51:49
10956
1
原创 java排序,冒泡排序(java版),附带动图解析
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。重复第二步,直到所有元素均排序完毕。
2024-03-09 14:39:08
6747
1
原创 java线程池?,线程池有哪些创建方式?,线程池参数?,线程池的队列有哪些?,线程池的拒绝策略?,线程池的执行流程或原理?为什么禁止用Executor来创建线程池?
都知道在java中有线程,但是创建一个线程需要上下文切换,线程其实是非常消耗性能的,线程池能帮助开发者创建线程,提高开发效率,能控制线程的数量。:通过线程池,可以避免频繁地创建和销毁线程,从而减少了线程创建和上下文切换的开销,提高了系统的性能和效率。:线程池可以限制同时执行的线程数量,通过设置线程池的大小和队列容量,可以控制系统的并发度,防止因过多的线程导致系统资源耗尽或性能下降。:线程池可以统一管理和调度线程的生命周期,包括创建、执行和销毁线程等操作。
2024-03-08 13:03:47
24203
1
原创 经典面试题:用户在浏览器输入url后会有什么操作,输入url后会经过什么步骤,在浏览器输入 URL 回车之后发生了什么?
DNS解析,浏览器会对输入的URL进行域名解析,查找到对应的IP地址,如果该域名被缓存过就直接去缓存获取,如果没被缓存就向本地DNS服务器发出请求,本地DNS没有缓存就会向根域名服务器发出请求来获取IP地址。进行TCP可靠性连接,浏览器向服务器进行三次握手操作,syn,syn-ack,ack三个阶段。断开TCP连接,四次挥手fin,ack,fin,ack四个阶段。发送http请求,向服务端发送http请求,请求返回响应数据。服务器响应请求,包括状态码,响应头,响应体。
2024-03-07 15:42:05
16988
原创 2024年 spring常见面试题,springboot常见面试题,spring框架经典面试题
3.Bean5.Imoprt7.配合ImportResource8.ControllerAdvice 控制器的切面 可以对响应的数据进行增强我的理解是自动装配就是@Autowrite注解,也就是依赖注入自动配置就是在用springboot时springboot帮我们配置的一些比如1.Mybatis 的SqlSessionFactory2.AOP的EnableAspectJAutoProxy注解 等等而在使用spring的时候,这些配置需要自己去配置。
2024-03-07 10:52:24
13167
原创 java的引用类型有哪些,java有哪4种引用类型?
等于没有引用,对象被回收时会收到通知。程序通过引用队列中是否有虚引用,来决定被引用的对象是否要被垃圾回收,监控对象回收的机制。:只要引用关系还在,对象救不回被回收。只有在没有其他引用关系,超过引用的作用域,对象强制赋值为NULL时就会被回收。:非必须存活的对象,JVM会在内存溢出时对其进行回收。通常实现一些缓存,内存足够保存缓存,不足时就会回收。比作悲剧的男主角(死不了),女主角(坚持不到最后),男二(牺牲品),路人甲(),:非必须存活的对象,不管如何,下次回收时JVM都会回收掉。
2024-03-06 15:36:17
6719
1
原创 SpringBoot中用到的设计模式,并指出在哪些地方用到
观察者模式:当一个对象的状态发生改变的时候,所有依赖于它的对象都会得到通知,比如ApplicationListener。装饰器模式:一些以Wrapper命名的类都是装饰器模式。策略模式:Bean的实例化包含原生对像的实例化和代理对象的实例化,不同的实例化内部逻辑不一样。代理模式:SpringAop,使用了动态代理 ,jdk动态代理和cglib字节码生产技术。简单工厂:BeanFactory ,Bean的工厂getBean创建Bean。适配器模式:MVC模块的HandleAdapter就用到适配器模式。
2024-03-06 15:31:31
11842
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅