- 博客(50)
- 收藏
- 关注
原创 Redis 与数据库(DB)的数据一致性
核心挑战在于:性能需求: 引入Redis就是为了追求极致的读取性能,因此通常采取“旁路缓存”模式。数据一致性: 任何对数据库的更新,都必须在某个时间点反映到缓存中,否则用户就会读到脏数据。处理一致性的常用策略,按照一致性强度(从弱到强)排列如下:这是最基础和常见的模式。由应用层负责管理缓存。读取流程:读取时,首先查询Redis。命中则返回。未命中则查询数据库,将结果写入Redis,然后返回。更新流程:这是一致性问题的核心,有三种常见写法:先更新数据库,再删除缓存 (推荐): 优点:
2026-03-06 09:10:17
351
原创 MySQL 的 REPEATABLE READ 隔离级别 解决不可重复读的底层原理
组件作用解决不可重复读的关键点Undo Log存储数据行的历史版本,形成版本链为多版本提供物理基础ReadView定义事务的“一致性视图”REPEATABLE READ 下,整个事务期间复用第一次生成的ReadView隐藏字段标识版本所属事务,链接历史版本使版本遍历和可见性判断成为可能可见性算法根据ReadView判断哪个版本可见确保事务在整个生命周期看到一致的数据快照数据读取流程图执行 SELECT↓生成/获取 ReadView (RR下复用,RC下新建)↓。
2026-03-06 09:10:03
525
原创 号段模式核心代码实现
一个Buffer使用时,另一个Buffer异步预加载。:Buffer用尽时自动切换备用Buffer。:每次申请一个步长的号段(如1000个):大部分时间在内存中分配,TPS可达数万。:使用AtomicLong的CAS操作。:通过version字段实现并发安全。:Buffer预加载机制避免分配停顿。:当号段使用达到阈值时触发预加载。:可监控号段使用率,及时调整步长。:支持多业务、多实例部署。:更新失败时自动重试。
2026-03-05 20:39:20
105
原创 一个高性能的顺序自增的 ID 的服务设计
高性能顺序 ID 服务 = 号段模式 + 本地缓存 + 批量申请 + 乐观锁/原子操作 + 预加载既保证严格递增,又能支撑高并发、可扩展,比单纯 Redis INCR 更稳,比数据库自增更能扛压。
2026-03-05 20:35:27
362
原创 Spring Boot 打成的可执行 JAR,运行时怎么把里面那么多依赖(lib/.jar)加载起来用
继承自,可以加载多个 jar 和目录。...当你代码中或用反射时:JVM 委托给这个 ClassLoader;它在上面的 URL 列表里逐个查找.class文件;找到就加载进内存,找不到才往上抛。
2026-03-05 20:28:19
321
原创 ScheduledExecutorService / Scheduler(定时器/调度器)原理
假设 period = 3 秒,第 0 秒启动,第 3 秒、第 6 秒…即使某次执行被延迟,后面仍然按“原计划时间点”去补执行(可能导致任务堆积)。两次执行之间的间隔比较稳定,不会因为某次执行时间长而被压缩。如果任务执行耗时不确定,两次执行的间隔也会随之变化。做时间基准,计算“距离下次执行还有多久”,传给。来执行,定时调度只负责“挑时间、把任务送进去”。只有“到期”的任务才能从队列里被取出来执行。:延迟多久执行一次(只执行这一次)。为起点,延迟一段时间再执行下一次。只设置一次“下次执行时间”。
2026-03-05 20:10:37
664
原创 CAS 协议 SSO 登录时序图
CAS Client 通过此接口向 CAS Server 验证 ST,并获取用户身份信息(XML 格式)。用户在一个 Client 退出时,Client 通知 CAS Server 销毁 TGT 和 TGC。由 CAS Server 生成,AppA/AppB 必须向 CAS Server 验证其有效性。用于判断用户是否已在 CAS Server 登录,实现跨系统 SSO。由 CAS Server 设置在浏览器,值为 TGT 的标识。存储在 CAS Server 的会话存储中,与 TGC 对应。
2026-02-26 16:53:30
122
原创 XXL-JOB
Component维度说明易用性注解驱动,Web 控制台,开箱即用扩展性支持多执行器、分片、动态扩缩容可靠性失败重试、日志持久化、告警机制可观测性全链路日志、执行统计、可视化生态国内最流行,文档丰富,社区活跃。
2026-02-25 17:28:05
552
原创 RabbitMQ 高可用架构图(由浅入深)
│ - AlertManager (告警) │。│ - Prometheus + Grafana (指标监控) │。│ - ELK (日志分析) │。【场景三:跨机房同步(Federation / Shovel)—— 异地多活】
2026-02-25 17:10:20
531
原创 HTTPS的加解密流程
校验合法性,主要包括是否在有效期内、证书的域名与请求的域名是否匹配,上一级证书是否有效(递归判断,直到判断到系统内置或浏览器配置好的根证书),如果不通过,则显示HTTPS警告信息,如果通过则继续;用户在浏览器发起HTTPS请求(如 https://www.mogu.com/),默认使用服务端的443端口进行连接;对要传输的HTTP数据进行对称加密,将密文返回客户端;服务端收到请求,返回配置好的包含。进行解密,得到客户端真正想发送的。服务端使用客户端发送过来的。进行加密,发送给服务端;保留在服务端不公开;
2025-08-28 14:13:33
406
转载 拔掉网线后, 原本的 TCP 连接还存在吗?
客户端拔掉网线后,并不会直接影响 TCP 连接状态。所以,拔掉网线后,TCP 连接是否还会存在,关键要看拔掉网线之后,有没有进行数据传输。有数据传输的情况:在客户端拔掉网线后,如果服务端发送了数据报文,那么在服务端重传次数没有达到最大值之前,客户端就插回了网线,那么双方原本的 TCP 连接还是能正常存在,就好像什么事情都没有发生。在客户端拔掉网线后,如果服务端发送了数据报文,在客户端插回网线之前,服务端重传次数达到了最大值时,服务端就会断开 TCP 连接。
2025-08-28 10:41:55
159
原创 秒杀系统设计
这里的关键是,扣减成功的请求不会立即去操作数据库,而是生成一个带状态的订单(“处理中”)并将消息发送到RocketMQ这样的消息队列中。,在API网关(比如我们用过的SpringCloud Gateway)上,要对秒杀接口进行严格的限流,比如用令牌桶或漏桶算法,将超过系统承载能力的请求快速失败掉,保护下游服务。整个链路中,还要做好全方位的监控,从网络流量、服务CPU、Redis/MQ的堆积情况,到数据库的慢查询,确保能快速定位瓶颈。,数据库层面,商品库存字段更新时一定要使用乐观锁(版本号)或悲观锁(
2025-08-28 09:55:33
227
原创 DDD实践总结
脚手架采用DDD单模块方式构建,四层架构用户接口层(展现层)、应用层、领域层、基础服务层。这些架构都有各自的特点和不同,但是他们的总体思想是相似的,主要是通过分层来实现功能和关注点的隔离,达到的目的是领域层不依赖任务其他的外部实现,这样就能保证核心业务逻辑的干净和稳定。比如数据库的CRUD、搜索引擎、文件系统、应用服务配置、消息处理、分布式服务的rpc调用等。应用层:与mvc不同,应用服务层负责编排、获取输入、组装上下文、参数校验、调用领域层做业务处理等,这层不写业务逻辑;
2025-08-27 16:24:19
298
原创 Mysql高级部分总结(二)
因为redo log是顺序IO,所以写入的速度很快,并且redo log记载的是物理变化(xxxx页做了xxx修改),文件的体积很小,恢复速度很快。每个事务binlog的末尾,会记录一个 XID event,标志着事务是否提交成功,也就是说,恢复过程中,binlog 最后一个 XID event 之后的内容都应该被 purge。所以不建议物理delete删除数据,会产生大量的Undo Log,Undo快被写满就会发生切换,在次期间会有大量的IO操作,导致业务的DML都会变得很慢。
2024-12-25 00:02:16
691
1
原创 Dubbo原理
dubbo服务暴露:ServiceBean implements InitializingBean, ApplicationListener<ContextRefreshedEvent>void afterPropertiesSet(); setApplication(); ...void onApplicationEvent(E event); export(); doExport(); doExportUrl()...
2021-09-16 15:32:11
188
原创 Spring随记(一)
Spring之AOP顺序 S4之正常顺序: @Before ==》@After ==〉@AfterReturning S4之异常顺序: @Before ==》@After ==〉@AfterThrowing ******************************************** S5之正常顺序: @Before ==》@AfterReturning ==〉@After S5之异常顺序: ...
2020-11-20 10:48:44
170
原创 深入理解AQS底层源码(二)——lock.unlock()
接着上一次线程2和线程3park后,需要unpark()唤醒。第一步:线程1执行完成后,调用lock.lock()方法,实际调用的是sync.release(1)方法;第二步:线程1调用底层的release(int arg)方法,走到tryRelease(arg)方法;getState() = 1,因为之前线程1加锁后state设值为1,它也是volatile修饰的。Thread.currentThread() = 线程1,c = 0,free = true,setState(0),返回
2020-11-19 17:16:20
258
原创 深入理解AQS底层源码(一)——lock.lock()
前期准备:1、可重入锁(递归锁):外层使用锁后,在内层仍然可以使用锁。同一个线程可以获取多个同一把锁。优点:避免死锁。特点:锁对象是同一个对象2、LockSupport:LockSupport.park(); LockSupport.unPark(Thread t);类比 synchronized wait notify ; lock.newCondition await signalwait notify必须和synchronized搭配使用且先wait后notify;awai...
2020-11-19 15:30:01
1556
原创 高并发下的ThreadLocal
通常 ThreadLocal 可以提供线程内的局部变量,确保每个线程都有自己的专属变量值。但在使用线程池的场景下,线程经常会被复用,同一个线程可能会处理多个业务会话场景(比如多个用户 session),这样就可能会造成后续业务逻辑上的混乱和错误。另外,尽管 ThreadLocal 底层利用弱引用和其它机制来回收资源,ThreadLocal 使用不当时仍可能会产生内存泄漏。ThreadLocal 使用本身实例作为key将用户的值保存在 Thread 的 ThreadLocalMap 中,如果一个 T.
2020-10-20 16:25:24
1425
原创 jvm调优相关随记
1、jvm的参数类型:标配参数,如:java -versionX参数XX参数(重点)---------------------------------------------------查看正在运行中的Java程序,它的jvm参数是否开启,具体值为多少?jps -ljinfo -flag jvm参数 进程编号 (如,jinfo -flag PrintGCDetails 进程编号)-------------------------------------------------
2020-07-03 12:40:16
288
原创 7种垃圾回收器介绍
先看图:新生代收集器Serial收集器Serial收集器是采用复制算法的新生代收集器,一个单线程收集器,只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集时,必须暂停其他所有的工作线程,直至Serial收集器收集结束为止(“Stop The World”)。这项工作是由虚拟机在后台自动发起和自动完成的,在用户不可见的情况下把用户正常工作的线程全部停掉。ParNew 收集器ParNew收集器是多线程的,它也是一个新生代收集器。其余行为包括Serial收集
2020-07-02 16:13:30
4569
原创 MySql高级部分总结(一)
1、MySQL的配置文件:2、MySQL的主要存储引擎:对比项 myisam innodb 外键 不支持 支持 事务 不支持 支持 行/表锁 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作 行锁,操作时只锁某一行,不对其它行有影响,适合高并发的操作 缓存 只缓存索引,不缓存真实数据 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响 关注点 节省资源、消耗少、简单业务
2020-06-20 14:17:22
314
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