- 博客(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
原创 FutureTask和CompleteableFuture源码分析
同步:做了同步操作后,被调用者不会主动通知我结果,我需要主动查看结果。异步:做了异步操作后,被调用者会主动通知我结果是什么。阻塞:调用功能后,不能做其他事情。非阻塞:调用功能后,可以做其他事情。
2025-05-06 14:24:09
598
原创 Java ScheduledThreadPoolExecutor 源码解析 | 定时任务&周期性任务
ScheduledThreadPoolExecutor是Java并发包中的一个类,继承自ThreadPoolExecutor,主要用于执行定时任务和周期性任务。它实现了ScheduledExecutorService接口,提供了多种方法来安排和执行定时任务。
2025-05-05 09:31:46
939
原创 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
原创 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初探——走进类加载机制|三大特性 | 打破双亲委派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
原创 剖析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
原创 超大规模数据场景(思路)——面试高频算法题目
在海量数据中,此时普通的数组、链表、Hash、树等等结构有无效了 ,因为内存空间放不下了。而常规的递归、排序,回溯、贪心和动态规划等思想也无效了,因为执行都会超时,必须另外想办法。这类问题该如何下手呢?这里介绍三种非常典型的思路:位存储:使用位存储最大的好处是占用的空间是简单存整数的1/8。例如一个40亿的整数数组,如果用整数存储需要16GB左右的空间,而如果使用位存储,就可以用0.5GB的空间,这样很多问题就能够解决了。
2025-04-06 15:54:21
1104
1
原创 数字与数学——常见面试算法题
在算法中,一般只会选择各个学科的基础问题来考察,例如素数问题、幂、对数、阶乘、幂运算、初等数论、几何问题、组合数学等等。
2025-04-05 14:25:14
967
原创 状态模式~
将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。状态模式的使用必然会增加系统类和对象的个数。状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。状态模式对"开闭原则"的支持并不太好 (添加新的状态类需要修改那些负责状态转换的源代码)。对象根据自身状态的变化来进行不同行为的操作时, 比如,购物订单状态。
2025-04-05 13:15:19
372
原创 MySQL系统库汇总
MySQL有4个系统数据库,这4个数据库包含了MySQL服务器运行过程中所需的一些信息以及一些运行状态信息。这个数据库里主要保存MySQL服务器运行过程中的一些状态信息,算是对MySQL服务器的一个性能监控。其中包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等等信息。这个数据库保存着MySQL服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引。这些是一些描述性信息,称之为元数据。
2025-04-04 21:50:24
1468
5
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人