- 博客(30)
- 收藏
- 关注
原创 RocketMQ消息堆积问题
前几天因为下游服务消费的逻辑问题,导致宕机,大量消息堆积在了MQ中,且服务一重启就立马宕机。为了快速恢复服务,我们修改了代码逻辑,接到消息打印日志后就直接丢弃,后续定位到问题再重置消费位点。这时我又思考另一问题,如果消费逻辑没有问题,只是生产者生产信息过快,那对于RocketMQ单纯的增加消费机器能解决问题吗?
2024-08-07 15:24:55
735
原创 mysql排查锁等待
最近线上碰到了几次mysql锁等待的问题,一个事务线程长期占用锁资源,导致其他事务无法获取到锁,为了快速解决问题,我们把线程kill掉了,但后面就定位不到具体的问题了,这里我总结整理一下我的方案。
2024-08-01 18:08:52
813
原创 工作碰到的超大分页优化
背景最近做一个需求,业务需要一个查看并能导出订单的页面。但分析历史订单数据发现公司每个月都有六七百万的订单数据,如果碰到大促可能就有上千万,单靠mysql查效率有点差,但偏偏部门还没有可用的搜索引擎,需求也比较紧急,去申请资源再搭建时间来不及。后来想了个方案,将订单数据同步过来按月分表,虽然查数据只能查月内数据,但也能满足基本使用,等后期再用ES优化。实现与优化公司用的通用的一套分页中间件,所以我就先按普通的写法实现了一版,结果测试后发现效率是真的不行,一次查询要48秒。一方面是数据量比较大,还有一
2022-03-23 19:02:48
2925
原创 redis分布式锁
今天看到了这样一段代码 //同一个人导出功能生成中的,则报错 String redisLock = "/payment/exportOrderOfTaobaoPayment::" + userId;本意是希望页面的导出功能同一个用户在上一次导出成功之前无法再次导出,防止频繁导出影响系统稳定,本意是不错,对于这种场景也能保证基本的使用,但这redis锁的实现方式就真有点一言难尽了。如果不用Redisson,怎实现一个正确的redis锁。上面的代码最大的问题是判断key
2022-03-23 16:29:37
404
原创 记一次RC级别下MySQL死锁问题
背景在工作中碰到一次死锁问题,业务背景是在mq接收商品主数据时会更新商品其他数据,由于商品主数据和商品其他信息是一对多的关系,所以采用先删后增的方式,结果异常监管平台报出来死锁警告。这是商品其他信息表,数据库隔离级别是RC,表有一个唯一联合索引,这个唯一索引就是引起死锁的关键。死锁分析下面是线上的一个死锁日志2021-03-15 16:40:49 0x7f17e97ff700*** (1) TRANSACTION:TRANSACTION 2120576727, ACTIVE 0 sec in
2022-03-02 15:26:04
2199
1
原创 kafka原理介绍
kafka原理介绍基本介绍Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。主要应用场景是:日志收集系统和消息系统。Kafka主要设计目标如下:1.以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。2.高吞吐率。即使在
2021-06-09 11:50:52
170
原创 如何将map转换为实体类
今天写项目时需要把map中的值写到对应的实体类中去,以前在遇到同样的问题时因为需要的数据只要那么几个字段,所以通过get和set的方式感觉还行不是特别麻烦,而这次需要几乎所有字段,一共有十几个,如果还是才采用这用方式实在太麻烦。查阅资料后发现了两个不错的方法方法一<dependency> <groupId>com.alibaba</groupId>...
2020-02-19 20:24:18
4636
原创 AQS原理解析(独占式)
简介AQS的全称为(AbstractQueuedSynchronizer)。AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。当然,我们自己也能利用AQS非常轻...
2019-09-14 17:09:12
252
原创 volatile关键字原理解析
在多线程开发时,我们希望每个线程对共享变量的修改对其他线程可见,这时候我们会给共享变量加一个volatile关键字,那么它的底层是如何实现的,这篇博客我们就解析一下volatile的原理。JMM在此之前我们需要先了解一下java内存模型JMM每个线程访问共享变量时并不是直接访问主内存,而是先将共享变量拷贝到各自的工作内存,等线程结束后再将工作内存中的共享副本变量写回主内存。这些过程都是通过J...
2019-09-10 20:57:20
272
原创 jdk1.7hashMap环链的产生以及jdk1.8对hashMap扩容的优化。
jdk1.7hashMap扩容当我们插入值时,如果hashMap数组达到阈值且当前数组位置不为空,那么它就会进行扩容。但在jdk1.7版本中,多线程下,多个线程对一个hashMap操作是会产生环链的。下面是hashMap扩容将元素转移的主要代码,也是环链产生的地方。void transfer(Entry[] newTable) { Entry[] src = table; ...
2019-09-08 21:52:13
858
原创 hashMap的数组长度,加载因子及转红黑树的阈值解析
hashMap的数组长度为什么要求是2的整数次幂为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。Hash 值的范围值-2147483648到2147483647,前后加起来大概40亿的映射空间,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,...
2019-09-08 16:21:19
2693
1
原创 hashMap和hashSet的底层原理解析及两者区别
哈希表hashMap和hashSet的底层数据结构都采用哈希表结构。在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理哈希冲突,同一hash值的链表都存储在一个链表里。1,为什么用了一维数组:数组的查找时间复杂度小,为O(1),只要拿到数组的索引值,就可以直接找到想要的数据;但数组存储区间是连续的,占用内存严重,故空间复杂的很大。数组的特点是:寻址容易,插入和删除困难2,为什...
2019-09-07 21:45:25
3031
1
原创 rabbitMQ如何避免消息丢失
rabbitMQ消息可能丢失的情况:1.发送方发出消息但没有进入队列。2.接收者接到消息,但处理过程出现错误。3.队列或者交换机宕机。针对上面的三种情况,rabbitMQ有三种应对措施。publisher-confirms(发送方确认模式)将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的ID。一旦消息被投递到目的队列后,或者消息被写入磁盘...
2019-09-06 19:28:31
3630
原创 rabbitMQ消息模型总结
基本模型P(producer/ publisher):生产者,一个发送消息的用户应用程序。C(consumer):消费者,消费和接收有类似的意思,消费者是一个主要用来等待接收消息的用户应用程序队列(红色区域):rabbitmq内部类似于邮箱的一个概念。虽然消息流经rabbitmq和你的应用程序,但是它们只能存储在队列中。队列只受主机的内存和磁盘限制,实质上是一个大的消息缓冲区。许多生产者可...
2019-09-06 18:09:16
165
原创 消息队列简介
前言在微服务项目中,我们会碰到一些操作关联到其他微服务的问题。比如,我们后台商品微服务修改了数据库中的商品信息,那么搜索微服务就要去更新索引库中的商品数据,或者当我们注册微服需要发送验证码时,就需要发送短信的微服务。如果我们用feign去同步调用显然不合理,这种情况下消息队列就起到了作用。消息队列消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消...
2019-09-06 16:39:00
169
原创 利用stream流对po与vo进行相互转换
在上次介绍BeanUtils.copyProperties时已经讲述了在开发时面临po和jo互转问题。BeanUtils.copyProperties方法可以方便的拷贝po与vo相同的属性,但vo特有的属性该怎么办,我们一般会通过set方法自己手动注入。但要是我们需要将po集合转换成vo的集合,那就很麻烦。我们还要遍历po集合取出每个po拷贝属性到vo,然后再将vo添加到vo集合。代码很麻烦。原...
2019-08-25 22:15:41
3685
原创 属性拷贝方法BeanUtils.copyProperties的使用
简介BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。场景我们在开发时经常会遇到po与vo互转的问题。po对象用于持久层交互,vo用控制层交互。有时候我们页面要展示的只是po的一...
2019-08-25 21:46:03
482
原创 FastDFS分布式文件系统
分布式文件系统简介分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。通俗来讲:传统文件系统管理的文件就存储在本机。分布式文件系统管理的文件存储在很多机器,这些机器通过网络连接,要被统一管理。无论是上传或者访问文件,都需要通过管理中心来访问FastDFSFastDFS是由淘宝的余庆先...
2019-08-23 21:51:22
78
原创 nginx反向代理原理
简介Nginx是一个http服务器。是一个使用c语言开发的高性能的http 服务器/反向代理服务器及电子邮件代理服务器。nginx能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。nginx可以作为web服务器,但更多的时候,我们把它作为网关,因为它具备网关必备的功能:反向代理负载均衡动态路由请求过滤今天主要理解一下nginx反向代理的原理。什么是反向代理...
2019-08-23 21:33:01
5392
原创 上传大文件时绕过zuul的两种方法
默认情况下,所有的请求经过Zuul网代理,默认会通过SpringMVC预先对请求进行处理,缓存。普通请求并不会有什么问题,但是对于文件上传,就会造成不必要的网络负担。在高并发时,可能导致网络瘫痪,网络阻塞,Zuul网关不可用。这样我们的整个系统就瘫痪了。所以,我们上传文件的请求需要绕过Zuul的请求缓存,直接通过路由到达目标微服务。官方提供了一种解决办法就是在请求路径前加上/zuul,比如在请...
2019-08-23 21:00:46
2018
1
原创 linux下nginx安装启动
先把nginx压缩包传送到linux中,放到你想安装的目录下,我用的工具是xftp然后解压tar -xvf nginx-1.10.0.tar.gz解压后进入nginx-1.10.0目录,然后配置文件目录,第一个指定文件目录包括配置文件日志文件等,第二个指定脚本文件目录./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx执行...
2019-08-20 21:39:48
269
原创 xshell连接虚拟机及遇到的问题
安装xshell后我们去连接虚拟机,但由于缺少配置,我们是无法连接的。点击新建连接,输入想要连接主机的ip地址如果不知道ip,可以去虚拟机查看,我用的是ubuntu,打开终端用ifconfig命令查看ip,如果提示你没有 net-tools就安装一下,安装命令也会自动提示。但安装可能会报这个问题,E: Unable to acquire the dpkg frontend lock (/va...
2019-08-20 16:53:25
546
原创 Eureka原理理解和Eureka集群搭建
简介Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务。spring cloud框架集成了Eureka,在微服务架构中充当注册中心的角色,方便管理各种微服务。Eureka原理Eureka 分为 Eureka Server 和 Eureka Client及服务端和客户端。Eureka Server为注册中心,是服务端,而服务提供者和消费者即为客户端,消费者也可以是服...
2019-08-16 21:40:32
23748
4
原创 ssm环境下基于aop的日志记录
该日志记录背景是后台权限管理系统,日志主要记录用户姓名,访问时间,访问时长,访问路径,访问方法名和访问ip。主要技术是反射和springAop首先创建一个日志实体类,用于封装数据并存入数据库。public class SysLog { private String id; private Date visitTime; private String visitTime...
2019-08-14 20:48:32
295
原创 ssm整合及事务配置
简介ssm框架使我们常用的一种框架,ssm整合其实是用spring去整合mybatis和springmvc,所以思路和步骤都比较清晰。spring整合mybatis首先我们在spring主配置文件中去整合mybatis。主要是将sqlSessionFactory工厂交给spring Ioc容器管理。<context:property-placeholder location="cla...
2019-08-12 16:56:40
1415
原创 PageHelper插件在ssm框架中的使用(以及一个粗心踩的坑)
简介PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。配置首先导入依赖<dependency> <groupId>com.github.pagehelper</groupId> <artifactId&g...
2019-08-12 16:26:49
354
原创 mybatis多对多查询(xml方式和注解方式)
前言前面总结了一对一,多对一和一对多的多表查询,今天总结一下多对多的mybatis多表查询。同样有xml方式和注解方式,步骤和前两种查询差不多,最主要的区别就在表和sql语句上了。数据库表及关系这里采用用户和角色的例子一个用户可以有多个角色一个角色可以赋予多个用户在进行多表查询时,我们需要一张中间表,中间表中包含各自的主键,在中间表中是外键。多对多查询(xml方式)这次我们首...
2019-08-04 19:51:21
5382
5
原创 解决Spring对静态变量无法注入问题
问题今天在学习的过程中想写一个连接和线程绑定的JDBCUtils工具类,但测试时发现一直报空指针异常,上网查了之后Spring并不支持对静态成员变量注入,所以光试用@Autowired肯定是不行的。可是我们编写工具类时肯定是要使用静态变量和方法的,我总结一下我用过可以实现对静态成员变量注入的方法。@Componentpublic class JDBCUtils { @Autowire...
2019-07-31 12:38:16
2014
3
原创 总结mybatis多表查询(注解方式,注解详细说明)
总结mybatis多表查询(注解方式)前言在之前的总结mybatis多表查询(xml方式)的博客中,已经对多表查询做了一定的介绍,而且总结了基于xml的mybatis多表查询,一些通用的技术点可以翻阅上一篇博客。这次我们总结基于注解的mybatis多表查询。多对多查询的xml和注解方式我会再写个博客。数据库表及关系为了方便查看,这里再次给出user和account表一对多查询首先和...
2019-07-29 20:30:56
7651
4
原创 总结mybatis多表查询(xml方式)
总结mybatis的多表查询前言数据库表及关系一对多查询多对一及一对一查询总结前言表之间的关系有几种:一对多、多对一、 一对一、多对多在多对一关系中,把多的部分拆成一个一个对象其实就是一对一关系,如账户和用户是多对一关系,但每个账户只对应一个用户。所以在mybatis中,多对一的关系可以看成一对一的关系。这里我把一对多和多对一的xml配置方式总结了一下,同时还有加载方式。一对多,多对多:...
2019-07-29 17:26:18
6487
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人