自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RabbitMQ--延迟队列&事务&消息分发

延迟队列(Delayed Queue),即消息被发送以后, 并不想让消费者立刻拿到消息, 而是等待特定时间后, 消费者才能拿到这个消息进行消费1.1应用场景延迟队列的应用场景有很多,比如:智能家居: 用户希望通过手机远程遥控家⾥的智能设备在指定的时间进行⼯作. 这时候就可以将用户指令发送到延迟队列, 当指令设定的时间到了再将指令推送到智能设备.日常管理: 预定会议后,需要在会议开始前⼗五分钟提醒参会人参加会议用户注册成功后, 7天后发送短信, 提高用户活跃度等......

2025-03-30 18:27:39 1184

原创 RabbitMQ高级特性--TTL和死信队列

TTL(Time to Live, 过期时间), 即过期时间. RabbitMQ可以对消息和队列设置TTL.当消息到达存活时间之后, 还没有被消费,就会被自动清除。1.1设置消息的TTL目前有两种方法可以设置消息的TTL一是设置队列的TTL,队列中所有消息都有相同的过期时间,二是对消息本身进行单独设置,每条消息的TTL可以不同,如果两种方法一起使用,则消息的TTL以两者之间较小的那个数值决定。先看针对每条消息设置TTL。

2025-03-30 17:16:13 1030

原创 RabbitMQ高级特性--重试特性

在消息传递过程中, 可能会遇到各种问题, 如网络故障, 服务不可用, 资源不足等, 这些问题可能导致消息处理失败. 为了解决这些问题, RabbitMQ 提供了重试机制, 允许消息在处理失败后重新发送.但如果是程序逻辑引起的错误, 那么多次重试也是没有用的, 可以设置重试次数。

2025-03-29 21:13:26 680

原创 RabbitMQ高级特性--发送方确认

1. confirm确认模式在使用RabbitMQ的时候, 可以通过消息持久化来解决因为服务器的异常崩溃而导致的消息丢失, 但是还有⼀个问题, 当消息的生产者将消息发送出去之后, 消息到底有没有正确地到达服务器呢?如果在消息到达服务器之前已经丢失(比如RabbitMQ重启, 那么RabbitMQ重启期间生产者消息投递失败), 持久化操作也解决不了这个问题,因为消息根本没有到达服务器,何谈持久化?RabbitMQ为我们提供了两种解决方案:1. 通过事务机制实现2. 通过发送方确认机制实现。

2025-03-29 20:48:31 787

原创 RabbitMQ高级特性--持久性

一、交换机持久化我们在前面讲了消费端处理消息时, 消息如何不丢失, 但是如何保证当RabbitMQ服务停掉以后, 生产者发送的消息不丢失呢. 默认情况下, RabbitMQ退出或者由于某种原因崩溃时, 会忽视队列和消息, 除非告知他不要这么做.RabbitMQ的持久化分为三个部分:交换器的持久化、队列的持久化和消息的持久化一、交换机持久化。

2025-03-10 20:57:59 354

原创 JVM内存区域划分以及GC原理

JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统。常见的虚拟机:JVM、VMwave、Virtual Box。JVM 和其他两个虚拟机的区别:1.VMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器;2.JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进行了裁剪。

2025-03-10 16:09:16 1144

原创 RabbitMQ高级特性--消息确认机制

生产者发送消息之后,到达消费端之后,可能会有以下情况:1. 消息处理成功;2. 消息处理异常。RabbitMQ向消费者发送消息后,就会把这条消息删除掉,那么第二种情况就会造成消息丢失。那么如何确保消息端已经被成功接收了并且被正确处理了呢?为了确保消息从队列可靠的到达消费者,RabbitMQ提供了消息确认机制(Messageacknowledment)。

2025-03-09 22:13:26 843

原创 基于Spring3的抽奖系统

1. 策略模式(Strategy Pattern):定义 AbstractActivityOperator 策列类,和其策略实现类PrizeOperator、ActivityOperator 和 UserOperator。每个具体的操作类都实现了AbstractActivityOperator 定义的接⼝,代表了不同的状态转换策略。

2025-03-09 19:29:30 1063

原创 高阶数据结构--B树&&B+树实现原理&&B树模拟实现--Java

