自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 高并发经验是什么

2023-02-21 19:02:25 136

原创 新冠-从入门到放弃

新冠

2022-12-22 23:23:21 104

原创 配置文件对比

配置文件对比

2022-06-28 11:58:25 436

原创 三种发布方式

发布方式

2022-06-21 21:54:30 251

原创 2022 找工作复盘

为何辞职个人规划。年满30,期望自己在管理能力上有所提升。目前的小组虽然对于一个程序员技术能力提升帮助很大,但是缺少锻炼管理能力的机会(想带新人、想去负责一个多人合作完成的项目)。经济压力。疫情背景下,收入减少。90后独生子、目前身背房贷、需要赡养老人,精打细算下还能勉强维持。未来成家后还需要抚养小孩,这钱咋算都不够。所以,在疫情前景不明的前提下,更倾向于一个受疫情影响低的行业。准备和应战**Mysql数据库。**主要学习来源是极客时间上《Mysql实战45讲》以及在工作中解决死锁、慢SQL等

2022-04-30 16:01:10 835

原创 下单幂等设计

背景原本我以为下单是不需要做幂等的,用户一次点击下,只要库存够,下两单也没什么影响。但是,实际情况并不是那么如意,尤其对于一个相对挑剔的用户群体,有些用户看到有待支付单可自己明明支付过,就会认为我们小程序把他的钱吃了,从而引发客诉。前端改造前端原本流程如下:这个流程有3个问题在调用下单按钮的过程中,支付按钮没有及时置灰,导致用户可以重复点击(手抖、手滑)调用支付预下单接口如果出现异常(例如第三方网络抖动),实际下单是已经成功了,这时如何以及停留在结算页,用户还是会再下一单,最近结果就是用户

2022-01-18 14:03:41 335

原创 Redis 大key、热key优化

Redis 大key、热key优化大key分为两种:字符串类型长度很大以及非字符串类型的数据结构中元素很多危害:集群模式下,内存分配不均,不利于集群管理非字符串的数据结构例如hash,执行hgetall时,大key会导致阻塞过期删除大key导致阻塞读大key时网络阻塞监控:找运维,让他们在从节点上监控,利用scan + memory usage方式。找架构组,在客户端改造或者中间proxy上改造,统计每次写入redis的数据大小,写入elasticsearch,然后在es上

2021-11-01 20:30:20 1162

原创 Mysql优化总结

数据分片为何要分片?1.单表数据过大 ,聚集索引树层树过高,导致查询性能不够。2.写入性能达到瓶颈数据如何分片?1.按照业务ID分片。适用于写入性能达到瓶颈,需要根据某个业务ID将写入压力分散到不同分片中2.按时间维度分片。适用于单表数据过大,但是写入压力不高且查询与写入均能维持在近期的某个范围内。数据分片后如何查询?1.短期方案。查询条件正好包括用于分片的字段,可以直接去指定的分片查询。涉及到排序的可以采用归并排序的方式。2.长期方案。查询条件并不包括用于分片的字段,这时需要全部分片去查

2021-10-22 23:45:25 99

原创 事务中记录锁的范围

