自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(95)
  • 收藏
  • 关注

原创 Caffeine+Redis二级缓存架构设计实战

本文介绍了Caffeine缓存库的基础使用及其与Redis结合的二级缓存架构设计。首先阐述了Caffeine的特点,包括自动数据加载、多种内存淘汰策略、异步清理机制等,并通过示例展示了Cache、LoadingCache和AsyncLoadingCache的使用方式。其次,详细讲解了Caffeine+Redis二级缓存架构的实现方案,包括手动配置、Spring注解方式以及自定义注解实现,重点分析了二级缓存的优缺点和数据一致性问题。最后针对分布式环境下的一级缓存一致性问题,提出了基于Redis发布/订阅的解决

2025-06-03 14:39:13 245

原创 幂等的几种解决方案以及实践

通过定义注解实现哦!/*** 业务名称*//*** key设置*//*** 在多长时间内一直保持幂等,如果不配置则以执行方法为准*//*** 当消息执行已经出发防重复执行的限制时,提示信息*/String message() default "提交频繁,请稍后重试";

2025-05-08 16:00:35 1171

原创 深入浅出理解常见的分布式ID解决方案

在构建时,如果通过lua执行加载获取失败,则还采取Mybiats-plus的生成策略nextId方法就是获取分布式id的方法,其内部getBase()是更新时间戳的部分,由时间戳部分 | 数据中心部分 | 机器标识部分 | 序列号部分这四个部分组成方法是生成订单编号,使用了基因替换法,来解决在分库分表情况下,使用订单id和用户id查询订单时的全路由问题。

2025-05-07 11:24:26 787

原创 Redis | Lua脚本基础知识

Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序移植到其他应用程序,它是由C语言实现的,虽然简单小巧但是功能强大,所以许多应用都选用它作为脚本语言,尤其是在游戏领域,暴雪公司的“魔兽世界”,“愤怒的小鸟”,Nginx将Lua语言作为扩展。Redis将Lua作为脚本语言可帮助开发者定制自己的Redis命令。

2025-05-06 15:00:46 694

原创 Java基础问题——八股盛宴 | 3w字分享

Java基础八股整理,67道题目!

2025-05-06 14:33:42 1194 1

原创 FutureTask和CompleteableFuture源码分析

同步:做了同步操作后,被调用者不会主动通知我结果,我需要主动查看结果。异步:做了异步操作后,被调用者会主动通知我结果是什么。阻塞:调用功能后,不能做其他事情。非阻塞:调用功能后,可以做其他事情。

2025-05-06 14:24:09 598

原创 Java ScheduledThreadPoolExecutor 源码解析 | 定时任务&周期性任务

ScheduledThreadPoolExecutor是Java并发包中的一个类,继承自ThreadPoolExecutor,主要用于执行定时任务和周期性任务。它实现了ScheduledExecutorService接口,提供了多种方法来安排和执行定时任务。

2025-05-05 09:31:46 939

原创 简单聊聊分库分表

指数据表呈现有特定规则的分布。

2025-05-05 09:28:05 1055

原创 JVM性能调优的基础知识 | JVM内部优化与运行时优化

对象逃逸的本质是对象指针的逃逸。在计算机语言编译器优化原理中,逃逸分析是指分析指针动态范围的方法,它同编译器优化原理的指针分析和外形分析相关联。当变量(或者对象)在方法中分配后,其指针有可能被返回或者被全局引用,这样就会被其他方法或者线程所引用,这种现象称作指针(或者引用)的逃逸(Escape)。通俗点讲,如果一个对象的指针被多个方法或者线程引用时,那么我们就称这个对象的指针(或对象)的逃逸(Escape)。逃逸分析,是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。

2025-05-02 19:50:57 1220

原创 JVM | CMS垃圾收集器详解

