四大服务限流算法
这篇文章介绍了限流的概念、必要性以及四种常见的服务限流算法。限流是为了在高并发场景下保护系统稳定性,防止过载和资源耗尽,同时平衡用户体验。 文章详细讲解了固定窗口算法、滑动窗口算法、漏桶算法和令牌桶算法的工作原理及优缺点,并以固定窗口算法为例,给出了具体的实现思路和伪代码, 指出了其存在的临界问题,进而引出滑动窗口算法作为改进方案,通过更细粒度的时间划分提升限流的准确性与灵活性。
分布式锁介绍及基本原理
这篇文章介绍了锁与分布式锁的基本概念和原理,阐述了在多线程环境中共享资源可能引发的数据竞争问题,并通过实例说明了锁的作用。 文章指出,锁用于保证同一时刻只有一个线程访问共享资源,避免脏数据和系统错误。 在单体应用中可以使用本地锁如ReentrantLock或synchronized,但在分布式系统中由于多个进程独立运行,需要使用分布式锁来实现跨进程的互斥访问。 文章还详细讨论了分布式锁的设计要求,包括互斥性、高可用性、可重入性等,并列举了基于数据库、Redis、ZooKeeper等不同实现方案。 最后,文章以Redis为例,逐步讲解了如何实现简单的分布式锁、带过期时间的锁以及可重入锁,并提到Redisson提供的自动续期机制和可重入锁功能,为实际开发提供了参考。
如何保证缓存与数据库的一致性
这篇文章主要介绍了如何保证缓存与数据库的一致性,分析了常见的缓存更新策略如旁路缓存、读穿写穿、写回等,并探讨了不同策略的优缺点。 文章重点讨论了在实际业务中如何通过先更新数据库再删除缓存的方式尽可能保证数据一致性,同时提出了通过消息队列或监听binlog日志异步删除缓存并重试的方案。 此外还提到主从模式下可能出现的数据不一致问题以及应对方法,最后指出完全保证一致性是难以实现的,因此需要结合多种手段尽量减少不一致的可能性,并设置合理的数据过期时间以降低风险。
设计模式之代理模式
这篇文章介绍了设计模式中的代理模式,包括其核心概念、应用场景以及静态代理和动态代理的区别。 代理模式通过一个中间人(代理)来访问真实对象,在不修改原对象的前提下扩展其功能,例如在方法调用前后添加额外操作。 文章以代购和电影票购买为例说明代理模式的实际应用,并详细讲解了静态代理的实现方式及其局限性,随后对比介绍了更加灵活的动态代理,特别是 JDK 动态代理的实现原理和步骤,包括 Proxy 类和 InvocationHandler 接口的作用,以及如何通过动态代理实现方法调用前后的增强处理。
Long/long 的精度丢失问题
这篇文章主要介绍了前端在接收后端Long/long类型数据时出现的精度丢失问题,特别是当数据超过16位时JavaScript的Number类型无法正确显示导致的问题。 文章通过举例说明了现象,并提出了两种解决方案:局部解决和全局解决。 局部解决是在具体字段上添加注解,而全局解决则通过配置Jackson的ObjectMapper或Jackson2ObjectMapperBuilder来统一处理所有Long类型数据,将其转换为字符串以避免精度丢失。 同时文章还拓展了如何全局配置时间格式,提升开发效率和代码一致性。
Butterfly 引入卡片链接
这篇文章介绍了Butterfly主题中引入卡片链接的方法,包括如何通过创建link.js文件来实现卡片链接功能。 文章详细说明了在node_modules/hexo-theme-butterfly/scripts/tag目录下创建该文件,并提供了具体的代码内容,其中包含了SVG图标和样式设置。 通过使用特定的标签语法,用户可以在文章中插入带有图标、标题、链接和描述的卡片链接,提升页面的视觉效果和用户体验。
Hexo 博客引入 Twikoo 评论
这篇文章介绍了如何在Hexo博客中引入Twikoo评论系统。作者最初使用的是Livere评论,但后来发现Twikoo更受欢迎且界面更好,因此决定进行替换。 文章详细描述了部署Twikoo的过程,包括申请MongoDB Atlas账号、通过Vercel部署Twikoo云函数以及绑定自定义域名的步骤。 同时,还讲解了如何在Butterfly主题中配置Twikoo,并提供了美化评论模块的方法,如添加表情包放大效果的JavaScript代码。整体内容涵盖了从环境搭建到前端集成的完整流程。
MySQL 三大日志与两阶段提交
这篇文章详细介绍了MySQL的三大日志:undo log、redo log和binlog的作用与机制。undo log用于保证事务的原子性,记录数据的版本变化以支持回滚和MVCC;redo log确保事务的持久性,通过记录物理页的修改并在崩溃后恢复数据;binlog则是逻辑日志,用于备份恢复和主从复制。文章还深入讲解了两阶段提交的过程,通过prepare和commit阶段协调redo log和binlog的一致性,确保事务在异常情况下能够正确恢复,从而保障数据的一致性和可靠性。