自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

wistchen

Stay Hungry Stay Foolish

  • 博客(112)
  • 收藏
  • 关注

原创 CAS笔记

CAScompare and swap 比较并交换。包行三个操作数:内存位置、预期原值、更新值。执行CAS操作的时候,将内存位置的值与预期原值比较,如果相匹配,那么处理器会自动将该位置值更新为新值,如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功。硬件级别保证CAS是JDK提供的非阻塞原子性操作,它通过硬件保证了比较-更新的原子性。CAS是一条CPU的原子指令(cmpxchg指令),不会造成所谓的数据不一致问题,Unsafe提供的CAS方法底层实现即为CPU指令c

2022-02-21 23:08:53 240 1

原创 工作中使用门面模式

背景如果你开发一个新服务需要提供对外接口时,你会怎么做?比较好的做法是提供给前端一个统一入口,统一请求体,该请求体有一个serviceId,不同的接口有不同的serviceId,param传参数。系统根据不同的serviceId自己自动关联到某个Service,那么具体如果实现呢?这里涉及到设计模式中的门面模式。门面模式介绍门面:客户端可以调用门面,门面会将所有从客户端发来的请求委派到相应的子系统去。子系统:子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

2022-02-17 22:02:16 242

原创 一次压测经历认识了雪花

前言这周同事把我拉进一个压测群,让我配合压测服务,主要是排查日志配合测试、运维人员压测。之后给了我项目资料,服务器信息,vpn等。等我拿到这些项目资料的时候,同事已经协助运维已经把这一套系统部署好了,测试人员已经准备开始压测了。该项目拓扑图大致如下:nginx负载均衡,每一组nginx对应两个门户集群,每个门户对应三个服务集群log4j2.xml设置之前测试人员在群里发了错误需要排查,我大概晚些进入群和测试人员有一个"时间差",之后同事转发测试人员在群里发的信息让我排查。我确定好ng

2021-12-04 23:52:10 2341

原创 我们是这样设计对外安全接口的

背景在日常工作中难免会调用第三方系统的接口,一个项目会有多个服务组合而成,负责各自核心的服务,在接触的项目中他主要以门户服务、核心服务组合而成。大部分门户服务会调用核心服务。当然如果有支付业务,会调用其他部门的支付服务,这样的话设计一个统一安全的对外接口就极为重要。安全措施AppId机制并不是谁都可以来调用的服务的。需要使用接口的服务需要在后台开通appId和相应密钥。数据加密数据在传输的过程中是很容易被抓包的,常见的做法对请求的内容做数据加密。数据加签数据在传输的过

2021-11-27 11:33:56 3479

原创 工作用到的杀手锏-Redis

背景一个专门用来提供服务的系统离不开缓存,因为每一个功能请求的链路中会去数据库获取一些常规的信息,比如这个应用id的终端信息,应用信息,应用权限信息,商户配置信息,卡信息等等,大部分的高并发场景都是读多写少,redis(写8万,读11万)这些信息写入缓存来抗高并发。有一些基本不变的信息还可以使用二级缓存如:Caffeine + Redis。Redis基础Redis是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。支持多种数据结构。Redis内置了replication、

2021-11-13 21:04:19 992

原创 近期工作中关于优化SQL的总结

索引失效建了索引用Explain分析SQL发现没用上,难道是索引失效?索引失效的大部分情况都没有出现。之后才发现两张表的编码格式不一样也会导致索引失效。还有就是字段编码格式不一致也会失效。用上索引的思路有一个统计单张表的某个维度的接口,该表的crt_date为yyyymmdd格式,该张表有索引(crt_date),正常来说我们都是只是count就行,那么如何优化呢?我们可以在业务层先查找出来该张表最早的创建时间放入redis缓存,之后用上索引crt_date即可。order by 分页出现的

2021-11-10 22:48:32 511

原创 一次关于Spring Batch的实践

背景随着机构码用码量越来越多目前为止有4百万,统计异常接口响应时间会变慢,而且统计异常只统计48小时内,count效率实在太低。最后考虑使用采集的方式,将异常数据采集到另一张异常表,这样子的话count效率会高些。不仅要采集异常表,还要根据月份汇总归档表也就是分表的概念,这样也能减轻单表的压力。Spring Batch目前,Spring Batch是批处理框架为数不多的优秀框架,是一个轻量级、完善的批处理框架。提供了大量可重用的组件,包括了日志、追踪、事务、任务统计、任务重启、跳过、重复、资

2021-11-09 22:57:57 795

原创 RocketMQ 概念