CMS(Concurrent Mark Sweep)收集器是一种以获取 最短停顿时间为目标的收集器。采用的是标记-清除算法,整体分四个步骤(注:CMS中并不是只有标记-清除算法哦)初始标记(CMS initial mark) 标记清除GC Root直接关联对象,不用Tracing,速度很快并发标记(CMS concurrent mark) 进行GC Roots Tracing重新标记(CMS reamrk)修改并发标记 因用户程序变动的内容。

2025-04-29 19:28:53 986

原创 Java 并发编程中阻塞队列 核心源码分析

ArrayBlockingQueue、LinkedBlockingQueue、PriorityQueue【学习优先级阻塞队列的 前提】、PriorityBlockingQueue、DelayedQueue、SynchronousQueue

2025-04-28 15:41:12 953

原创 操作系统八股问——连载ing

用户态(UserModel)和内核态(Kernel Mode)是操作系统中两种运行模式。用于区分应用程序和操作系统内核的操作权限。用户态:应用程序在用户态下运行,权限较低,不能直接访问硬件或进行特权操作。应用程序需要通过系统调用与内核进行通信,由内核代为执行敏感操作。用户态优势:安全性高,即使程序出现问题也不会影响操作系统的稳定性。内核态:内核态是操作系统内核运行的模式,具有最高的权限,可以直接访问硬件资源和执行各种特权操作(如内存管理、进程调度)。

2025-04-28 14:57:06 762

原创 JUC并发工具

如果不为0,需要添加到AQS中的ConditionObject的Waiter队列中排队,并park当前线程如果为0,证明线程到齐,需要执行nextGeneration,会先将Waiter队列中的Node全部转移到AQS的队列中,并且有后继节点的,ws设置为-1。没有后继节点设置为0。如果头节点为0,需要将头节点的状态修改为-3,当最新拿到锁资源的线程,查看是否有后继节点并且为共享锁,就唤醒排队的线程。CountDownLatch在操作时,只能使用一次,也就是state变为0之后,就无法继续玩了。

2025-04-27 15:23:30 966

原创 微服务架构演变

架构演变之路

2025-04-27 13:00:10 339

原创 JVM-深入浅出垃圾回收机制 | 从对象出生到凋零

本文从如何判断一个对象是垃圾入手,分析垃圾回收算法,垃圾收集器的好坏之分,垃圾收集器的代表简述。

2025-04-26 22:28:17 1389

原创 Java ConcurrentHashMap源码分析

ConcurrentHashMap中,还会将hash值对HASH_BITS进行&运算,让hash值一定是一个正数。因为ConcurrentHashMap中数组上的数据的hash值,如果为负数,有特殊含义。散列算法是为了让hashCode的高16位参与到索引位置的计算中,从而尽可能的打散数据存放到数组上。代表当前位置数据在扩容,并且数据已经迁移到了新数组。第二步:判断是否结束,以及线程退出扩容,并且为空时,设置fwd,并且hash为moved直接移动到下个位置。如果当前已经初始化了,就代表下次扩容的阈值。

2025-04-26 21:33:18 1007

原创 JVM-从对象生命周期来看如何判断一个对象是垃圾?(垃圾回收的前提)

本文从如何判断一个对象是垃圾入手,分析垃圾回收算法,垃圾收集器的好坏之分,垃圾收集器的代表简述。

2025-04-25 14:40:21 346

原创 编程方法论——功底

想要拥有编写高质量代码的能力,我们就要学习一些编程的方法论.其中就包含面向对象(我们可以把它看成一种设计思想)、设计原则、设计模式、编程规范、重构技巧等

2025-04-24 20:57:13 993

原创 JVM——运行时数据区 & Java内存布局

可以理解为一种规范。具体的实现可以认为是Java内存模型。

2025-04-14 15:48:26 787

原创 JVM初探——走进类加载机制|三大特性 | 打破双亲委派SPI机制详解

