- 博客(67)
- 收藏
- 关注
原创 RabbitMQ的高级特性
消息到达Exchange之后, 会根据路由规则匹配, 把消息放⼊Queue中. Exchange到Queue的过程, 如果⼀条消息⽆法被任何队列消费(即没有队列与消息的路由键匹配或队列不存在等), 可以选择把消息退回给发送者. 消息退回给发送者时, 我们可以设置⼀个返回回调⽅法, 对消息进⾏处理。在有两个消费者的情况下,⼀个消费者处理任务⾮常快, 另⼀个⾮常慢,就会造成⼀个消费者会⼀直很忙, ⽽另⼀个消费者很闲. 这是因为 RabbitMQ 只是在消息进⼊队列时分派消息. 它不考虑消费者未确认消息的数量.
2025-04-15 09:15:00
689
原创 RabbitMQ应⽤问题
对于MQ⽽⾔, 幂等性是指同⼀条消息, 多次消费, 对系统的影响是相同的.⼀般消息中间件的消息传输保障分为三个层级.At most once:最多⼀次. 消息可能会丢失,但绝不会重复传输.At least once:最少⼀次. 消息绝不会丢失,但可能会重复传输.Exactly once:恰好⼀次. 每条消息肯定会被传输⼀次且仅传输⼀次.RabbitMQ⽀持"最多⼀次"和"最少⼀次".
2025-04-14 15:30:00
656
原创 性能 测试
负载测试(LoadTesting)是性能测试的一种测试类型,用于评估被测系统在预期的不同负载下的。被测系统施加一定压力,从而获取被测系统在单用户运行情况下的各项性能指标,为多用户并发。如,被测系统被多个用户同时登录时的响应能力,或系统的某一功能被多个用户同时操作时的性。负载测试关注系统处理不同负载的能力,这些负载可通过控制并发用户或者进程的数量来。作用:通过并发测试,不仅可以获得被测系统在多用户并发操作时的性能指标,还可以发现被。简而言之,负载测试是通过逐步加载的方式来确定系统的处理能力。
2025-04-09 23:22:25
326
原创 @AllArgsConstructor@Data@NoArgsConstructor的区别
不同:@AllArgsConstructor只会生成一个包含所有已声明字段的构造函数,如果类中的字段使用了。后,Lombok 会在编译时自动为类添加所有属性的 getter 和 setter 方法,以及。、@Setter和@RequiredArgsConstructor的功能使用。注解还会为类生成一个带有所有属性参数的构造函数(类似于。注解,生成的构造函数还会包含这些字段的非空字段。的字段生成一个必须参数的构造函数。相同:都是Lombok的三个注解。
2024-12-10 21:54:29
270
原创 MyBaits连接字符串和MyBatis的常见错误(BindingException)
这里的mapper一定是和mybatis有一个table的距离,否则判断不出来,当然出现下面的情况这样也是正确的。要注意你mapper所在文件主路径是否和yml中的配置一致,更需要找到他们之间配置的关系。查看相关信息是否一 一对应,如果没有则会导致文件互相无法找到。在applicaiton.yml中配置方式应该如图所示。出现上述错误的解决方法。
2024-09-02 16:30:40
299
原创 数据库原理实验报告第二次-SQL Server SSMS工具创建和管理数据库及数据表.
(1)为商品表product添加生产日期一列,列名为producedate,数据类型为smalldatetime,允许为空。(3)为商品表product属性列catno添加外键约束,catno参照商品类别表category中的属性列catno的值。(2)为订单表orders增加发货日期一列,列名为deliverdate,数据类型为datetime,允许为空。(5)为订单表orders中的属性列orderdate添加默认值约束,默认值为系统日期。是否下架,1代表下架,0代表在售,2代码删除,默认为0。
2024-07-04 11:30:00
1118
1
原创 数据库原理实验报告第一次-数据库设计
属性:物流ID (ShippingID),发货状态 (ShippingStatus),物流单号 (TrackingNumber), 发货时间 (ShippingDate)属性:订单ID (OrderID), 下单时间 (OrderDate), 状态 (Status), 总金额 (TotalAmount)属性:商品ID (ProductID), 名称 (Name), 价格 (Price), 库存 (Stock),发货状态,物流信息,发货时间,订单ID)下单时间,金额,状态,用户ID,商户ID)
2024-07-04 10:30:00
349
原创 测试与开发
动态测试(dynamictesting),指的是实际运行被测程序,输入相应的测试数据,检查实际输出结果和预期结果是否相符的过程,所以判断一个测试属于动态测试还是静态的,唯一的标准就是看是否运行程序。α测试不能由程序员或测试员完成。但是,灰盒测试没有白盒测试详细和完整,黑盒测试是覆盖产品范围最广的测试,因此灰盒测试基本是不能够替代黑盒测试,否则需要很大的代价,设计非常多的用例。灰盒测试,是介于白盒测试与黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。
2024-06-10 15:27:51
597
原创 js
通过控制台就能看到数据类型为object,可以通过键值对的方式将向数组内插入相应的数据,由于js是弱类型所以他是可以一个数组有多个数据类型的。string字符串类型,字符串字面值需要使用引号引起来,单引号双引号均可,ES6中新增的声明变量的关键字,作用域为该语句所在的代码块内。如果对应的位置没有数据,那么会用undefined来替代。弱类型/强类型:类型是否需要强制转换。javascirpt:动态弱类型语言。上面都是弱类型,都可以呗强制转换。==比较值,不校验类型。===值和类型都相等。
2024-06-04 09:48:08
474
1
原创 Web前端
1.建立web开发的息维模式写代码不仅仅是为了实现某个功能,更是学习解决问题的思维方式2.先使用,再理解,会导致刚开始比较懵,不知其所以然.切忌不可深陷其中,3.涉及简单的软件工程的设计思想(前后端分离思想,后端工程的分层思想)4.理解前后端交互的过程5.遇到的问题更加多样,除了代码带来的问题,还有环境带来的问题(各种缓存,导致现象看起来莫名其妙).6.需要大量的反复练习,来加深对这个知识点的理解,7.知识点上下文会经常有关联,需要仔细听才能搞懂各个知识点的逻辑关系,
2024-06-02 21:17:58
384
原创 用例篇03
因素:存在的条件水平:因素的取值最简单的正交表:L4(2)应用 allpairs 来实现正交表。步骤:1.根据需求找出因素和水平2.将因素和水平写入到excel表格中(表格不需要保存)(推荐用微软的)3.在allparis.exe同级文件夹下创建一个txt文件,将excel表格中的内容复制到txt文件中4.使用allparis.exe工具对txt文件生成正交表文件。5.根据生成好的正交表来编写测试用例,继续将重要的用例补全其中包含没有。
2024-06-02 20:42:19
651
原创 http&JVM
黑客首先受到服务器的公钥,黑客就向客户端发送pub2,然后客户端不知道公钥是不是服务器发来的,所以就会给出回应,基于pub2加密的对称密钥给予黑客,黑客针对刚才收到的pub2加密的数据进行解密,从而拿到这里的对称密钥!上述过程,主要为了应对这个场景:比如你自己代码里写了一个类,类的名字和标准库/扩展库冲突了,JVM会确保加载的类是标准库的类(就不加载你自己写的类]java.lang.String如果标准库的这个String加载不了,怕是整个Java进程没法正确工作了!
2024-05-28 13:06:37
1212
原创 HTTP2
Cookie是啥:浏览器本地存储数据的一种机制(不是唯一的一种,只是典型的一种)Cookie怎么存的:按照不同的域名,分别存储在硬盘上的.不同域名之间的cookie互不干扰键值对,存储文本.键和值都是用户自定义的.Cookie从哪里来:从服务器来.服务器的HTTP响应header中可以填写Set-Cookie字段,就会带有一些键值对。Cookie到哪里去:在后续请求中,通过HTTP请求的header中的Cookie字段,把信息传输给服务器。
2024-05-21 09:20:58
960
原创 HTTP协议
HTTP3.0!=Web3.0Web3.0=》区块链圈子里造出的一个名词是对于未来的一种美好憧憬短时间之内(20年之内)很难到达~HTTP3.0,则是基于UDP协议实现的.(人家在应用层实现了一套可靠传输机制)
2024-05-19 15:33:18
814
原创 网络原理3
运营商路由器,也可以把它当做一个NAT设备它就会对中间经过的数据包,进行网络地址转换当内网设备经过运营商路由器访问外网的时候就会把IP数据包中的源ip,替换成它自己的ip.我的电脑要发送一个数据给cctalk服务器此时,我的电脑上就会构造出一个IP数据包在两个连接时候会出现在运营商路由器的时候创建了一个表所以他就会根据查询的结果和这个表来转换将IP和端口都替换回来但是假设两个端口号是一样的呢?运营商通过在不用的源IP定义为不用的源端口号,这样就防止了,服务器只返回一个反馈的问题。
2024-05-18 23:35:34
643
原创 网络原理2
建立连接,就是通信双方,各自保存对端的信息~谁发起,谁就是客户端客户端和服务器各自给对方发送syn,再各自给对方返回一个ack一共,其实是4次交互~~关键在于,中间的两次交互ACK和SYN可以合并成一个网络数据。ACK:6个标志位第二位为1SYN:6个标志位第五位为1所谓的合并,就是让这一个TCP数据报,报头中,同时把两个bit都设为1。三次握手的时候,相当于,双方各自让对方保存自己的信息得是两边都把对方的信息保存好,连接才算是建立完成。保存对方的信息,就是对方的ip和端口。
2024-05-17 16:27:47
716
原创 概念+bug
增量模型是将一个大的需求变成小的功能,然后将每个功能逐个开发几乎完整再上线。迭代模型会上线一个基础版本,但是基础版本所有的功能都有但是非常简陋,之后再迭代优化上线。一般都是两个一起用,不具体区分迭代模型和增量模型。
2024-05-17 14:34:21
1035
原创 网络原理
B的内核态中有接受缓冲区,那会把接受的数据放入一个阻塞队列中,然后根据数据的序号来判定这个数据是否在队列中存在(或者曾经在队列中存在过)只要存在过,这个新的数据就不会进入队列,而是直接丢弃。在日常生活中,每个交换机或者路由器是有上限的,当一个机器转发的信息量过多,合作社超出自己能处理的极限的时候,就会把接下来多出来的信息直接丢弃。((首部长度的单位是4个字节)。在其中也会根据序号自动来排序,让序号小的,在前头,序号大的在后头,并且数据和数据之间的序号始终都是连续的,这样就能提高效率。通过发送的序号来去重。
2024-05-09 16:10:48
848
原创 网络原理
UDP端口号IP地址(确定主机)+端口号(在机上的应用程序)网络层提供的概念 传输层提供的概念一个字节:有符号-128=>+127无符号0=>255两个字节:有符号:-32768=>+32767无符号0=>65535四个字节:有符号:-21亿=>+21亿无符号:0=>42亿9千万同一个机器上,同一时刻内,端口号不能重复被绑定。某个进程A绑定了10000端口号,此时进程B也尝试绑定10000端口,此时B就会绑定失败!
2024-04-30 08:54:06
854
原创 网络编程
当数据交给上一层的时候,是由哪个协议负责进行解析呢??比如,数据链路层=>网络层,交给IPv4解析?IPv6解析?网终层=>传输层交绘TCP解析还是IDP2。socket=>操作系统提供的网络编程的API就称为socketapi(插槽),可以认为是“网络编程api”的统称。
2024-04-25 15:13:48
996
原创 HashTable, HashMap, ConcurrentHashMap 之间的区别
HashTable是线程安全的类,很多方法都是用synchronized修饰,但同时因为加锁导致并发效率低下,单线程环境效率也十分低;但HashTable不允许键或值为null;HashTable底层数组长度可以为任意值,这就造成了hash算法散射不均匀,容易造成hash冲突,默认为11;HashTable的hash算法首先使得hash值小于整型数最大值,再通过取模进行散射运算;
2024-04-16 09:46:34
299
4
原创 多线程8
在这个线程中如果变成了这样这两个东西不相等,就会产生bug,上述的过程就属于ABA问题的典型bug场景是非常高极端的情况如何避免ABA问题呢??核心思路是,使用账户余额判定,本身就不太科学.账户余额本身就属于"能加也能减”,就容易出现ABA问题,引入"版本号”,约定版本号,只能加,不能减~~每次操作一次余额,版本号都要+1通过CAS判定版本号,就可以进一步的来完成上述的操作~~一个版本号走一步。
2024-04-15 16:11:19
500
原创 多线程7
判断条件:加锁的时候,预测当前锁冲突的概率是大还是小预测当前锁冲突概率大,后续要做的工作往往就会更多.加锁开销就更大(时间,系统资源)=>悲观锁预测当前锁冲突概率不大,后续要做的工作往往就更少.加锁开销就更小(时间,系统资源)=>乐观锁synchronized是属于既是乐观锁,也是悲观锁,它支持自适应.synchronized能够自动的统计出当前的锁冲突的次数,进行判定当前是锁冲突概率低,还是概率高当冲突概率低的时候,就是按照乐观锁的方式来执行的.(速度更快)
2024-04-12 20:24:23
521
原创 多线程6
线程池的应用上述中 i 存在问题,这是变量捕获问题,i一直在改变不能在print中使用,所以更改代码如下创建线程池一个线程池要包含哪些东西?1)有若干个线程2)有任务队列.(使用Runnable即可)3)提供submit方法main线程的任务是先是创建对象,通过调用MyThreadPoll的构造方法来创建n个线程,然后各个线程进入无限循环,然后等到有任务进入,然后通过sbimt方法添加到任务队列queue,然后到任务队列,任务队列将其分布到各个线程最后达到线程池的作用。
2024-04-12 13:07:30
438
原创 多线程5
wait不仅仅会被notify和notifyAll唤醒也可能被其他的操作唤醒比如interrupt。优化再用wait方法的时候,应该搭配while判断条件的方式。这样的话就可以在被唤醒的时候再次确认,条件是否能再次成立,防止他覆盖到原来的哪些元素,当然这里的while循环对资源的调度是很小的,所以在执行了很多次以后就会忽略,防止了循环过多次而造成的死循环。当然wait也是可以被interrupt打断的。
2024-04-11 14:54:12
706
原创 多线程4
想获取到第二把锁,就需要执行完第一层大括号,想要执行完第一层大括号,就要先获取到第二层的锁。例子:t2先启动,t2进行加锁后一定成功,但是如果t2进行二次加锁的时候因为counter2已经被锁定了,所以他需要外层大括号的counter2进行解锁,但是这又是加锁操作,所以就会一直阻塞等待,于是就矛盾了,产生了对峙的画面(狗咬狗不松口)。"引用计数"可重入锁,防止程序员搞成死锁。如何判定,当前遇到的}是最外层的}??JVM 是咋知道的??更简单的办法,就是给锁对象里也维护一个计数器。
2024-04-07 22:29:56
950
原创 多线程3
synchronized下面跟着{}当进入到代码块,就是给上述()锁对象进行了加锁操作当出了代码块,就是给上述()锁对象进行了解锁操作看不到形如lock()unlock0方法的(其他语言都是这么搞的)Java 中随便拿一个对象, 都可以作为加锁的对象.(这个是 Java 中特立独行的设定)其他语言中(C++,Go, Python....) 都是只有极少数特定的对象可以用来加锁.一个线程获取到锁之后,另一个线程也尝试加这个锁,就会阻塞等待,(也叫做锁竞争/锁冲突)
2024-04-06 00:26:17
861
原创 多线程2
但是t1和t2的线程是在main执行的时候也在执行,他只是等待结束,并不是有了main执行到了join才开始。由于当前线程执行的顺序不确定,有些执行顺序,加两次,结果正确的有些执行顶序,加两次,最后只增加 1。线程 是随机调度,抢占式执行.=>这样的随机性,就会使程序的执行顺序,产生变数 =>不同的结果.假设在main线程调用t.join,main线程就会等待t,t结束后,main也结束了。t线程没有结束,join堵塞等待,等到t结束后,join就会解除堵塞状态,继续执行,
2024-04-02 09:58:43
317
原创 多线程
线程,本身是操作系统提供的.操作系统提供了 API 让我们操作线程JVM 就对 操作系统 api 进行了封装.线程这里,提供了 Thread 类, 表示线程整个代码中有两个线程,thread线程还有main方法所在的线程即是主线程,可以通过jvm中的jconsole工具来看到县城的运行可以通过Thread睡眠来让线程进入阻塞状态多个线程调度顺序是"无序"的,抢占式执行。任何一个线程,在执行到任何一个代码的过程中,都可能被其他线程抢占掉它的 cpu 资源.于是 cpu 就给别的线程执行了.
2024-03-27 14:38:13
361
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人