- 博客(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
第二个拒绝策略 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
原创 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
原创 Java——汉诺塔问题(递归实现)
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
2024-04-28 20:41:18
547
4
原创 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语言指针汇总
指针数组是存放指针的数组,也就是说其本质是数组,存放的是各个元素的地址。指针是指向内存中的地址的变量,换言之,指针就是地址。指向非指针变量地址的指针即为一级指针。
2024-03-07 16:30:20
375
1
原创 C语言数组函数简单实战-------扫雷游戏的实现
之后开始实现game函数,普通扫雷是九宫格结构,所以我们创立两个二维数组,一个负责存储雷点和正常,一个用来记录周围雷的个数。这边不一一赘述,代码逻辑很清晰。game.h负责函数的声明以及头文件的设立,game.c负责函数接口的实现,text.c负责主函数。扫雷的第一步当然是打印扫雷目录了,在text.c文件中设立menu函数打印列表。然后在main函数内利用选择和循环语句实现多次游玩。
2024-01-31 15:20:11
394
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人