测试数据CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` varchar(4) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `b` varchar(4) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `c` varchar(4) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (

2021-10-19 22:24:37 99

原创 我开发中常用的四个设计模式

举个栗子我任职于一家小电商,我这边的下单接口有如下的业务流程:光看这流程图,就可以感知复杂。我在重构时就利用了设计模式,加强了它的扩展性、可读性。模版方法例如优惠券校验这个一小部分,伪代码如下:if 是否使用优惠券 then 优惠券校验else if //do nothingendif 我第一个想到的就是模版方法。将不变的部分放在父类,由不同的子类去实现变化的部分。这里变的部分是校验逻辑,不变的是if-else。父类 AbstractOrderSubmitTransacti

2021-10-08 16:55:15 207

原创 日千万级下单流程设计

注意点:Redis宕机或者MQ宕机需要设计降级方案,当出现中间件宕机时,降级到订单中心下单,同时做好限流避免订单中心被打垮。Redis从宕机中恢复后,数据丢失运维上如何去保证redis不崩溃或者数据不丢失不在讨论范围,我先按下不表。下面说下开发这里该做哪些措施:整个链路会以下两个阶段发送数据丢失1. 发起支付时,数据丢失。这是对于用户来说订单不存在,无法发起支付,在业务上无论是用户还是企业都未受到损失,可以无需理会2. 支付完成回调时,数据丢失。这个很严重的问题,因为用户已经付钱了。.

2021-09-30 19:03:03 159

原创 滑动窗口限流

public class SlipWindowLimit { private final int limit; private final int slotCount; private final Object A; private final LinkedList<Integer> list; public SlipWindowLimit(int limit, int slotCount){ assert (1000 % slotC

2021-09-18 17:32:48 194

原创 MySQL join 学习

Blocked Nested Loop Join (BNLJ)select * from t1 straight_join t2 on t1.a = t2.at1 叫驱动表 ,t2叫被驱动表当t2表上不存在包含列a的索引时先从t1表中取出部分行(这个部分大小小于join_buffer_size),放入join buffer。扫描t2表,将每一行和join buffer中行进行比对符合 t1.a = t2.a 的拼接成结果放入结果集。循环执行第一和第二步,直到取出t1所有行这种join 因

2021-09-17 20:44:31 69

原创 垃圾回收整理

Full GC 场景模拟 public static void main(String[] args) throws InterruptedException { System.gc(); byte[] aaa = new byte[1024*1024]; for(int i=0;i<30;i++){ byte[] bytes = new byte[1024*1024]; TimeUnit.SECONDS

2021-09-17 20:41:08 61

原创 优化涉及的连接相关配置

前言以前总以为压测TPS上不去,是垃圾回收没配好或者Redis性能评测。为了提高TPS,试了多个垃圾回收的优化配置、也把缓存全改成本地缓存,但是信息还是上去。最后其实是连接和线程池都没配置好。小孩子不吃饭,胃口再大也长不高。tomcat配置#最大线程数(指的是处理业务的线程)server.tomcat.threads.max#最小线程数(空闲时依旧不关闭)server.tomcat.threads.min-spare-#队列长度server.tomcat.accept-count#

2021-09-08 16:01:24 261

原创 随手写个互斥锁、共享锁

老是被人问AQS,烦人,我又不是作者,那记得那么多细节。原理我懂,给我个可以保证原子性的工具以及支持等待唤醒的工具,我自己也能实现。包括Redisson它也是利用了Redis的原子性和发布订阅功能来实现。package com.example.demo;import java.util.HashMap;import java.util.LinkedList;import java.util.concurrent.CountDownLatch;import java.util.concurrent

2021-09-08 01:13:52 219

原创 秒杀系统设计与思考

秒杀系统要解决什么削峰填谷,将大批量的请求分批流向DB,避免DB被冲垮兼顾性能的同时,保证下单时查验库存与扣减库存的原子性,避免超卖少卖问题隔离资源,限流,保护除了秒杀系统外的其他系统正常运行。秒杀系统怎么设计前期准备前端防刷。减少用户频繁点击带来的不必要流量。网关限流。根据IP进行限流,阻挡黄牛和恶意用户。技术选型消息中间件,主要用于削峰填谷,主流的kafka、rabbitmq、rocketmq皆可。我这边选我自己比较熟悉的rabbitmq,实测单机可达10000TPS,可满足

2021-09-06 23:25:25 139

原创 数据库MVVC

以下是我自己理解trx_id(可能不是这名字,后面确认下)mysql更新数据都会记录undolog用于回滚,mysql不会去清理事务未结束的undolog。所有不要保持长事务原因就是长事务导致大量的undolog占据空间每行数据更新后都记录trx_id,按照时间递增如果是可重复读隔离级别,在事务启动时执行或者事务中第一条语句执行前执行(可指定),记录当前系统的已提交的事务的trx_id列表。(记为trx_ids),还有当前事务的trx_id(记为this_trx_id)。如果是读已提交隔离级别,

2021-09-03 19:33:46 253

原创 AbstractQueuedSynchronizer 小结

前言有次去大厂面试,问了这个,心底是明白的,表达不够清晰,吃了大亏。下次我就说完给面试官看我的博客AbstractQueuedSynchronizer是Java提供的用于同步的框架,采用了模版方法的设计模式,JUC下多个支持并发的工具例如Semaphore、ReentrantLock都在有内部类实现。acquire该方法会调用子类实现的tryAcquire ,子类实现tryAcquire用于判断是否获取到资源。源码如下public final void acquire(int arg) {

2021-08-27 11:59:43 102

原创 使用RabbitMq做中间件时,生产者如何保证消息不丢失?(基于rabbitTemplate)

使用RabbitMq做中间件时,生产者如何保证消息不丢失?(基于rabbitTemplate)一. 生产者confirm机制配置文件中新增spring.publisher-confirm-type: correlated这个配置是意思是:在发送消息时,带上CorrelationData 对象,这样MQ在收到消息后就可以回调我们的服务,从而可以使用CorrelationData.get 以及 CorrelationData.get(time,TimeUnit) 两个方法监听消息妥投。这两个方法返

2021-08-23 21:46:24 433

原创 间隙锁 学习

间隙锁的目的是解决幻读的问题例如:现在有张学生表(ID,名称,班级,性别)班级建了索引当事务隔离级别为可重复读时,我们在一个事务里执行SELECT * FROM 学生表 WHERE 班级 = 1 FOR UPDATE这时理论上会把 班级 = 1的行都锁住(行锁)但是实际情况是,如果这时班级=1 来了个插班生,而我们只有行锁的话,那个这个插班生的信息是不会被锁住的。我们可以随意更改这个插班生的信息这就违背一开始加锁的语义。所以,间隙锁就很有必要了间隙锁 锁的是 班级(0-1)以及(1-

2021-08-17 22:21:37 74

原创 @Async究竟用哪个线程池

一共可以分三种情况第一种未在手动在项目中配置任何线程池spring boot 会默认添加一个coreSize=8的 无界线程池,名称为applicationTaskExecutor (源码:org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration)这时使用@Async注解使用的就是applicationTaskExecutor线程池第二种在项目配置了线程池,但是只有一个例如,我在项目中配置了一个名为 m

2021-08-17 19:09:25 1790

原创 偶现的org.apache.http.NoHttpResponseException 问题排查

生产环境访问第三方服务,偶现org.apache.http.NoHttpResponseException原因:HttpClient 默认使用长连接+连接池。Http客户端无法及时响应服务端关闭连接,这次如果继续使用这条连接去请求服务端就会导致 org.apache.http.NoHttpResponseException。虽然HttpClient采取了很多方式避免这种情况,例如请求前会校验超时时间、会读socket检测连接是否还在,但是边界情况总是无法避免(这一刻判断连接可用后,在请求发出去后,接

2021-08-17 19:06:30 6296

原创 Redisson Lock 学习

## Redisson Lock 学习1.线程同步队列 WaitThreadQueue ,利用redis list实现,存放当前正在等待锁的线程2.锁等待超时时间 ThreadSet ,利用redis zset实现,hkey存放 线程Id score存放等待锁的超时时间3.锁持有 ThreadHash 利用redis hash 实现 hkey 存放 线程Id hvalue存放 重入次数4.线程进入等待锁阶段以及线程被唤醒 利用redis 发布订阅用法直接用lock()或者 lock(

2021-08-17 19:01:06 280

原创 Spring 不推荐Field注入,为啥我反对

Spring 不推荐Field注入,为啥我反对官方原文咋说的The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected co

2021-08-17 14:44:47 486

空空如也

空空如也

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

TA关注的人

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