我们在使用特定的驱动实现时,不希望修改现有的代码,而希望通过一个简单的配置就可以达到效果。当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类。缓存机制将会保证所有加载过的Class都将在内存中缓存,当程序中需要使用某个Class时,类加载器先从内存的缓存区寻找该Class,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区。

2025-04-12 14:20:59 1365

原创 线程池——ThreadPoolExecutor | 执行流程 源码剖析

工作线程阻塞在工作队列,主线程执行execute添加任务到工作队列,工作线程被唤醒,拿到工作队列中的任务执行,执行完毕,再次拉取工作队列任务,直到工作队列没有任务,阻塞工作线程。是判断核心线程数,还是最大线程数。如果是非核心线程,默认情况下,会在阻塞队列的位置执行poll方法,等待最大空闲时间,如果没任务,直接拉走咔嚓掉,如果有活,那就正常干。主线程执行execute添加任务,线程池创建工作线程,执行任务,执行任务,再次拉取工作队列任务,直到工作队列没有任务,阻塞工作线程。

2025-04-12 11:22:42 721

原创 深入浅出Redis 缓存使用问题 | 长文分享

Redis缓存应用的问题与解决方案:数据一致性、缓存穿透、击穿、雪崩;热点key和bigkey。以及多级缓存的案例,从携程金融的实例学习缓存设计。

2025-04-11 23:52:07 1096

原创 动态规划——高频典型题20道

DP能解决哪类问题?直观上,DP一般是让找最值的,例如最长公共子序列等等,但是最关键的是DP问题的子问题不是相互独立的,如果递归分解直接分解会导致重复计算指数级增长(想想前面的热身题)。DP最大的价值是为了消除冗余,加速计算。一般说来,动态规划题目有以下三种基本的类型:1.,例如求有多少种方式走到右下角,有多少种方式选出K个数使得***等等,而不关心具体路径是什么。2.等等,例如最大数字和、最长上升子序列长度、最长公共子序列、最长回文序列等等。3.,例如取石子游戏,先手是否必胜;

2025-04-11 13:52:31 592

原创 Redis高可靠高并发高可用 | 三万字解析 | 集群、哨兵、主从复制

Redis集群、主从复制、哨兵、高可用读写分离等内容

2025-04-10 13:38:37 1064

原创 剖析Spring中的设计模式(一) | 工厂&观察者

Bean的定义 解析Bean的配置信息,封装到BeanDefinition中Bean的创建 使用反射创建bean对象 idBean的解析 赋值、初始化等操作。Spring Bean的创建是典型的工厂模式,它的顶级接口是BeanFactory。职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。BeanFactory有三个子类:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。目的是为了。

2025-04-09 10:55:25 928

原创 回溯——固定套路 | 面试算法12道

给我一种感觉是回溯需要画图思考是否需要剪枝。元素个数n相当于树的宽度(横向),而每个结果的元素个数k相当于树的深度(纵向)。枚举时,我们就是简单的暴力测试而已,一个个验证。模板如下。

2025-04-09 09:49:15 1202

原创 Redis持久化 | RDB AOF | 常见问题

Redis虽然是个内存数据库,但是Redis支持RDB和AOF两种持久化机制,将数据写往磁盘,可以有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。

2025-04-08 17:01:57 998

原创 玄学贪心,但要掌握几道题目

贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法;贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。玄学贪心,但是掌握的几道题目!贪心常见的经典应用场景有如下这些,这些算法很多与图有关,本身比较复杂,也难以实现 ,我们一般掌握其思想即可:排序问题:选择排序、拓扑排序优先队列:堆排序赫夫曼压缩编码图里的Prim、Fruskal和Dijkstra算法硬币找零问题。

2025-04-08 16:05:22 991

原创 深入浅出Java 锁 | 源码剖析 | 万字解析

Java中有哪些锁?本文围绕这个问题进行深入的探讨,从内存模型到乐观悲观锁,再到底层源码实现(Java8版本)

2025-04-07 22:50:37 951