RocketMQ介绍简介RocketMQ是一款分布式、队列模型的消息中间件。特点单机吞吐量:十万级 可用性:非常高分布式架构 支持10亿级别的消息堆积,不会因为堆积导致性能下降 能够保证严格的消息顺序 提供丰富的消息拉取模式 实时的消息订阅机制 支持上万个队列 消息失败重试机制关键概念主题与标签主题Top: 第一级消息类型,书的标题 标签Tags:第二级消息类型,书的目录,可以基于Tag做消息过滤ps: 主题Top: 订单交易 标签Tags:订

2021-10-02 23:38:03 352

原创 redis高可用方案

背景有一个消息推送功能上线后发现好像没有成功。因为我开发的时候推送地址等配置是存储在我的redis里面,我怀疑是redis没有存储我的配置,所以我想登录生产redis去看这个key值存在不。过程因为是第一次接触这个项目,所以我先去程序配置文件拿到这个redis的地址,发现连不上,之后请教了同事。才知道生产上是这样连接redis的。我了解到这是一种主流的redis高可用方案,采用predixy + redis-cluster组合。硬负载 - > predixy 代理 ->redis

2021-09-20 23:34:27 251

原创 如何利用Redis实现分布式锁?

为什么需要分布式锁?系统是单机版,那么是在同一个JVM虚拟机内,使用synchronized或者Lock接口,就可以锁住当前线程,保证共享变量的正确性,其使用范围是在同一个进程内。 系统是微服务架构,synchronized和Lock不再起作用,资源类在不同的服务器之间不能共享了,所以需要分布式锁来解决这个问题。想要实现分布式锁,必须借助外部系统(redis或者Zookeeper)...

2021-09-19 16:25:00 283

原创 学妹问我redis分布式锁是什么

2021-09-13 00:19:47 80

原创 一个扩展功能竟然用到了适配器模式和工厂模式

背景这周在帮同事写接口文档的时候对返回字段不是很确定,开启了debug之旅。一开始看不懂这段代码,只知道具体实现类所在的位置。所以决定好好细品一下。先给大家看一下整体的结构// 使用工厂模式生成 HealthRiskHandler处理类String tagCode = "01";//tlvData.substring(0, 2);TLVExecutorFactory.Tag tag = TLVExecutorFactory.Tag.of(tagCode);TLVHandler h

2021-09-11 11:51:38 102

原创 一次多线程优化经历

背景张贴码批量导入后,需要支持批量下载。平台是前后端分离的,前后端响应是30s。所以尽可能的在30s下载更多的张贴码,超过30s就无了。没有优化之前遍历多张选择的实体->去构建张贴码->构建成功返回url,放入集合->拿着这些url压缩成zip。当时测试的时候是24s,下载了13张张贴码。利用多线程去优化定义一个核心数为10,最大线程数为20的线程池。在循环多张实体内,利用多线程去构建张贴码。之后再打包成zip。因为我们要拿到这些多线程构建张贴码

2021-09-10 22:45:08 111

原创 记录一次导入功能去重的问题

在做张贴码导入功能的时候,遇到了一个去重的问题。后端思想是:1 读取excel,把每一行数据看成一个实体2 开始每一行每个实体的校验3 校验成功后放入集合4 批量插入数据库正常想法是在每个实体校验的时候去数据库查询是否存在相同的张贴码,存在则抛出异常,不存在放入集合,批量插入。但是如果excel中有相同的张贴码相同就校验失败,也能导入了。因为每一行是跟数据库对比是否存在。解决是在放入集合前,跟集合中每一项在对比一次,不存在了放入集合。获取有人会觉得直接在批量插入数据库前把集合去重了更快。..

2021-09-10 22:36:55 131

原创 给学妹说说什么是布隆过滤器

2021-09-07 23:47:30 69

原创 前端query,data,switch遇到的问题记录

前端query,data傻傻分不清背景有些开放平台项目是需要自己去写前后端的。记录一些自己开放中遇到的问题。针对某一个机构终端配置多个属性,我的想法是在url传机构id,配置项不在url传,后端利用dto去接受。过程我写的前端js//批量配置选择机构终端参数exportfunctionbatchConfigurationTerminal(merchIds,configurationTerminalForm){returnrequest({url:'/o...

2021-09-05 17:53:56 641

原创 缓存惹的祸

缓存惹的祸背景项目A遇到某些条件的情况下需要把某些消息推送至项目B,推送方式跟项目B负责人约定好后采用httpclient方式;数据库里有一张配置表专门来配置推送的url、appId等信息,配置好后开始开发。过程与项目B负责人约定好了推送模板后开始开发。这里为了提高响应速度,当项目A遇到某些条件下开始推送消息(采用线程的方式)推送类有这几个部分组成: 定义ThreadPoolExecutor线程池 Redis缓存获取配置信息 推送消息方法 开发好后本地调

