自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 谈谈软件系统重构

系统重构总结经验分享

2023-04-08 19:12:02 1845 3

原创 自建工单(审批流)系统设计

审批流或工单系统设计思路

2022-06-22 20:34:44 5864 2

原创 Redis常用数据结构和使用场景

Redis默认为16个库,在配置文件中可以修改,从0开始,每个库互相隔离,库中存储的是key,vaule键值对。value分为五种数据结构,分别是string、hash、list、set、sortedSet。StringString结构又存在3种类型,分别是字符串、数值、bitmap。字符串set k1 hello nx 只能新增,只有当k1不存在时才能设置成功。set k1 hello xx 只能修改,只有当k1存在时才能设置成功。getset 指令相比于先get再set而言,少了一次IO

2020-05-17 16:13:36 547 1

原创 RabbitMQ消息不丢失补偿方案

RabbitMQ特性异步解耦削峰填谷正是由于其存在以上特性,所以被广泛应用于实际开发中,但是线上环境却存在消息丢失的场景,需要我们通过一些技术手段来保证最终数据的一致性(即MQ消息不丢失),首先我们先需要了解下RabbitMQ整体的架构图如下:RabbitMQ组成通过上面架构图我们可以看到RabbitMQ大致分为3部分,客户端(生产者)RabbitMQ消息中间件服务端(消费者)RabbitMQ消息丢失原因那么究竟哪些环节会导致消息丢失呢?生产者发送消息到RabbitMQ服

2020-05-10 22:30:36 2431 1

原创 利用注解和反射将BigDecimal属性NULL转换为0返回

Java中的反射在Spring这些框架中应用的很频繁,比如Spring容器初始化Bean的过程等等,但是在实际的业务开发中自己却应用的很少。最近的开发过程中正好有个这样的需求,有几个实体类中属性比较多,而且这些属性都是定义的返回金额字断,因为金额在计算过程中可能出现精度问题,所以定义金额字断属性都使用的BigDecimal进行修饰。在和前端对接的过程中发现有些金额字断返回的NULL,这样就产生了...

2020-04-05 20:57:00 8346

原创 算法排序-选择排序