原创 一文搞懂Redis 高级特性和应用 | 消息发布订阅\Stream\全局哈希表\慢查询\流水线\事务······

redis高级特性包括消息发布订阅\Stream、全局哈希表、慢查询、流水线、事务

2025-04-07 17:36:01 1297

原创 滑动窗口思想 面试算法高频题

滑动窗口思想其实就是快慢型的特例计算机网络中滑动窗口协议(Sliding Window Protocol),该协议是TCP实现流量控制等的核心策略之一。事实上在与流量控制、熔断、限流、超时等场景下都会首先从滑动窗口的角度来思考问题,例如hystrix、sentinel等框架都使用了这种思想。窗口其实就是两个变量left和right之间的元素,也可以理解为一个区间。窗口大小可能固定,也可能变化,如果是固定大小的,那么自然要先确定窗口是否越界,再执行逻辑处理。

2025-04-07 11:04:31 1232

原创 剖析Mybatis中用到的设计模式

​框架对很多设计模式的实现,都并非标准的代码实现,都做了比较多的自我改进。实际上,这就是所谓的灵活应用, 只借鉴不照搬, 根据具体问题针对性地去解决。涉及到Mybatis源码知识和设计模式,这点我之前的博客均有涉及。可以查看我的专栏~ 点击上述文字也可以跳转至专栏信息页哦。

2025-04-06 17:42:20 846

原创 堆结构——面试算法题高频汇总

堆-数组中找k大、合并k个排序链表、数据流中位数......

2025-04-06 15:57:15 1013

原创 超大规模数据场景(思路)——面试高频算法题目

在海量数据中,此时普通的数组、链表、Hash、树等等结构有无效了 ,因为内存空间放不下了。而常规的递归、排序,回溯、贪心和动态规划等思想也无效了,因为执行都会超时,必须另外想办法。这类问题该如何下手呢?这里介绍三种非常典型的思路:位存储:使用位存储最大的好处是占用的空间是简单存整数的1/8。例如一个40亿的整数数组,如果用整数存储需要16GB左右的空间,而如果使用位存储,就可以用0.5GB的空间,这样很多问题就能够解决了。

2025-04-06 15:54:21 1104 1

原创 Java集合源码-List、Set、Map系列——读懂源码,不背八股~

K key;V value;

2025-04-05 15:57:57 806

原创 数字与数学——常见面试算法题

在算法中,一般只会选择各个学科的基础问题来考察,例如素数问题、幂、对数、阶乘、幂运算、初等数论、几何问题、组合数学等等。

2025-04-05 14:25:14 967

原创 状态模式~

将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。状态模式的使用必然会增加系统类和对象的个数。状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。状态模式对"开闭原则"的支持并不太好 (添加新的状态类需要修改那些负责状态转换的源代码)。对象根据自身状态的变化来进行不同行为的操作时, 比如,购物订单状态。

2025-04-05 13:15:19 372

原创 MySQL体系架构

MySQL由 连接池、管理工具与服务、SQL接口、解析器、优化器、缓存、存储引擎、文件系统组成。

2025-04-04 22:21:40 764

原创 MySQL系统库汇总

MySQL有4个系统数据库,这4个数据库包含了MySQL服务器运行过程中所需的一些信息以及一些运行状态信息。这个数据库里主要保存MySQL服务器运行过程中的一些状态信息,算是对MySQL服务器的一个性能监控。其中包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等等信息。这个数据库保存着MySQL服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引。这些是一些描述性信息,称之为元数据。

2025-04-04 21:50:24 1468 5

原创 搜索树——AVL、红黑树、B树、B+树

难度高,如果想要了解红黑树的增加、删除节点操作,一定要穷举画图理解!!!

2025-04-04 17:35:44 885

Java基础问题-八股盛宴 - 3w字分享

Java基础问题-八股盛宴 - 3w字分享

2025-05-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除