2021-09-05 16:57:48 85

原创 Redis 缓存穿透 & 解决思路

背景在项目中,有一个注册电子健康卡的服务,用户注册电子健康卡时候,都要携带外部流水号来进行注册。我们的需求是并发情况下不能让流水号重复。由于每次每个请求都要去判断流水号是否重复,就要去数据库查询实体是否存在,并发情况下导致数据库压力较大,就引入了Redis来减少去请求数据库的次数。使用Redis就会出现缓存穿透的问题。缓存穿透缓存穿透是指缓存和数据库中都没有的数据,用户不断发起请求,我们的数据库不存这些数据时候,这时候用户很可能是攻击者,攻击就会导致数据库压力过大,严重击垮数据库。

2021-08-07 18:09:24 128

原创 Ngin 项目中的应用

Ngin 项目中的应用Nginx简介Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。请求流程下面这个流程图代表实际项目的集群部署,2台A应用,3台B应用,A会去请求B。总的来说A、B都是对外提供服务的,外界->A再调用核心B。Nginx.conf以下就.

2021-08-07 15:31:20 222

原创 Docker安装RocketMQ

Docker安装RocketMQ1.0 背景由于自己的电脑vnp不能连公司的vpn,所以在家运行项目不方便,打算给自己的linux安装RocketMQ。2.0 拉取镜像docker pull rocketmqinc/rocketmq:latest2.1 创建目录/usr/local/docker/rocketmq/data/namesrv/logs/usr/local/docker/rocketmq/data/namesrv/store2.2 安装namesrv..

2021-07-20 22:50:28 342 1

原创 Sharding-JDBC分表实践

一 Sharding-JDBC分表实践1.0 背景这周问了小组长有任务吗?组长说暂时没有任务了,让我了解下分表技术。原因是因为随着公司发展,用户量大量增加,业务也越来越繁杂。一张表的字段有几十个上百个,一张表存储的数据也很多。这样数据库的压力就比较大了。之后我便打开了我的B站,开始了解一波。2.0 垂直分表、垂直分库(表和库都是不一样的)2.1 垂直分表 一般将不常用的、数据较大、长度较长的拆分到"扩展表"。 2.2 垂直分库 一个数据库的表太多,按照一定业务逻辑

2021-07-16 17:43:29 209 1

原创 异步记录用户系统访问实践

目录一 异步任务管理器实践设计思路1.0 背景1.1 如何记录?1.2 如何实现?1.3 线程池配置1.4 异步任务管理器1.5 异步工厂1.6 spring工具类1.7知识点相关资料异步记录用户系统访问实践设计思路1.0 背景上篇讲到五次登录失败限制登录用到了一张用户系统访问表,就是用户在访问系统不管成功还是失败都会记录到这张表。1.1 如何记录?如果说用户在访问系统成功和失败都记录的时候去记录的话多了一步记录的操作,势必会影响程序性能,影响

2021-07-11 23:52:58 278

原创 5次登陆失败,限制登录实践

一 限制登录实践设计思路1.0 背景最近在开发辽事通机构开放管理平台入驻功能模块功能。该模块涉及到注册、登录、入驻等功能。涉及到的技术有SpringBoot、Mybatis、Spring Security、Jwt、Npm、vue-cli、vue-router、vuex、element-ui1.1 思路后端思路:登录失败有以下这几种情况: 验证码失效 验证码错误 用户密码输入错误 以上三种情况层层递进,第三种的话是属于spring security

2021-07-11 18:14:31 2026

原创 验证码redis实践总结

一 验证码+redis应用设计思路1.0 背景最近在开发辽事通机构开放管理平台入驻功能模块功能。该模块涉及到注册、登录、入驻等功能。涉及到的技术有SpringBoot、Mybatis、Spring Security、Jwt、Npm、vue-cli、vue-router、vuex、element-ui1.1 验证码生成思路后端思路:a.将验证码存入redis,(键 值 时间 单位)其中键由常量+uuid拼接,值由随机生成4个字符串,时间为2分钟。b.利用BufferedIm

2021-07-11 17:03:51 1435

原创 常用Docker命令记录

常用Docker命令一.Docker简介Docker是一个开源的应用容器引擎,让开发者可以打包应用及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上。使用Docker可以更方便地打包、测试以及部署应用程序。1.1 Docker环境安装安装yum-utils:yum install -y yum-utils device-mapper-persistent-data lvm2为yum源添加docker仓库位置:yum-config-manager --add-repo

