- 博客(18)
- 收藏
- 关注
原创 redisson内存泄漏问题排查
遇到难啃问题几乎是每个开发不可避免的事情,解决问题的过程,方法和事后复盘,经验总结非常重要,对个人的学习和能力提升有很大的帮助。以下几点是我本次的总结:及时止损当生产出现问题,很多开发同学首先会想如何找到原因,解决根本问题,但实际情况应该是评估影响,及时止损,避免问题发散,扩大影响。例如不能在短时间内解决的,还要下来慢慢看日志,分析代码的,能回滚的先回滚,能重启的先重启,争取在出现资损前解决问题,减少对业务产生影响。向上汇报。
2024-09-24 10:30:43
519
1
原创 使用线程池你应该知道的知识点
多线程编程是每一个开发必知必会的技能,在实际项目中,为了避免频繁创建和销毁线程,我们通常使用池化的思想,用线程池进行多线程开发。线程池在开发中使用频率非常高,也包含不少知识点,是一个高频面试题,本篇总结线程池的使用经验和需要注意的问题,更好的应对日常开发和面试。如有更多知识点,欢迎补充~
2024-07-29 11:50:03
850
原创 netty Recycler对象池
之前我们也分析过,这也是一个池化实现,在redis客户端也有应用,但它是通过加锁解决并发问题的,设计没有netty这么精细。上面的源码来自netty4.1.42,从整体上看整个Recycler的设计还是比较复杂的,主要为了解决多线程竞争和GC问题,导致整个代码复杂度比较高,所以netty在后来的版本中对其进行重构。不过这不影响我们对它思想的学习,以后也可以借鉴到实际开发中。
2024-03-15 10:00:56
845
1
原创 cglib FastClass机制
经过上面的分析,我们可以看到cglib在整个调用过程并没有用到反射,而是使用FastClass对每个方法进行索引,通过方法名称,参数长度,参数类型就可以找到具体的方法,因此性能较好。但也有缺点,首次调用需要生成3个类,会比较慢。另外MethodProxy还有一个invoke方法,如果我们换一下调用这个方法会发生?留给大家自己尝试。//换成 methodProxy.invoke(o, objects);
2024-03-12 10:24:54
709
3
原创 这样delete居然不走索引
由于业务变迁,合规要求,我们需要删除大量非本公司的数据,涉及到上百张表,几个T的数据清洗。我们的做法是先从基础数据出发,将要删除的数据id收集到一张表,然后再由上往下删除子表,多线程并发处理。我们使用的是阿里的polardb,完全兼容mysql协议,5.7版本,RC隔离级别。。从日志上看是获取锁失败了,马上想到出现死锁了,但我们使用RC,这个隔离级别下会出现不可重复读和幻读,但没有间隙锁等,并发效率比较高,在我们实际应用过程中,也很少遇到加锁失败的问题。
2023-12-26 10:25:06
1440
1
原创 这下对阿里java这几条规范有更深理解了
每条开发规范都有其背后的含义,都是经验总结和踩坑教训,对于团队的开发规范我们都要仔细阅读,严格遵守。可以看到上面每个小问题都可能导致不小的生产事故,保持敬畏之心,大概就是这个意思了吧。
2023-12-04 10:18:33
974
原创 为了简写这行代码,我竟使用静态和动态编译技术
ASM是一个通用的 Java 字节码操作和分析框架。它可用于直接以二进制形式修改现有类或动态生成类。ASM 提供了一些常见的字节码转换和分析算法,可以从中构建自定义的复杂转换和代码分析工具。ASM 提供与其他 Java 字节码框架类似的功能,但重点关注性能。因为它的设计和实现尽可能小且尽可能快,所以它非常适合在动态系统中使用(但当然也可以以静态方式使用,例如在编译器中)。// 创建一个ClassWriter,用于生成字节码// 定义类的头部信息// 生成默认构造函数。
2023-10-31 10:12:19
154
1
原创 在同事的代码中学习-责任链模式
不知道大家有没有发现,设计模式学习起来其实不容易,并不是说它难,主要是它表达的是思想层面或者说抽象层面的东西,如果你没有实践经历过,感觉就是看了就懂,过了就忘。所以本人现在也不多花费时间去专门学习设计模式,而是平时在看一些框架源码时,多留意,多学习别人的设计方法和实现思路,在平时工作中,遇到比较复杂的场景,不好看的代码,或者想要更优雅的写法时,再反过来去翻设计模式,这样学习起来印象更加深刻,出去面试时,有解决场景也比背书要更容易说服别人。
2023-08-23 09:58:49
110
原创 使用redis pipeline提升性能
本篇来介绍一下redis pipeline,主要是由于最近一次在帮开发同学review代码的时候,发现对redis有个循环操作可以优化。场景大概是这样的,根据某个uid要从redis查询一批数据,每次大概1000个key左右,如果查得到就返回,否则查db,然后写回缓存。由于每次要查的key比较多,虽然redis单次查询很快,但如果key很多,每次查询redis都需要读写socket,与client间的网络数据传输,都需要消耗时间,累加起来也会变得非常慢。
2023-08-21 10:41:23
624
1
原创 并发工具类Phaser
Phaser是jkd7后提供的同步工具类,它底层并没有使用AQS同步工具。相比CountDownLatch等它提供了更丰富的功能,但也意味着它更复杂,需要更多的资源,一些简单的场景CountDownLatch等工具类能满足的就使用它们即可,考虑性能,还有灵活性时才考虑使用Phaser,如笔者的场景使用Phaser就更加适合。
2023-08-14 13:53:52
91
原创 这么分页,小心有坑
我们说到mysql会考虑到数据的分布,虽然我们上面的repayment_time字段是建索引,运营当时的查询条件刚好覆盖了整个表的数据,当翻到第8页时,整个表总共也就8页,就是要查全部数据了,mysql此时会放弃使用索引,进行全表扫描。生产上有个导报表功能,工作了很长一段时间一直都很稳,没出现过什么问题,最近运营同学突然反馈导出来的数据和实际的对不上,经过排查发现导出的数据有重复,也有的没导出来。有一条数据在第6页查出,在第8页又被查出。我们对比了实际数据,确实有问题,有的数据出现两次,有的没出现。
2023-08-09 11:41:14
56
1
原创 面试再也不怕问ThreadLocal了
要解决多线程并发问题,常见的手段无非就几种。加锁,如使用synchronized,ReentrantLock,加锁可以限制资源只能被一个线程访问;CAS机制,如AtomicInterger,AtomicBoolean等原子类,通过自旋的方式来尝试修改资源;还有本次我们要介绍的ThreadLocal类,通过为每个线程维护一个变量副本,每个线程都有自己的资源了,自然没有并发问题。
2023-08-08 15:07:04
93
原创 是时候丢掉BeanUtils了
会用之后我们可以学习一下它的原理了,这也是我们平时学习一个新的东西的习惯,别一下子就扎到原理,源码里头,这样会严重打击学习热情,要先跑起来先,看到成果后你会更有激情学习下去。其实mapstruct的原理和lombok是一样的,都是在编译期间生成代码,而不会影响运行时。例如我们最常见的@Data注解,查看源文件你会发现getter/setter生成了,源文件的类不会有@Data注解。java代码编译和执行的整个过程包含三个主要机制:1.java源码编译机制 2.类加载机制 3.类执行机制。
2023-08-07 10:50:43
86
1
原创 小心,线程池还有这个坑
通过源码分析我们知道,当调用Future.get()线程阻塞时,它的恢复是靠FutureTask.run()恢复的,也就是我们提交的任务被执行后恢复。当我们线程shutdown后,再submit任务确实会触发拒绝策略,但CallerRunsPolicy会判断线程池状态是否是shutdown,如果不是,就直接调用Runnable.run()方法,相当于在调用线程执行。如果是shutdown状态就什么都不做,问题就出在这里,我们是要依靠它的执行来恢复阻塞的,现在什么都不做,就无法恢复了。
2023-08-04 09:51:40
247
1
原创 一次服务启动慢问题排查
这不本人就遇到一个服务启动慢的问题,印象中服务启动是比较快的,一般也就20几秒,但这次开发一个需求发现服务启动要接近1分钟,这对本地开发调试,测试同学测试都是非常不方便的,影响工作效率。我们看如下的详细过程,发现确实如此。随着时间推移,参与开发的人员越来越多,项目代码也会越来越复杂,需要我们有意识的定期对代码进行优化,有问题及时解决,避免技术债务越积越多。3.在启动时做一些框架初始化,如使用数据库orm框架,通常需要加载数据库元信息,如果数据库表过多,加载时间长,可能导致服务启动慢。
2023-08-03 10:05:01
320
原创 kafka分区分配策略
这4种分区分配策略是可以配置的,客户端通过partition.assignment.strategy参数进行设置,默认是RangeAssignor。更多分享,欢迎关注我的github:https://github.com/jmilktea/jtea。
2023-08-02 08:00:00
443
1
原创 常见限流算法
限流顾名思义是对流量大小进行限制,防止请求数量超过系统的负载能力,导致系统崩溃,起到保护作用。现实生活中限流也随处可见,节假日出门旅行的人数会剧增,对于旅游景点来说往往会不堪重负,如果不进行人数控制,对整个景点的压力会非常大,游客的体验也会非常差,还容易出现安全事故等危险。同样的在一线城市地铁限流也非常常见,早高峰为了控制乘车人数和有序进站,地铁往往会在地铁口进行拦截,一定时间内才放行一部分人进站乘车。具体到程序,限流可以有以下几种场景限制某个接口每秒最多访问多少次。
2023-07-28 17:47:23
140
1
原创 详解redis网络IO模型
“redis是单线程的” 这句话我们耳熟能详。但它有一定的前提,redis整个服务不可能只用到一个线程完成所有工作,它还有持久化、key过期删除、集群管理等其它模块,redis会通过fork子进程或开启额外的线程去处理。所谓的单线程是指从网络连接(accept) -> 读取请求内容(read) -> 执行命令 -> 响应内容(write),这整个过程是由一个线程完成的,至于为什么redis要设计为单线程,主要有以下原因:按照redis官方介绍,单个节点的redis qps可以达到10w+,已经非常优秀,如果
2022-12-07 10:52:29
593
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人