- 博客(21)
- 收藏
- 关注
原创 秒杀系统设计思路
不在mysql层面中扣库存了,直接将库存信息预热到redis中,使用lua脚本 保证原子性,在redis中进行库存扣减,扣减成功后发送消息给消息队列给mysql持久化,update改成inset库存记录 后期对账。缓存(将商品信息 预热到缓存中,直接不设置过期时间 方式缓存雪崩和缓存击穿的问题)比如有5万个白菜,平均拆分成5个库存服务 每个服务有1万个白菜,为了解决单点瓶颈。下单请求的时候 先去拿令牌 如果拿不到令牌直接return 前端给一个报错展示。前端做一部分分摊(缓存)1.商品信息前端做缓存。
2025-11-11 13:58:05
193
原创 spring cloud 微服务
当我们使用单体架构的时候,所有的模块都耦合在一起,微服务可以把每一个服务进行一个拆分,使得模块和模块之间的耦合度降低。
2025-11-10 13:29:34
260
原创 阿尔萨斯实战
1.thread命令 查看一下线程的状态,可以发现线程的cpu的占用率2.通过thread 加上线程id 就能看到 堆栈信息 哪个类的哪一行出现了问题3.通过jad命令 包名+类名 可以进行反编译。
2025-11-10 13:20:26
191
原创 JVM调优
首先频繁进行fullGC(可以查看日志观察jvm的内存状态发现),程序变得很慢OOM(配置参数-xx:+heapdumpOutOfMemory),发生OOM自动dump文件,根据文件分析一下哪里发生OOM了除了上述的两种方式还可以根据阿尔萨斯或者服务器的控制台去查看jvm的具体情况,这时候再判断内存是否需要调优了。
2024-09-12 16:18:49
754
原创 分布式事务笔记
C 一致性A 可用性P 分区容错性既然都解决不了软状态,基本可用,最终一致性后来大家就任务其实本质上就是为了最终一致性( 异步,回查,重试)分布式事务开始有概念了,seata出来了,就是有了AT模式at模式的出现解决了xa模式下,try阶段事务挂起,导致的性能问题。
2024-09-11 15:54:01
411
原创 Spring笔记
说白了就是为了解决A依赖B,B依赖A的循环依赖的问题,而且A还有代理对象生成的逻辑正常来说二级缓存可以解决循环依赖的问题,有三级缓存的意义在于,防止有代理对象提前生成出来了,你得有一个地方去放它(提前放入二级缓存里)
2024-09-10 15:51:59
1074
原创 Mysql优化
读写分离(数据量比较大)分库分表(数据量大,无法用索引来满足,并且并发量太大,)缓存(经常要查询的数据,每个表比较常用的字段)主从复制。
2024-09-05 10:59:33
474
原创 Mysql事物
多版本(一行数据的版本链)并发(场景)控制(读到的结果)说人话就是:一条数据,我允许,多个事物对他进行修改,并且控制得到的结果undolog&&mysql针对每一行数据都会有两个隐藏字段,事物id和指针(指向上个版本的指针)1.当前事物id2.活跃事物id列表3.最大事物id4.最小事物id根据readview就可以根据版本链判断当前事物哪些可以读哪些不能读在活跃事物列表中的,那就证明这个事物还没有被提交,所以一定不读不在活跃事物列表中的,那就证明该事物已经提交了,所以一定读。
2024-09-04 13:59:33
713
原创 Redis笔记
1.基于内存的,不用磁盘io,所以快2.io多路复用,一个线程监控多个socket连接3.单线程,减少上下文线程切换(6.1之后处理和客户端的连接是多线程,但是处理命令是单线程)
2024-09-04 11:25:05
341
原创 MySQL的日志
首先mysql再最开始的时候是不支持事物的,因为他只有binlog可以做数据回放(我要回放昨天12点之前的数据,这个是可以办到的)不支持事物是因为,数据都是存储到数据页中的,事物的修改最终都是要映射到磁盘中的,binlog是办不到的有可能一条update语句,影响了三行数据页,binglog只能记录哪一行数据修改了什么,如果update中断了,根本就不知道这3张数据页执行到哪一步了颗粒度不够,所以不支持事物。
2024-09-04 10:28:04
522
原创 MySQL索引
联合索引中的字段,不是全局有序,是局部有序,只有确定前面的字段顺序后,后面的字段才会有序在联合索引查询的时候,没有满足最左匹配原则的情况下,还是用到了索引(虽然索引目录是乱的,但是也比全文检索强)
2024-08-30 15:21:12
414
原创 深度了解各种锁(更新中)
1. synchronized是基于JVM实现的,是java的一个关键字,可以修饰方法、对象、代码块,但是锁得都是对象;2. 底层是mutix互斥变量;3. 加锁:monitor enter 释放锁:monitor exit;4.不可以手动加锁释放锁;5.1.6之前是一个重量型锁,效率慢,因为线程一旦抢不到锁,会阻塞状态(睡觉),并且会有死锁的情况。1.6之后进行了优化,锁升级;6.是一个非公平锁并且可重入,不能指定等待时间1.基于JDK实现的;2. 可以手动加锁和释放锁(lock());
2024-08-15 18:04:09
450
原创 JAVA集合框架,深度理解List&&Map,面试聊这些够了
这是空间和时间的权衡最后定下的如果比0.75小,虽然解决了hash冲突,但是扩容的频率会提高,内存的空间会占用较大如果比0.75大,空间虽然解决,但是链表过长,效率会低。
2024-08-13 18:07:15
467
原创 面试必问的线程池,一篇笔记搞定!
首先我们要知道 new线程是有开销的,在栈里面需要开辟空间,针对这种有限的宝贵的资源,我们不能无限的去创建线程,这时候就有一个大聪明提出了线程池这么一个概念了,线程池可以帮我么保管起来,不需要去管什么时候new线程,什么时候销毁和回收。我们只需要往线程池里面提交任务即可。
2024-08-08 17:09:59
391
原创 volatile&&单例模式的理解
当在执行代码的时候,cpu的工作内存会从主存加载到变量进来,当遇到很多的变量都需要进来的时候,因为cpu的工作内存中空间有限,他会将最开始读到的变量写回到主存中,当再次用到这个变量的时候,会重新读取到工作内存,效率会很低。所以就有一个解决方案:他会重新排序,但是他也不是瞎排序,会基于happey-before原则(在不影响代码执行结果的前提下)才会重排序,这样的话就不用重新从主存读到工作内存了,提高效率。原子性就是一批线程执行任务的时候,不会被其他线程所干扰,要么同时成功,要么同时失败。
2024-08-08 14:51:53
468
原创 JVM面试搞懂这些就就够了!
当一个类加载器的到类加载的请求时,他不会第一时间选择自己加载,而是委派到他的父类加载器去加载,如果父类还是加载不了,再继续向上委托,如果最顶端的启动类加载器还解决不了,会再一次向下由自己的子类加载去加载,最后都执行不了的话,就报classNotFindException垃圾就是当一些对象不会被使用,但是还会占用内存空间,那这些对象就是垃圾既然不会被使用的对象就是垃圾,但是如何界定这个对象不会被使用了呢?这里引出两个方案。
2024-08-07 15:51:12
704
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