2021-05-14 11:02:44 82

原创 SpringCloud组件学习

1 单体 集群1.1 单体架构系统所谓的单体架构,就像我们平常开发的应用——SpringBoot,所有功能都放在一个war包或者jar包里面。单体架构的好处:便于开发,部署(jar或者war),测试。1.2 集群多个SpringBoot,他们的功能是一样,系统具有横向扩展能力。使用集群的理由: 一般单台服务器处理的并发量为250左右,并发处理能力有限。 一般单台服务器中的一点服务器故障,整个服务就不能访问了。 2 结合生活中例子(分布式+集群)以开一家球鞋的网

2021-05-02 13:52:46 217 3

原创 AES加密算法、热部署实战总结

1 AES加密算法在项目中的运用总结1.1 背景由于老系统框架较旧,新的模块采用springboot开发。 但是页面得挂载在老系统上。老系统页面利用iframe挂载子系统。子系统的用户信息来源于老系统登录的用户。老系统与子系统如何进行数据传输,如何保证数据安全,这个是个关键。1.2 思路 先定义好老盐、密码 之后通过用户id取值+盐+字符串组成16位新盐 之后新盐+明文 加密生成token 子系统获取token,利用老盐解密,生成明文,明文与之前的明文

2021-04-11 13:53:13 429

原创 线程池在项目中使用的心得体会

1 线程池在项目中的运用总结1.1 背景工作中,用到线程池的地方是同步人员工作量的功能,该功能是选择时间同步人员工作量,工作量来自禅道系统+Digiprocess 系统。正常是发起工作量请求,业务逻辑处理,响应入库。这样存在一个很大的弊端就是多了一次请求别的系统的数据+数据库操作,进而可能会导致响应速度较慢。使用线程池,将同步方法放入队列中,然后直接返回响应,会极大的提高接口的响应速度。1.2 线程池的作用 线程复用 线程资源管理 控制操作系统的最大并发数、以保

2021-04-05 20:03:51 702

原创 Java注解&反射

一.注解Annotation1.什么是注解注解是以“@注释名”在代码中存在。代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相对应的处理。减少了配置,大量减少了代码量,通过反射机制实现对这些元数据(为其他数据提供信息的数据)的访问。在开发中使用也是比较常见的,比如:@Controller、@Param、@Data等,Java原生(标记&检查)有@Overried、@Deprecated、@Functional2.基本内置注解@Override 表示这个方

2021-02-27 23:08:50 216

原创 JVM简单入门-02

一.JVM体系结构图在整个JVM学习过程中,这张图要深深记住,这样才不会迷失方向二.Native方法在多线程Thread的start方法源码中,有一个方法【private native void start0()】,其中有一个关键字native。凡是带了native关键字的,说明Java的作用范围达不到了,回去调用底层C语言的库。 会进入本地方法栈,调用本地方法接口JNI(Java native interface)历史原因:Java诞生的时候是C、C++横行的时候,想要立足,必

2021-01-23 14:33:42 97

原创 JVM简单入门-01

