- 博客(122)
- 资源 (1)
- 收藏
- 关注
原创 线程池调优,深入理解,线程池各个参数的含义(keepAliveTime 展开说说?)
核心线程满了,后续的任务会放到阻塞队列,阻塞队列满了后,且最大线程-核心线程 > 0, 会安排空闲线程处理任务,当空闲线程加核心线程的总数,大于了最大线程数时,将会触发拒绝策略。这么正确的理解不进来瞧瞧?
2024-01-26 16:52:09 1256
原创 SpringCloud 源码系列之全局 Fegin 日志收集(okHttpClient、httpClient编码配置)
通过阅读okHttpClient、httpClient的默认创建源码,了解到,如果需要自定义okHttpClient、httpClient时,项目中注入即可。同时打印日志的时候,注意用流副本操作,否则会出现 io 流异常关闭的问题。
2024-01-16 08:56:39 1142
原创 雪花算法原理(设计原理、优缺点、如何改造它、以及应用)
在时间戳、工作台按最大值运算后,留给数据中心的有效运算位只有 17 位了,然后数据中心又左移了12 位,留给数据中心的参与运算的bit就只有5位了(17-12=5)。且雪花算法中的时间戳左移了 22 位,加上时间戳本身的 41 位,加起来就有 63 位了,加上第一位的符号位,就是 64 位,正好等于 long 类型的 64 位。由于时间戳占生成id的41 bit位,且这个时间戳是根据服务器时间生成的,一旦服务器时间回拨了一下,你就嗝屁了,可能会生成重复的 id。为什么雪花算法是 64 位的?
2023-11-24 10:41:11 1996
原创 基于 NGram 分词,优化 Es 搜索逻辑,并深入理解了 matchPhraseQuery 与 termQuery
用户在使用的时候,搜(进出口)关键字,说搜不到数据,但是 Es 中确实是有一条标题为 (202009 进出口)的数据的,按道理来说,这确实要命中的,于是我开始回想我当时是如何写的这段搜索逻辑的代码!!!!matchPhraseQuery 命中条件搜索关键字分词要被词库存的分词完全包含在点一的基础上,搜索分词顺序要和词库保持一致在前俩点都满足的情况下,词库中匹配到的分词顺序要紧挨着。
2023-11-04 12:56:32 2391 3
原创 如何实现 Es 全文检索、高亮文本略缩处理(封装工具接口极致解耦)
最近手上在做 Es 全文检索的需求,类似于百度那种,根据关键字检索出对应的文章,然后高亮显示,特此记录一下,其实主要就是处理 Es 数据那块复杂,涉及到高亮文本替换以及高亮字段截取,还有要考虑到代码的复用性,是否可以将转换代码抽离出来,提供给不同结构的索引来使用。
2023-10-08 16:29:28 7706
原创 一文搞懂分库分表算法,通俗易懂(基因法、一致性 hash、时间维度)
最近手上一个系统的访问速度有点慢,老早前用多线程优化过一些接口,将一些复杂 sql 改成单表查询,走内存处理,成功的将 一些 10 多秒的接口优化到 500 ms,但是数据量上来了单表查询效率也有点慢了,不得不考虑进行分库分表了,当然我这里只进行分表,没分库,问就是服务器资源紧张!并借此深入总结一下主流的几种分库还有分表算法。分库分表最繁琐的地方在于迁移数据和比对数据!!!!!!顾名思义将基因拼接到订单 id 上去,这里着重说一下雪花算法,先贴一下烂大街的雪花算法源码/**
2023-09-06 16:17:51 4937 8
原创 手写 Mybatis-plus 基础架构(工厂模式+ Jdk 动态代理统一生成代理 Mapper)
基于对 Mybatis 源码的理解,决定自己手动复刻一个出来,一遍 debug 源码,一遍理解其设计原理,最终悟透,一篇源码级别的复刻文章由此产生
2023-08-21 15:48:40 1836 2
原创 ThreadLocal 在实战场景下的内存泄漏、逻辑混乱问题总结
很早之前虽然看过 ThreadLocal 的源码,但是对于真实业务场景下可能存在的问题没有做过总结,刚好前几天在分析 Mybatis 内存泄漏的问题,想着 ThreadLocal 不是也可能会发生内存泄漏吗?于是乎本文出现了。内存泄漏:我个人理解就是由于程序设计失误,用完的内存空间没有得到应得的释放,这就是内存泄漏。
2023-07-24 15:29:53 641
原创 CaffeineCache+Redis 接入系统做二层缓存,SPI 思路实现(借鉴 mybatis 二级缓存、自动装配源码)
现在手上有个系统写操作比较少,很多接口都是读操作,也就是写多读少,性能上遇到瓶颈了,正所谓前人栽树、后人乘凉,原先系统每次都是查数据库的,性能比较低,如果先查 redis,redis 没数据再查数据库的话,但是还可以更快,那就是使用内存查询,依次按照内存、redis、db的顺序从快到慢查询,可使系统整体的性能提升一个档次,但是仅限于读多写少的场景,写多读少的场景没必要搞这么多缓存,搞多了缓存一致性也是个问题,就好比 mysql 数据库的读多写少,我们可以用 MYISM 存储引擎。
2023-06-20 11:25:41 4300
原创 结合源码剖析Oauth2分布式认证与授权的实现流程
前言最近在做登录、注册、鉴权相关的任务,由于是分布式项目编码起来稍许复杂,其中遇到了些许难题,特此记录一下吧。Oauth2 密码模式认证Oauth2 常用的俩种授权模式,其一:密码模式,其二:授权码模式。可能很多人对这俩种模式不是很熟希,下面将简短的介绍一下。授权码模式:微信扫码登录就是一个很好的例子,第三方应用想要高效快速的开发出一套登录系统,但是不想花太多时间去深层次开发自己的认证中心,微信作为一个拥有众多用户使用的一款app,它里面的用户都是真实的用户,于是乎微信利用Oauth2 为这
2022-06-21 15:30:51 1114
原创 利用netty开发webScoketClient(支持wss协议,客户端、服务端心跳实现)
最近在使用 netty这个框架来开发 webScoketClient用来获取一些流式的数据,之后咱家的前端采用长连接和咱保持联系,咱们后端就是一个中转站,既要编写一个webScoketServer供咱家的前端有奶喝,也要编写一个webScoketClient去挤奶,同时为了保证这个奶是澳大利亚纯装牛奶,还需要用巴氏消毒法对奶做一个品质管控。这样咱家的公司才能有希望做大做强,我才有肉吃。而这也是我为什么写下本文的原因
2021-12-27 16:12:53 5400 1
原创 我的独立开发的小网站已经被XSS注入,被扒的底裤都不剩了!!
咋说呢,最近在二开一个项目(公司花了 10 几个 w 买的现成的源码,代码是真的多,设计模式、安全策略、功能设置全部拉满,缺点就是我对此需要二开),里面有个内容发布的编辑器,客户在使用的过程中,为了图快,直接 copy 网页的文字,粘贴到编辑器里面,发现发布的内容缺失了,一开始还以为是前端格式处理的问题,后来发现在经过后端服务的时候,实际落库的文章内容丢失了一部分,于是我就去 debug 源码了。
2024-10-14 16:36:31 325
原创 mysql 慢查询日志、设置单条数据最大 packet 插入大小指令
Rows_sent 发送给请求方的记录条数 Rows_examined:语句扫描的记录条数 SET timestamp:语句执行的时间点。Time :日志记录的时间 User@Host:执行的用户及主机 Query_time:查询耗费时间 Lock_time 锁表时间。后续直接分析这个文件即可。slow_query_log为 ON 表示已经开启慢查询日志记录。slow_query_log_file:慢查询日志文件存放地址。所有数据库共用一个慢查询日志文件,搞个复杂 sql 执行一下。
2024-10-08 10:14:07 421
原创 API接口自定义字段返回,最终解决方案,再也不用写 vo、dto 转换逻辑了
此套方案太过完美,唯一缺点就是,字段返回基于反射操作,损失一点点性能。
2024-08-16 17:02:50 192
原创 我的小破站好像被黑客攻击了,损失惨重!
之前空闲时间写了一个在线资源网站售卖的 sass 模板。整合了支付宝支付,只要你有资源,都可以通过这套 sass,进行售卖并获取盈利。当时也是写着玩的。有一天发现有人恶意刷请求把服务器搞蹦了。于是乎加了监控,限流的东西。
2024-08-09 10:19:26 207
原创 使用代理,在Mapper层面统一封装VO、Entity 之间的转换逻辑
无聊看看开源项目,无意间看到里面的业务代码用到了BaseMapperPlus,于是点进去发现里面封装了Vo、Entity 之间的转换逻辑。想着自己平时都是手动的进行 copy 转换来着。于是本地进行验证了一番,发现还挺好用的,懒人必备。但是前提是项目中的MybatisPlus 版本高于3.5.3.1,不然有些方法用不了。
2024-07-03 11:45:22 459
原创 函数式开发接口( Consumer、Function)在实际开发中的应用场景
之前有个扫码下载文件需求,由于要同时进行记录下载人的记录。一开始用的是异步进行日志记录。发现有的用户扫码下载了一次文件,日志记录了三条。这种很容易联想到是因为网络抖动造成的。
2024-06-13 17:13:09 340
原创 MQ本地消息事务表
这个方案就是新增了一张本地消息表,记录消息发送失败的日志,且随当前业务事务一块提交。等到业务事务执行完毕后,在执行发送MQ逻辑,此时如果MQ发送失败了也不打紧,本地表兜着底呢,后面可以通过定时扫表的方式进行MQ消息的重新发送如果还不懂这套方案童鞋可以先去搞懂一下,再来阅读本文效果更佳事务方法失效场景。即必须通过代理对象进行的方法调用事务才会生效。声明式事务整个的代理对象是如何创建、事务运行的整套流程全面解读spring注解事务失效场景,伪代码+图文深度解析spring源码运行过程。
2024-05-27 16:48:35 865
原创 利用selenium发挥vip残存的价值
找到与你电脑当前谷歌浏览器版本一致的驱动然后下载下来(大版本一致即可)。我本地版本是 99.0.04844.51。这里需要注意的是,由于我用的是mac,谷歌浏览器的安装位置对于空格命名需要用 \ 处理一下。我这里把 chromedriver 放到 /usr/local/bin 下面了。然后打开我们的控制台,利用命令行方式开启一个 9222 端口的谷歌浏览器窗口。爬哪个网页自己研究下网页结构,xpath定位下就行。出现如下信息说明谷歌浏览器调试功能开好了。找到包里面的这个玩意的路径。
2024-04-19 15:58:35 449 1
原创 站长必备技巧,Linux下mysql、redis、jdk安装全套指令
将如下内容拷贝进去输入 i 进入编辑模式,编辑好后按esc健退出编辑模式,键盘输入 :wq 保存。保存后执行下 source /etc/profile 命令。依次执行如下命令,创建mysql帐号(zzh/123456),并且该帐号授权远程连接。下载 libssl.so.10 文件,然后通过xftp上传到服务器。到此mysql安装完成,本地用navicat即可远程连接了。出现错误,说什么 libssl.so.10 文件缺失。到这一步如果没出啥问题,就算安装好了。依次执行如下命令即可安装成功。
2024-04-19 10:40:31 413
原创 2024破局之路
由于现在的同事B老家是温州的,成了我的饭搭子,那天吃饭的时候,我问他,温州是不是好多人都在做小商品的生意。有些人利用公司资源,一件商品公司定价,假设是1块,自己提高售价,高出的部分当作自己的佣金了。2024和我一块干饭的饭搭子裸辞了,至于原因的话这里不细说,原因的话大家懂得都懂,无非是钱、事、身体上有几项过不去,日积月累做出的决定。很大概率上是因为2023这一年被自己的内耗蠢到,想着未来很多不确定性的事情,或者是不可能发生的事情,然后死循环高负荷的运转自己。到此我的微信小程序梦彻底破碎,还花了钱做认证。
2024-04-16 17:24:41 1028
原创 SpringCloud源码系列之(Ribbon、Hystrix超时正确配置)
SpringCloud源码系列之(Ribbon、Hystrix超时正确配置),包括超时配置生效时机,在源码中体现在哪。以及俩者之间的关系
2024-01-19 14:11:48 1121
原创 SpringCloud 之HttpClient、HttpURLConnection、OkHttpClient切换源码
springcloud源码系列之HttpClient、HttpURLConnection、OkHttpClient切换源码
2024-01-11 12:10:14 1176
原创 开发经验:代码编译、打包正常,运行提示包不存在
天天提交代码,合并代码。经常会发生,代码提交过后,本地的代码跑不起来的情况出现。遇到脾气好点的同事会仔细检查检查下,是否是自己的环境出现的问题,遇到脾气不好的同事,直接就开喷了。怎么每次你一提交代码,我这就跑不起来了。你到底提交了些什么玩意!哈哈哈哈哈这个对话场景都是我内心OS的。同事之间要互相团结,这样效率才高。贴一张报错截图,代码IDE编译没问题,也没有爆红,MAVEN依赖也导入正常,但是点运行的时候就会报错。这个问题很经典。
2024-01-06 16:46:50 580
原创 Redis BitMap(位图)
下面的这段洋文是官网对BitMap的介绍位图不是实际的数据类型,而是在字符串类型上定义的一组面向位的操作,该操作被视为位向量。由于字符串是二进制安全blob,字符串最大为512 MB,因此它们适合设置为2^32个不同的位。从这段话中我们可以知道,BitMap其实就是一个二进制的容器,并且他的二进制位最大为 2^32 位(512Mb = 512 * 1024 * 1024 * 8 = 2^32个bit位),当然我们签到只用的到31 bit 位,因此针对于签到需求来说,Bitmap初始结构长这样。
2023-12-20 09:40:17 1172
原创 Redis 过期删除策略、内存回收策略、单线程理解
不知从何开始Redis的内存淘汰策略也开始被人问及,卷!真的是太卷了。难不成要我们去阅读Redis源码吗,其实问题的答案,在Redis中的配置文件中全有,不需要你阅读源码、这个东西就是个老八股,估计问这个东西是想考察你们做的项目体量大不大。一般用 lru 就行。
2023-12-15 10:26:25 254
原创 Redisson源码研究(包括底层Netty、Promise实现)
纯纯自己一遍遍 debug 的源码,限于文章篇幅,只保留关键节点源码,持续更新。
2023-12-11 10:34:38 1279
原创 Redis 之 ZSET 实战应用场景,持续更新!
ZSET 与 SET 相同点:都是是 String类型元素的集合,且不允许重复的成员ZSET 与 SET 不同点:ZSET 每个元素都会关联一个 Double 类型的分数,Redis 通过分数来为集合中的成员进行从小到大的排序。ZSET 的成员是唯一的,但分数 score 却可以重复
2023-12-04 17:41:34 633
原创 分布式会议室(幂等性校验、同一用户只能报名一次)
当被加锁的业务代码很耗时, 假设业务代码要耗时5s,这个时候来了线程 1、线程 2 同时来竞争锁,由于此时配置的是,锁超过 3s 就会自动释放,当线程 1 拿到锁后,业务代码执行到第3秒的时候,锁已经被自动释放了,此时线程 2 紧接着在第4 s的,来到 doMeetAdd 方法里面,发现该时间段会议室可以被预约,第 5 s 的时候,线程 1 已经成功预约到会议了,第 9s 的时候线程 2 也预约到会议了,就会存在多人重复预约会议的情况出现。如果后续没有解锁操作,每隔 10s,自动锁续命到 30s。
2023-11-30 17:27:56 1117
原创 策略模式调优(多Oss存储导致代码冗余的问题)
背景:本司 Oss 的服务迭代了不下 5 个了!!!!由于本司部分文件是加密存储的,且有对应的配置文件权限的面板,当切换到不同的 Oss 地址需要修改文件权限时,需要切换到对应 Oss 的 ak、sk 才能进行配置。老代码一堆的 if、else 还有各个不同的 OssUtil 着实看着难受,时不时这个 Oss 地址修改不了权限了,但是我明明已经改过了 OssUtil 啊,怎么没生效?
2023-11-17 15:16:33 157
原创 别再跟我说你不理解 @Transactional 为什么会失效了!省流版解读
老早前精读过 @Transactional 的源码,现在有时间提炼提炼一下里面的精华出一期,从源码角度剖析 @Transactional 是怎么开启事务的?@Transactional 回滚流程又是怎样的?的角度出发,帮助大家工作中合理的使用 @Transactional 这个注解。
2023-11-10 16:02:11 262
原创 Linux 环境下 安装 Elasticsearch 7.13.2
借公司的 centos 7 服务器,搭建一个 Es,正好熟悉熟悉 Linux 下的安装流程。
2023-10-31 09:18:21 752
原创 class.forName() 里面都发生了啥?一文搞懂 Spi 机制
左眼用来忘记你,右眼用来回忆你,不是我不爱你,只是哥一直在你心里,大家好我是一只摆烂的小咸鱼,今天给大家介绍 Java Spi 机制原理,以及 Spi 机制在我们身边的应用场景。🌸🌸如果本文对您有帮助 🌸🌸🌸🌸不妨点个免费的赞或者关注 🌸🌸🌸🌸这将成为我前进的最大动力🌸🌸🍉🍉微信公众号刚刚起步,后续有时间将录个视频放到公众号上面,时长大概 10 分钟左右,并且顺带带读者看一下源码,还有空的话会将以往所有写过的源码解读博文,也以视频的方式放到上面去,可以私我先转义哪一篇博文哦!!!🍉🍉。
2023-10-13 15:17:34 183
原创 阿里云 Oss 防刷实现
最近公司的私有 Oss 服务满了,且 Oss 地址需要设置权限,只有当前系统的登录用户才能访问 Oss 下载地址。一开始想着用 Nginx 做个转发来着,Nginx 每当检测当前请求包含特定的 Oss 地址就转发到我们的统一鉴权接口上去,但是紧接着又细想了一下,转发后的地址被恶意分享出去了,不也还是存在文件泄露的风险吗?于是又去翻阅了一下阿里云的 Oss 权限相关的文档。借此整合一些常用的方法,机械代码自留也是分享给大家。
2023-09-27 11:26:19 1311
原创 使用 Docker 安装 Elasticsearch (本地环境 M1 Mac)
将下载好的 IK 包解压丢到 /opt/es/plugins 文件夹下面即可。将 Docker 中的 Elasticsearch 目录挂载到本地。配置 Docker 允许访问的共享文件夹 /opt/es。切换到 /opt/es/plugins 目录下。删除 DS_Store 文件。
2023-09-18 10:40:09 923
原创 mybatis 、ThreadPoolExecutor 导致的 oom 源码角度分析以及解决方案
正所谓前人,栽树后人乘凉。随着项目业务逻辑越来越复杂,屎山代码越积越高,部分接口的响应速度开始变的有点慢,于是乎想着用 CompletableFuture 去将代码去优化一下。但是优化着优化着就感觉有点不对劲了,电脑温度蹭蹭的往上涨,一看内存都要爆了。oom一下子就出现了。创建一个异步任务并执行返回值为1return 1;});阻塞主线程,等待 task1、task2 都执行完毕获取 task1 任务的返回值,task1 未执行完成前主线程将一直阻塞。
2023-07-20 17:15:01 965
原创 责任链实战场景剖析、以及手写责任链
最早接触责任链这个设计模式,是我老早前看 Spring Aop 的源码的时候,Aop 的原理是遍历一根按照顺序装载好的 Advice(通知)拦截器链条,使@Before、@After 这些 Advice(通知)中的逻辑有顺序执行。如果我们没有 @After 的需要 ,Spring 只需把拦截器链条中的 @After 这个节点去掉就是了。十分的方便快捷!
2023-06-08 10:51:39 1230
四年java开发需具备的技能
2023-12-18
TA创建的收藏夹 TA关注的收藏夹
TA关注的人