数据结构和算法是程序设计的灵魂,所以我们需要掌握基本的排序算法。我们首先来聊选择排序,比如有一个数组,我们需要按照从小到大顺序进行排序,选择排序的思想在于从下标为0开始,依次向后遍历,寻找比下标为0的数据还小的数据放在下标为0的位置上,依此类推,下次取下标为1的数据继续向后遍历,寻找比下标1的数据小的数据放在下标的位置。那么核心在于每次选取下标位置上,废话不多说,上程序:/** * @De...

2020-03-30 22:08:25 115

原创 设计模式-策略模式

策略模式标准定义:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。策略(Strategy)模式属于对象的行为模式,通过分析Strategy模式可以发现:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查...

2020-03-23 22:35:49 143

原创 设计模式-单例模式

单例模式:顾名思义,就是单个实例。目的:确保一个类只有一个实例存在,也就是说在整个系统中,如果你希望某个类只能出现一个实例,那么单例模式就派上用场了。下面我们来讨论如何实现单例模式。1)饿汉式/** * 饿汉式 * 优点:JVM保证线程安全,实现简单 * 缺点:类加载就完成初始化,如果不被使用,造成资源浪费 */public class Example1 { //构造方法私有...

2020-03-22 13:23:11 97

原创 线上问题排查的心路历程-GC时间过长

一天突然收到其他组伙伴反馈调用我们组的一个接口超时了,信息如下:cause:java.net.SocketTimeoutException: Read timed out于是乎赶快打开Postman访问了下这个接口,结果可以访问,经过沟通发现并不是每次访问都失败,怀疑是其中一台机器宕机了,为了不影响线上系统正常运行,优先进行了服务重启,之后服务可用。接下来开始了问题的排查和猜想。猜想1:Ngi...

2020-01-14 15:44:46 1578 4

原创 Mysql性能优化

本周进行了线上清结算相关慢sql优化,通过分析以及处理,线上慢sql已经得到了部分改善,但是还需要持续优化。主要从以下几个方面进行了优化:1.根据Explain执行计划,增加相关单列索引;2.将以前单个区分度并不高的单列索引优化为联合索引,效果还是比较明显,例如表pp_business_check_data(商户对账中间表)的城市编码(area_code)和状态(status)创建的单列索引,...

2020-01-09 15:40:01 142

原创 Elasticsearch聚合查询,提高系统查询、导出性能

随着业务的发展,线上生产环境数据量猛增,财务信息一个表的数据自从2008年系统上线以来已接近7千万,而且现在每天的增量也越来越快,由于业务中存在退费场景,所以历史财务数据也不容易归档处理。但是财务应用场景中含有大量的查询和导出,显然,将财务数据都存储在Mysql(建议单表数据量不超过2千万)中已经满足不了实际应用场景。如何解决财务数据的查询和导出问题成为我们必须解决的一个难题,经过技术选型,我们...

2019-11-21 15:26:14 1148 3

原创 异步调用(CompletableFuture)And Spring超时重试(Retryable)和RestTemplate模版调用方法联合使用

接到一个退费回调的需求,当三方回调通知支付平台支付成功时,需要将退费成功结果异步通知到调用方(APP),如果通知失败,需要进行4次重试,采用Http方式通知调用方接口即可。重点已经标出~那么接下来就是技术选型了,首先异步怎么处理,立马想到了MQ啊,异步解耦,但是感觉有点杀鸡焉用宰牛刀的感觉,最终还是决定用JDK8升级java.util.concurrent包下Future的完善版Completa...

2019-07-13 19:13:15 3286

原创 【Redis连接超时】io.lettuce.core.RedisConnectionException: Unable to connect to 192.168.x.x:7000

今天临近下班了,线上开始频繁报警,各种Redis连接超时,顿时慌的一批,因为最近在优化系统高频查询时用到了Redis作为缓存,难道要出生产事故,额~~~ 一首凉凉送给自己。。。。。。于是马上联系下运维看下什么情况,运维看了下监控情况,OPS(operation per second)确实增加了不少,见下图:于是乎发现确实是自己的锅,二话不说,先回复线上优化查询前的版本,保证线上能够正确运行,...

2019-07-07 22:11:35 28845

原创 Spring Cloud Gateway网关从零开始搭建之路

1.网关的由来微服务提出后,单体应用被拆分成多个服务,为了对外提供统一入口,解耦客户端与内部服务。2.网关的作用网关能做统一的路由转发、熔断、限流、安全认证、日志监控等。3.网关zuul与Spring Cloud Gateway对比4.Spring Cloud Gateway核心概念1.路由(route) 路由是网关最基础的部分,路由信息由一个ID、一个目的URL、一组断言工厂...

2019-05-10 17:42:08 2796

原创 Spring容器Bean创建以及Bean生命周期

继上一篇文章 Spring加载IOC容器以及装载Bean源码解读,从源码中我们分析了Spring容器的加载过程,Bean的创建。在本篇文章,我们继续分析Bean的创建过程源码以及Bean的生命周期。根据源码总结出Bean的生命周期流程图如下:上一篇文章,我们跟到了类AbstractBeanFactory中的doGetBean方法,其中含有创建Bean的关键方法createBean(beanNa...

2019-04-29 20:00:39 1601

原创 Spring加载IOC容器以及装载Bean源码解读

. SpringBoot应用开发已经非常普遍,确实,SpringBoot给我们的开发带来了很多便利,但其实,SpringBoot并没有增加什么新特性,只不过是在Spring注解的基础上做了升级版混合使用。SpringBoot的精髓就是自动装配(@EnableAutoConfiguration),我们不需要像以前使用Maven搭建项目时,引入过多的依赖包,同时还需要处理各种包冲突问题,简直是烦...

2019-04-29 15:07:57 386

原创 RabbitMQ实战(三)-消息者消费消息之拉取模式

RabbitMQ学习列表:RabbitMQ实战(一)-消息通信基本概念RabbitMQ实战(二)-消息持久化策略、事务以及Confirm消息确认方式·前面二个章节主要讲了一下RabbitMQ的基本概念和消息发送的确认模式,正巧现在项目中有个需求(利用RabbitMQ消峰),其他客户端系统会向我们后台系统推送大量的支付财务消息,我们需要做的就是将这些消息入库,以前采取的方式即为按条进行inse...

2019-01-31 11:38:46 11007

原创 update语句时造成的血案,报Lock wait timeout exceeded try restarting transaction

最近查看后台日志,发现出现了大批量的锁表日志,顿时产生好多不解,报错日志如下:### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction### ...

2019-01-30 18:03:42 11017

原创 RabbitMQ实战(二)-消息持久化策略、事务以及Confirm消息确认方式

RabbitMQ学习列表:RabbitMQ实战(一)-消息通信基本概念再上一篇学习完RabbitMQ通信的基本概念后,我们来继续学习消息的持久化以及代码实现RabbitMQ通信。在正常生产环境运维过程中无法避免RabbitMQ服务器重启,那么,如果RabbitMQ重启之后,那些队列和交换器就会都消失了(随同里面都消息)。原因是每个队列和交换器都durable默认为false,他决定了Rabbi...

2019-01-13 17:31:34 748 1

原创 RabbitMQ实战(一)-消息通信基本概念

2019年才刚刚开始,给自己定一些新的学习目标,那么先从RabbitMQ开始吧。买了一本《RabbitMQ实战-高效部署分布式消息队列》电子书进行研究,那么在学习RabbitMQ之前,我们先要理解消息通信的基本概念,主要从一下几点开始学习:生产者:RabbitMQ在应用程序和服务器之间扮演路由器的角色,那么RabbitMQ就需要去接收消息,从哪接收呢?当然是生产者。生产者(producer)创建...

2019-01-13 12:35:03 412

原创 Spring声明式事务在service内部之间调用失效问题

最近在开发过程中遇到了一个问题,当在Controller中调用Service中A()方法,A方法内部又调用Service中B()方法,由于A方法中只有查询操作所以没有加事务控制,B方法中含有多次修改操作所以增加了@Transactional注解,结果在A方法调用完B方法后,程序报错了,但是B方法中修改操作的数据竟然成功了,我擦~什么鬼,于是开启了探索Spring事务之路,直接上示例。示例1:A方...

2019-01-12 17:43:01 1830 1

原创 mysql-connector-java之6.0.6版本,SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required异常

2018.01.08晚上发了一个进度可视化的需求,第二天早上来发现钉钉有请求错误异常报警,我擦,什么鬼,吓出一身

2019-01-12 17:19:50 2419

空空如也

空空如也

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

TA关注的人

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