1. 如果树为空,直接插入新节点中,该节点为树的根节点2. 树非空,找待插入元素在树中的插入位置(注意:找到的插入节点位置一定在叶子节点中)3. 检测是否找到插入位置(假设树中的key唯一,即该元素已经存在时则不插入)4. 按照插入排序的思想将该元素插入到找到的节点中5. 检测该节点是否满足B-树的性质:即该节点中的元素个数是否等于M,如果小于则满足6. 如果插入后节点不满足B树的性质,需要对该节点进行分裂:(1申请新节点(2找到该节点的中间位置。

2024-12-08 14:28:24 1198

原创 高阶数据结构--并查集--Java

比如:某公司今年校招全国总共招生10人,西安招4人,成都招3人,武汉招3人,10个人来自不同的学校, 起先互不相识,每个学生都是一个独立的小团体,现给这些学生进行编号:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};给以下 数组用来存储该小集体,数组中的数字代表:该小集体中具有成员的个数。负号下文解释毕业后,学生们要去公司上班,每个地方的学生自发组织成小分队一起上路,于是: 西安学生小分队s1={0,6,7,8},成都学生小分队s2={1,4,9}

2024-12-05 19:31:57 750 1

原创 高阶数据结构--位图和布隆过滤器--Java

特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函 数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种。紧凑型的、比较巧妙的概率型数据结构。七、布隆过滤器模拟实现。十、布隆过滤器应用场景。

2024-11-27 17:19:28 739

原创 文件IO--文件操作和IO--JAVA

针对硬盘这种持久化存储的I/O设备,当我们想要进⾏数据保存时, 往往不是保存成⼀个整体,⽽是独⽴成⼀个个的单位进⾏保存,这个独⽴的单位就被抽象成⽂件的概 念,就类似办公桌上的⼀份份真实的⽂件⼀般。除了可以从根开始进⾏路径的描述,我们可以从任意结点出发,进⾏路径的描述,⽽这种描述⽅式就 被称为相对路径,相对于当前所在结点的⼀条路径。文件除了有数据内容以外,还有一部分信息,例如文件名,文件类型,文件大小,这些信息并不作为文件的数据存在,我们将其称为文件的元信息。类来对⼀个⽂件(包括⽬录)进⾏抽象的描述。

2024-11-23 16:22:35 561

原创 多线程--CAS--JAVA

假设存在两个线程 t1 和 t2. 有⼀个共享变量 num, 初始值为 A.接下来, 线程 t1 想使⽤ CAS 把 num 值改成 Z, 那么就需要先读取 num 的值, 记录到 oldNum 变量中.使⽤ CAS 判定当前 num 的值是否为 A, 如果为 A, 就修改成 Z.

2024-11-21 16:15:08 577

原创 多线程--常见锁策略--Java

Java⾥只要以Reentrant开头命名的锁都是可重⼊锁,⽽且JDK提供的所有现成的Lock实现类,包括 synchronized关键字锁都是可重⼊的。但是直接来找两次⽼师之后, 发现⽼师都挺忙的, 于是下次再来问问题, 就先发个消息问问⽼师忙不忙,其中, 读加锁和读加锁之间, 不互斥. 写加锁和写加锁之间, 互斥. 读加锁和写加锁之间, 互斥.synchronized 开始是⼀个轻量级锁. 如果锁冲突⽐较严重, 就会变成重量级锁。⼊锁(因为这个原因可重⼊锁也叫做递归锁)。二、重量级锁VS轻量级锁。

2024-11-19 19:43:32 1076

原创 TCP/IP--Socket套接字--JAVA

简单来说,我们知道计算机中的“文件”通常是一个广义的概念。文件还能代指一些硬件设备。那么我们就可以将网卡抽象成Socket文件,操作网卡的时候就和操作普通文件差不多分为三步,打开-->读写-->关闭。由于操作网卡,直接操作是不好操作的,所以我们将操作网卡转换成操作socket文件,socket文件就相当于“网卡的遥控器”。

2024-11-15 15:45:49 1330

原创 网络初识--Java

IP地址主要⽤于标识⽹络主机、其他⽹络设备(如路由器)的⽹络地址。简单说,IP地址⽤于定位主 机的⽹络地址。就像我们发送快递⼀样,需要知道对⽅的收货地址,快递员才能将包裹送到⽬的地。综上所述 IP地址是标识网络一台设备所在的位置。有些资料把物理层和数据链路层看作一个整体。分用,数据到达接收方主机,逐层进行解析。三、网络数据通信的基本流程。

2024-11-14 17:29:35 1031

原创 MySql--多表查询及聚合函数总结

1.COUNT(列||*):统计结果的个数。 2.SUM(列):求和。 3.AVG(列):求平均值。 4.MIN(列) 最小值。 5.MAX(列) :最大值。 对某一个字段进行分组操作,分组后可以结合聚合函数进行一些运算。 对GROUP BY的结果进行过滤 select * from table1,table2 where table1.xxx=table2.xxx; select * from table1 join table2 on table1.xxx=table2.xxx; s

2024-11-12 14:37:42 1252 1

原创 MySql--增删改查表设计总结

select * from 表名 order by 列名 asc||desc limit num offset start;列名[,列名]... from 表名 where 列名 between 开始条件 and 结束条件;select 列名[,列名]... from 表名 order by 列名 asc||desc;insert into 表名 [(列名[,列名]...)] values (值[,值]...);select distinc 列名[,列名]... from 表名;

2024-11-12 14:08:46 774

原创 多线程--模拟实现定时器--Java

至此我们模拟实现定时器基础的架构就构造完毕了,然后我们实现定时器最核心的schedule方法 即可。

2024-11-05 20:05:20 473

原创 多线程--简单模拟实现线程池并使用--Java

阅读这篇博客之前建议先读,里面有对线程池的详细介绍,这边就不过多赘述。

2024-11-05 18:27:55 281

原创 多线程--线程池概念以及使用--Java

第二个拒绝策略 CallerRunsPolicy,让调用submit的线程自行执行任务,这种做法不推荐使用,如果调用submit就阻塞(业务逻辑上的线程调用submit)就会使这个线程无法做别的事情,这不是一个好的选择。由于线程池的使用有些繁琐,所以Java标准库基于工厂设计模式针对ThreadPoolExecutor进一步进行了封装,简化了线程池的使用。第四个拒绝策略 DiscardPolicy,是丢弃最新的任务(当前submit的任务)。三、Java标准库中线程池的简化使用。

2024-10-30 18:29:26 728

原创 LeetCode--买卖股票的最佳时机Ⅲ--动态规划

值得注意的是我们的纵坐标是从0开始的所以填表过程中可能越界,需要添加判断语句来防止越界。由于题目中所说最多交易两次,所以我们获得最大利润交易了0,1,2次都有可能,所以最后的返回值是g[n-1]这一行的最大值。

2024-10-28 18:46:17 341

原创 LeetCode--图像渲染--floodfill算法

floodfill算法就是再矩阵中找到性质相同的连通块,可以使用dfs(深度优先遍历)来解决或者是bfs(宽度优先遍历),本文采用dfs来解决。

2024-10-27 20:11:55 316

原创 多线程--阻塞队列性质以及基于数组模拟实现阻塞队列--Java

阻塞队列其实就是一种更复杂的队列,主要有以下特性。

2024-10-27 19:39:36 457

原创 LeetCode--买卖股票的最佳时机含手续费--动态规划

考虑 g[i]的转移方程,如果这一天交易完后手里没有股票,那么可能的转移状态为前一天已经没有股票,即 g[i−1],或者前一天结束的时候手里持有一支股票,即 f[i−1],这时候我们要将其卖出,并获得 prices[i] 的收益,但需要支付 fee 的手续费。考虑 f[i]按状态转移,那么可能的转移状态为前一天已经持有一支股票,即 f[i−1],或者前一天结束时还没有股票,即 g[i−1],这时候我们要将其买入,并减少 prices[i] 的收益。

2024-10-25 12:00:49 561

原创 LeetCode--验证二叉搜索树--深度优先遍历dfs

这启示我们在中序遍历的时候实时检查当前节点的值是否大于前一个中序遍历到的节点的值即可。如果均大于说明这个序列是升序的,整棵树是二叉搜索树,否则不是.首先说一下二叉搜索树的概念,

2024-10-24 21:18:10 282

原创 LeetCode--买卖股票的最佳时机含冷冻期--动态规划

对于 dp[i][2],我们在第 i 天结束之后不持有任何股票并且不处于冷冻期,说明当天没有进行任何操作,即第 i−1 天时不持有任何股票:如果处于冷冻期,对应的状态为 f[i−1][1];如果不处于冷冻期,对应的状态为 dp[i−1][2]。对于 dp[i][1],我们在第 i 天结束之后处于冷冻期的原因是在当天卖出了股票,那么说明在第 i−1 天时我们必须持有一支股票,对应的状态为 dp[i−1][0] 加上卖出股票的正收益 prices[i]。

2024-10-24 20:58:38 602

原创 LeetCode--粉刷房子--动态规划

每个房子可以被粉刷成三种颜色中的一种,需要计算在满足相邻房子的颜色不同的情况下粉刷所有房子的最小花费成本。由于当已知粉刷前 i 个房子的最小花费成本时,根据粉刷第 i+1 号房子的花费成本可以计算粉刷前 i+1 个房子的最小花费成本,因此可以使用动态规划计算最小花费成本。用 dp[i][j] 表示粉刷第 0 号房子到第 i 号房子且第 i 号房子被粉刷成第 j 种颜色时的最小花费成本。由于每个房子可以被粉刷成三种颜色中的一种,因此需要分别考虑粉刷成三种颜色时的最小花费成本。

2024-10-24 10:47:46 324

原创 LeetCode--删除并获得点数--动态规划

根据题意,在选择了元素 x 后,该元素以及所有等于 x−1 或 x+1 的元素会从数组中删去。若还有多个值为 x 的元素,由于所有等于 x−1 或 x+1 的元素已经被删除,我们可以直接删除 x 并获得其点数。因此若选择了 x,所有等于 x 的元素也应一同被选择,以尽可能多地获得点数。

2024-10-23 20:49:57 351 1

原创 LeetCode--第N个泰波那契数--动态规划

大家应该都知道斐波那契数,这道题就是利用斐波那契模型解决问题的。

2024-10-23 20:12:37 197

原创 【无标题】LeetCode刷题--双指针--移动零

题意简单易懂,就是把数组中的零移动到数组后几位并且保证非零元素的相对顺序。

2024-10-23 19:51:26 171

原创 Java——汉诺塔问题(递归实现)

汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

2024-04-28 20:41:18 547 4

原创 C语言小项目——小游戏贪吃蛇的实现

我们采用链表来定义蛇,可以使用一个结构体定义蛇身一个节点的x坐标以及y坐标,使用链表链接。

2024-04-22 21:10:58 2029 18

原创 C语言顺序表的增删查改以及实际应用(通讯录的实现)

这样做的优点在于。

2024-04-10 19:04:12 1819 5

原创 C语言浮点数在内存中的存储

十进制的-5.0,写成二进制就是-101.0,相当于-1.01*2^2,则S=1,M=1.01,E=2.对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2。

2024-03-21 20:32:48 300 1

原创 C语言自定义类型:结构体

(博主使用的vs2022默认对齐数为8)

2024-03-19 21:56:06 273 3

原创 C语言字符串函数

该函数是这些函数中最为常见的一个函数,用于求字符串除‘\0’以外的长度,遇到'\0'停止。函数内核模拟实现大概如下代码。

2024-03-14 12:37:17 370 1

原创 C语言指针汇总

指针数组是存放指针的数组,也就是说其本质是数组,存放的是各个元素的地址。指针是指向内存中的地址的变量,换言之,指针就是地址。指向非指针变量地址的指针即为一级指针。

2024-03-07 16:30:20 375 1

原创 C语言栈的简单实现

以下是函数定义及函数接口的实现。

2024-01-31 17:09:59 527 3

原创 C语言数组函数简单实战-------扫雷游戏的实现

之后开始实现game函数,普通扫雷是九宫格结构,所以我们创立两个二维数组,一个负责存储雷点和正常,一个用来记录周围雷的个数。这边不一一赘述,代码逻辑很清晰。game.h负责函数的声明以及头文件的设立,game.c负责函数接口的实现,text.c负责主函数。扫雷的第一步当然是打印扫雷目录了,在text.c文件中设立menu函数打印列表。然后在main函数内利用选择和循环语句实现多次游玩。

2024-01-31 15:20:11 394 1

空空如也

空空如也

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

TA关注的人

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