一.学习JVM的好处能够明白为什么Java最早期被称为解释型语言 为了今后更好的解决线上排查问题 可以通过调整JVM相关参数提高Java应用的性能 可以清楚知道Java程序是如何执行的二.JVM体系结构图三.类加载器ClassLoader3.1类的加载、连接、初始化先来探索一下一个类加载到JVM的一个基本结构:class进入类加载器,加载初始化为类模板,实例化为一个个类的实例。从代码来理解:class Test{ public static int a =

2021-01-23 11:38:18 112 1

原创 Java这些基础知识,你忘了吗?

一.面向对象和面向过程的区别 面向对象:当解决一个问题的时候,面向对象会把事务抽象成对象的概念,这个问题有哪些对象,然后给对象赋一些属性和方法,每个对象去执行自己的方法,问题得到解决。 面向过程:会把事情拆分成一个个函数和数据,按照一定的顺序去执行。 例子: 打牌 面向对象:我.打牌(你)or 你.打牌(我) 面向过程:打牌(你,我) 总结:面向对象易维护、易复用、易扩展。因为面向对象有封装、多态、...

2021-01-16 17:54:15 71

原创 京东搜索引擎技术-Elasticsearch快速入门

一.简介Elasticsearch是一个基于Lucence的搜索服务器。它提供了一个分布式的搜索引擎,基于restful web接口。广泛应用于云计算中,能够实时搜索,具有稳定,可靠,快速的特点。二.为啥要学习Elasticsearch?它其实也是一种数据库的优化方案,它的强大之处在于模糊查询。如果是普通数据库查询 like%xxxx%,其实是不走索引的。只要你的数据库的量很大,你的查询肯定会是秒级别的。(es搜索速度很快)用户输入其实没那么精确或者打错,Elasticsearch却能返回用

2021-01-02 00:54:16 1638

原创 Mysql-03.工作中对SQL优化的心得体会

1.使用explain分析sqlexplain+sql就可以开始分析sql啦,下面介绍一些比较重要的字段1.1 typeconst 通过索引一次就找到了(最好)eq_ref 是用来唯一性索引(primary key或者unique index)ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值range 单表索引中的范围查询index 比all好点all 全表扫描(最差)SQL性能优化的目标:至少要达到 range 级别,要求是ref级别,如果可以是consts最好

2020-12-27 11:16:38 163 2

原创 MySQL-02.工作中对索引的理解

索引1.什么是索引?帮助MySQL高效获取数据的数据结构相当于目录,是一个文件,需要占据物理空间的2.使用场景where 后面字段,对该字段建立索引(alter table 表名 add index(字段名))。order by 后面的字段,如果没有建立索引,执行计划会将查询出的所有数据使用外部排序,影响性能,使用排序之后,索引本身是有序的,因此直接按照索引的顺序和映射关系逐条取出数据即可。对join语句匹配关系on涉及的字段建立索引提高效率。尽可能的在select后只写必要的查询字段

2020-12-26 14:24:22 121

原创 MySQL-01.工作中数据库优化和explain字段知识的总结

数据库优化-话题为什么要优化?系统的吞吐量瓶颈往往出现在数据库的访问速度上数据库中的数据越来越多,处理时间会相应变慢优化原则:减少资源占用,增加系统的反应速度0.Redis缓存减少数据库连接是一种优化手段,有些查询可以不用访问数据库,可以通过缓存服务器redis,elasticsearch增加缓存,减少数据库的连接。1.主从复制,读写分离通过MySQL主从复制,curd走master服务器,查询走slaver从服务器,这样就减少了只有一台MySQL服务器的压力。2.数据库参数配置优化

2020-12-26 11:15:36 130

原创 MySQL基础-笔记

一.值和列类型1.数值类型2.字符串类型3.日期和时间数值类型4.null值理解为“没有值”或“未知值”不要用NULL进行算术运算,结果仍为NULL二.数据字段属性1.Unsigned无符号声明该数据列不允许负数2.Zerofill不足位数的用0来填充,如int(3),5则为0053.Auto_InCrement通常用于设置主键,且为整数类型,自动增长的可定义起始值和步长SET @@auto_increment_increment=5,影响所有使用自增的表

2020-12-24 22:09:00 56

原创 项目中使用SpringAOP切面记录日志

一.背景项目中需要保存所有操作的日志,决定引入AOP面向切面编程,日志需要记录完整的一次请求,包括请求参数:url、请求方式、类路径、方法、参数名等。二.AOP简介AOP即Aspect Oriented Program面向切面编程,在面向切面编程的思想里面,把功能分为核心业务功能和周边功能:所谓的核心业务 ,比如登录,增加数据,删除数据都叫核心业务;所谓的周边业务 ,比如性能统计、日志、事务管理等等;在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心

2020-12-23 23:14:48 1300

原创 解决预览pdf不能下载的问题

1.背景最近在开发A系统归档的数据要传入B系统,在B系统生成PDF文件。之后要在A系统预览并下载。2.问题1.文件名不能回填2.保存类型没有pdf3.解决 /** * 实现资产系统通过接口方式 * PDF预览 * @author chenf */ @RequestMapping(value = "/sign-process/queryFile", method = RequestMethod.

2020-12-17 16:08:12 6442

原创 【RabbitMQ】5种工作模式

一.简单模式包含一个生产者、一个消费者和一个队列。生产者向队列里发送消息,消费者从队列中获取消息并消费。二.工作模式(资源的竞争)包行一个生产者、两个消费者和一个队列。两个消费者同时绑定到一个队列上去,当消费者获取消息处理耗时任务时,空闲的消费者从队列中获取并消费消息三.发布/订阅模式每个消费者监听自己的队列,两个队列绑定到交换机,生产者通过发送消息到交换机,所有消费者接收并消费消息。四.路由模式它包含一个生产者、两个消费者、两个队列和一个交换机。两个消费者同时绑定到

2020-12-08 22:54:26 314

空空如也

空空如也

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

TA关注的人

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