- 博客(42)
- 资源 (1)
- 收藏
- 关注
原创 ElasticSearch-文档查询
ElasticSearch-文档查询,查询某个索引下的全部文档,根据查询条件查询文档,分页查询,查询指定返回的字段,排序,多条件查询,范围查询,全文检索与完全匹
2023-05-21 14:21:43
4471
原创 rabbitMq发布确认
rabbitMq存在消息丢失的风险,包括生产者消息丢失,服务器消息丢失,消费者消息丢失这3种情况。批量消息的发布确认其实和单条消息的确认方案非常像,只是在消息确认的时候是以一个批次多条消息的方式进行确认。但这种方式有一个缺点一旦消息发布确认结果是失败的,就只能知道是这个批次中有某些消息是未发送到Broker,但不知道具体是哪条消息。消息发布确认主要包括单条消息发布确认,批量消息发布确认,消息异步确认这三种方案,在工作中选择使用消息异步确认的方案是最多最常用的。
2023-01-29 21:57:03
533
原创 RabbitMq生产者发送消息确认
一般情况下RabbitMq的生产者能够正常的把消息投递到交换机Exchange,Exchange能够根据路由键routingKey把消息投递到队列Queue,但是一旦出现消息无法投递到交换机Exchange,或无法路由到Queue的这种特殊情况下,则需要对生产者的消息进行缓存或者保存到数据库,后续在调查完RabbitMq服务器的问题之后,待RabbitMq服务器正常之后,需要对这些消息进行重新投递。当项目启动后,然后把交换机Exchange删除后,然后生产者发送消息时会提示交换机不存在。
2023-01-29 21:43:46
2559
原创 RabbitMq死信队列
死信队列是指消息被投递到队列后,由于各种原因导致队列中的消息无法被消费掉,这样的消息如果没有后续处理就变成了死信,有死信自然就有了死信队列。如果是固定的过期时间则可以通过队列设置过期时间的方式实现。当过期时间不固定且有很多的过期时间且不希望有过多的过期队列时则可以使用插件的方式(rabbitmq_delayed_message_exchange插件)实现延迟队列的效果。一定不能通过设置生产者的过期时间来实现消息的任意过期时间的目的,否则就会出现我们示例中的问题。
2023-01-25 21:47:32
1512
原创 RabbitMq交换机Exchange
RabbitMq中的生产者的消息不是直接发送到队列中供消费者消费的,而是发到Exchange交换器。然后通过Exchange交换机中的路由规则routingKey来决定消息是发送到哪个队列中。
2023-01-21 20:35:38
379
原创 rabbitMq持久化
rabbitMq持久化分为队列持久化、消息持久化和交换器持久化。如果不开启持久化,则消息和队列只在内存中,当rabbitMq服务器故障重启后,会导致消息丢失。开启了持久化,队列和消息会保存到硬盘上,服务器重启后依然能找到消息。
2023-01-21 20:33:57
549
原创 rabbitMq不公平分发
rabbitMq默认是公平分发的,即轮询分发,有多少个消费者,多少个消费者平均消费消费。具体例子请看我之前写的文章《rabbitMq消息应答--ack机制》。但是在工作中,我们希望消费速度快的机器就消费更多的消息。这时候我们可以在消费者设置channel.basicQos(1);不公平分发,来让消费速度快的消费者消费更多的消息。
2023-01-07 21:58:15
499
原创 rabbitMq消息应答--ack机制
消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了,会导致消息丢失。RabbitMq可以通过消费者在消费完消息后再手动应答(ack机制)的方式通知Broker服务端消息已经消费完。
2023-01-07 21:56:10
2408
原创 rabbitMq入门
RabbitMq是一个非常常用的MQ消息队列,RabbitMq实现了AMQP协议。本文简单的介绍一下amqp-client客户端实现一个简单的生产者和消费者示例。
2023-01-07 21:50:40
101
原创 java连接SFTP
Jsch是一个纯粹的用java实现SSH功能的java library,支持密码登录方式和秘钥登录方式。用密码登录,就是和我们用ftp的账号密码登录一样,比较简单。秘钥登录方式,就需要把客户端的公钥放到SFTP服务器,然后客户端需要用秘钥登录。
2022-12-24 23:46:43
4242
原创 SpringBoot中事件的使用
SpringBoot项目默认是支持事件的,我们只需要自定义事件,然后发布事件,之后监听事件处理业务逻辑即可。SpringBoot中我们会用到事件抽象类ApplicaltionEvent,事件监听接口ApplicationListener,事件发布接口ApplicationEventPublisher或ApplicationContextAware。
2022-12-18 17:07:29
1408
原创 ShardingSphere-JDBC5.2多个数据库水平分表
ShardingSphere-JDBC5.2整合mybatisPlus实现多个数据库的水平分表功能,项目需要了解mybatisPlus, 基本上是在mybatisPlus的基础上加上 sharding-jdbc的水平分片的配置实现了多个数据库每个数据库只有一张表的水平分表需求。
2022-11-05 19:25:18
1242
原创 ShardingSphere-JDBC5.2单库水平分表
本文演示的是ShardingSphere-JDBC5.2整合mybatisPlus实现单库的水平分表功能,项目需要了解mybatisPlus, 基本上是在mybatisPlus的基础上加上 sharding-jdbc的水平分片的配置实现了一个数据库多个表的水平分表需求。如果id=1,则id%3 = 1,则最终解析为查询shop_user_1表。如果id=2,则id%3=2,则最终解析为查询shop_user_2表。如果id=3,则id%3=0,则最终解析为查询shop_user_0表。
2022-11-05 19:23:29
1278
原创 ShardingSphere-JDBC5.2整合mybatisPlus入门
当单表的数据量非常大,已经达到了数据库的IO瓶颈时,即使是尝试了加索引,读写分离等方案之后,单表的查询速度还是非常慢。这时候就可以考虑使用水平分表的方案,即通过把单表的数据拆分存放到多个表里面,以达到降低单表数据量从而提高查询速度的目的。当单库的连接数过多,单库已经无法支持更多的连接数时,这时候可以考虑分库方案,通过把单一数据库拆分为多个数据库,使得连接可以去到不同的数据库,以达到降低单库的连接数过高的目的。
2022-11-05 19:22:13
3401
2
原创 CountDownLatch等待多个任务结束后再执行下一个任务
JUC包中的CountDownLatch类是一个同步工具类,可实现线程间的通信。主要适合于需要等待多个任务完成后才能继续执行下一个任务的场景。例如在service层中同时访问了多个远程接口,但是需要获取多个远程接口的返回值,然后把这些返回值聚合起来的场景。例如在主线程中开了多个线程去insert数据,主线程需要确保所有的数据都insert完之后才能继续执行下一步操作的场景。总之就是需要等待多个异步线程都处理完,主线程才能继续执行的场景都时候使用CountDownLatch。
2022-10-07 16:25:11
469
原创 冷热分离解决方案
业务背景:系统在使用的过程中随着业务数据量越来越多,已经超过了数据库中单表的承受能力,系统的瓶颈在数据库IO上,这时候可以通过冷热数据分离的方式来解决查询速度慢的问题。数据库IO瓶颈的解决方案除了冷热分离,还有读写分离,分库分表等方案。
2022-10-07 15:44:24
1666
原创 List集合进行分组
在开发过程中会经常遇到把一个List集合中的对象按照某个属性进行分组,然后把分组后的结果再另外处理的这种情况。分组的时候如果是比较简单的只需要分一次组,复杂情况时需要进行二次分组,甚至三次分组。我们可以使用Collectors.groupingBy 来提高工作效率。
2022-10-05 15:27:18
14869
原创 SpringBoot事务失效场景和解决办法
Springboot的@Transcational 事务会存在失效场景,要想了解SpringBoot的事务需要先了解一下SpringBoot的事务回滚是对哪些Exception有效的,从源码来看SpringBoot只会对RuntimeException进行回滚,除非指定了回滚类型为Exception,就能对所有的Exception进行回滚。
2022-09-12 17:50:22
3045
原创 JVM垃圾回收器
JVM有7种经典垃圾回收器。Serial 收集器,Serial Old收集器,ParNew收集器,Parallel Scavenge收集器,Parallel Old 收集器,CMS收集器,G1收集器。其中在单CPU时比较时候Serial+Serial Old的垃圾收集器。在多CPU环境下比较时候Parallel + Parallel Old收集器或G1收集器。
2022-09-04 14:51:36
324
原创 JVM的垃圾回收算法
JVM的垃圾回收算法按阶段分为两类:一类是标记阶段的算法,另外一类是清除阶段算法。垃圾标记阶段主要是判断哪些对象是存活对象,哪些对象是死亡对象,只有被标记为死亡的对象,GC在执行垃圾回收时,才会释放其占用的内存空间。在垃圾标记阶段有两种算法来判断对象是否存活,一种是引用计数算法,另外一种是可达性分析算法。...
2022-09-01 08:26:57
139
原创 内存溢出和内存泄漏
内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;内存泄漏是指程序在申请内存后,无法释放已申请的内存空间
2022-08-24 22:10:55
239
原创 JVM的方法区详解
在jdk1.6之前,永久代存放了类的信息,包括字符串常量池,静态变量等信息,类加载得越多,永久代需要的内存空间就越大,但是在full GC的时候才有可能进行永久代的垃圾回收,但是在永久代的垃圾回收一般来说效率很低(首先该类的所有实例对象都已经从Java堆内存里被回收,其次加载这个类的ClassLoader已经被回收,对该类的Class对象没有任何引用,要满足这3个条件),导致永久代没办法被回收。已经删除永久代,用元空间替代了永久代,但这时候的元空间是本地内存实现的,而不是像堆这种jvm的虚拟内存。...
2022-08-18 23:31:10
584
原创 http请求webservice接口
webservice服务数量比较少,且不希望引入Apche CXF这种第三方的jar包时可以直接使用http请求的方式。本文提供http请求需要账号密码验证的webservice服务的示例。
2022-07-29 12:14:20
5704
原创 从java8之后HashMap的put方法分析HashMap是怎么实现的
从java8的HashMap的put方法分析hashMap是如何实现的。
2022-07-24 21:32:00
299
原创 java线程池创建线程过程及使用建议
java中经常需要用到多线程来处理一些业务,有很多人直接在使用多线程的时候直接继承Thread或者实现Runnable接口的方式来创建线程,但这种方式在创建及销毁线程耗费资源、线程上下文切换问题,同时创建过多的线程也可能引发资源耗尽的风险。这个时候引入线程池比较合理,方便线程任务的管理。本文就线程池的线程创建过程进行demo分析及如何创建线程池给出一些建议。...
2022-07-12 23:04:22
2466
原创 mysql5.7 实现分组后组内排序功能 ROW_NUMBER() OVER (PARTITION BY)
在mysql8.0以上版本有ROW_NUMBER() OVER (PARTITION BY) 函数可以进行分组并进行组内排序,但是5.7以下版本是没有这个函数,我们这时候可以利用临时变量来实现这个效果。
2022-06-12 13:32:50
8179
1
原创 MySQL EXPLAIN执行计划分析
通常都会使用Explain来查看sql的执行计划,快速的分析sql性能并找出sql的问题所在。explain执行计划的结果有一下列:id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra说明:id: select查询的序列号,包含一组数字,表示执行select字句或操作表的顺序。1.如果id相同,则执行顺序由上至下2.如果id不同,且有子查询,则id越大的执行优先级越高。因为子
2022-05-08 18:18:41
586
原创 springBoot2.3 使用MongoRepository整合mongoDb
springBoot2.3 使用MongoRepository整合mongoDb
2022-05-04 21:40:58
1100
myeclipse/eclipse设置java文档注释
2017-01-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人