动手写框架
文章平均质量分 80
通过手写 Hibernate 框架,加深对与 ORM 的理解
老马啸西风
Github: https://github.com/houbb
Email:houbinbin.echo@gmail.com
展开
-
从零手写实现 nginx,为什么不能有 java 版本的 nginx?(已完结,共 35 讲)
大家好,我是老马。很高兴遇到你。作为一个 java 开发者,工作中一直在使用 nginx。却发现一直停留在使用层面,无法深入理解。有一天我在想,为什么不能有一个 java 版本的 nginx 呢?一者是理解 nginx 的设计灵魂,再者 java 开发者用 java 语言的服务器不是更加自然吗。于是动手开始写一个简单版本的 nginx。原创 2024-07-31 00:11:38 · 1172 阅读 · 0 评论 -
Aapche POI java excel 操作工具包入门
获取 Excel 的内容,并且处理为 CSV。原创 2024-07-28 18:33:20 · 268 阅读 · 0 评论 -
iexcel-excel 大文件读取和写入-05-file bytes 获取文件字节信息
通过 append() 方法写入对应的列表信息,然后就可以通过 bytes() 方法获取该 excel 对应的内容信息。所以直接返回 excel 文件对应的文件内容 bytes[] 数组信息,用户可以根据该字节数组信息,进行相关操作。有时候我们并不需要直接生成一个 excel 文件,可以根据 excel 内容,进行相关自定义操作。这里直接创建一个引导类,因为不涉及到 excel 文件,可以暂时不指定文件路径。可以返回一个文件流,但是个人感觉如果流忘记关闭等反而比较麻烦。原创 2024-07-28 18:32:47 · 264 阅读 · 0 评论 -
iexcel-excel 大文件读取和写入-04-order 指定列顺序
*** 指定顺序编号* 解释:默认是按照 Field 信息直接反射处理的,但是有一种情况反射的字段顺序可能会是错乱的。* 如进行内存对齐的时候,这个概率虽然很低,但是可以通过指定 order 属性来处理。* (1)order 值越小,生成 excel 列越靠前。* (2)无注解的字段默认 order=0* @return 顺序编号参见测试类。@ExcelField(headName = "姓名", order = 1)原创 2024-07-28 18:31:36 · 446 阅读 · 0 评论 -
iexcel-excel 大文件读取和写入-03-@ExcelField 注解介绍
有时候我们需要灵活的指定字段属性,比如对应的 excel 表头字段名称。比如是否要读写这一行内容。注解就是为此设计。原创 2024-07-28 18:30:17 · 419 阅读 · 0 评论 -
iexcel-excel 大文件读取和写入-02-Excel 引导类简介
相比较于 static 方法,fluent 的对象工具更便于后期拓展。为了用户方便使用,提供了常见的默认属性,以及灵活的 api 接口。ExcelBs.newInstance("excel文件路径")使用上述方式即可创建。会根据文件后缀,自动选取 03 excel 或者 07 excel 进行读写。原创 2024-07-28 18:29:25 · 359 阅读 · 0 评论 -
iexcel-excel 大文件读取和写入,解决 excel OOM 问题-01-入门介绍
IExcel用于优雅地读取和写入 excel。避免大 excel 出现 oom,简约而不简单。原创 2024-07-28 18:28:02 · 794 阅读 · 0 评论 -
从零手写 tomcat
mini-cat 是简易版本的 tomcat 实现。别称【嗅虎】(心有猛虎,轻嗅蔷薇。原创 2024-04-22 21:43:34 · 2333 阅读 · 0 评论 -
rate-limit 一款 java 开源渐进式分布式限流框架使用介绍
RateLimit限流注解放在方法上,指定对应的限制频率。也可以定义在类上,默认下面的所有方法生效。方法上的优先级高于类。属性说明默认值value方法访问一次消耗的令牌数1timeUnit时间单位interval时间间隔60count可调用次数1000enable是否启用true默认为 60S 内,可以调用 1000 次。} }这个例子中我们 2S 内最多调用 5 次。和上面使用类似,直接在方法上声明@RateLimit注解即可。} }原创 2022-12-13 17:41:47 · 1015 阅读 · 0 评论 -
开源项目在线化 中文繁简体转换/敏感词/拼音/分词/汉字相似度/markdown 目录
以前在 github 上自己开源了一些项目。碍于技术与精力,大部分项目都是 java 实现的。这对于非 java 开发者而言很不友好,对于不会编程的用户更加不友好。为了让更多的人可以使用到这些简单的小工具,周末抽时间将几个开源项目添加了 web 服务实现。简介:支持中文繁简体的在线转换。在线地址:https://houbb.github.io/opensource/opencc4j/开源地址:https://github.com/houbb/opencc4j此处仅选择一个作为例子介绍,其他用法大同小异。【处原创 2022-11-06 21:49:26 · 656 阅读 · 0 评论 -
【mq】从零开始实现 mq-13-注册鉴权 auth
前景回顾【mq】从零开始实现 mq-01-生产者、消费者启动 【mq】从零开始实现 mq-02-如何实现生产者调用消费者?【mq】从零开始实现 mq-03-引入 broker 中间人【mq】从零开始实现 mq-04-启动检测与实现优化【mq】从零开始实现 mq-05-实现优雅停机【mq】从零开始实现 mq-06-消费者心跳检测 heartbeat【mq】从零开始实现 mq-07-负载均衡 load balance【mq】从零开始实现 mq-08-配置优化 fluent【mq】从零开始实现原创 2022-05-19 14:14:01 · 578 阅读 · 1 评论 -
【mq】从零开始实现 mq-12-消息的批量发送与回执
前景回顾【mq】从零开始实现 mq-01-生产者、消费者启动 【mq】从零开始实现 mq-02-如何实现生产者调用消费者?【mq】从零开始实现 mq-03-引入 broker 中间人【mq】从零开始实现 mq-04-启动检测与实现优化【mq】从零开始实现 mq-05-实现优雅停机【mq】从零开始实现 mq-06-消费者心跳检测 heartbeat【mq】从零开始实现 mq-07-负载均衡 load balance【mq】从零开始实现 mq-08-配置优化 fluent【mq】从零开始实现原创 2022-05-18 10:14:34 · 844 阅读 · 0 评论 -
【mq】从零开始实现 mq-11-消费者消息回执添加分组信息 pull message ack groupName
前景回顾【mq】从零开始实现 mq-01-生产者、消费者启动 【mq】从零开始实现 mq-02-如何实现生产者调用消费者?【mq】从零开始实现 mq-03-引入 broker 中间人【mq】从零开始实现 mq-04-启动检测与实现优化【mq】从零开始实现 mq-05-实现优雅停机【mq】从零开始实现 mq-06-消费者心跳检测 heartbeat【mq】从零开始实现 mq-07-负载均衡 load balance【mq】从零开始实现 mq-08-配置优化 fluent【mq】从零开始实现原创 2022-05-17 23:29:52 · 574 阅读 · 0 评论 -
【mq】从零开始实现 mq-10-消费者拉取消息回执 pull message ack
前景回顾【mq】从零开始实现 mq-01-生产者、消费者启动 【mq】从零开始实现 mq-02-如何实现生产者调用消费者?【mq】从零开始实现 mq-03-引入 broker 中间人【mq】从零开始实现 mq-04-启动检测与实现优化【mq】从零开始实现 mq-05-实现优雅停机【mq】从零开始实现 mq-06-消费者心跳检测 heartbeat【mq】从零开始实现 mq-07-负载均衡 load balance【mq】从零开始实现 mq-08-配置优化 fluent【mq】从零开始实现原创 2022-05-12 22:17:47 · 507 阅读 · 0 评论 -
【mq】从零开始实现 mq-09-消费者拉取消息 pull message
前景回顾【mq】从零开始实现 mq-01-生产者、消费者启动 【mq】从零开始实现 mq-02-如何实现生产者调用消费者?【mq】从零开始实现 mq-03-引入 broker 中间人【mq】从零开始实现 mq-04-启动检测与实现优化【mq】从零开始实现 mq-05-实现优雅停机【mq】从零开始实现 mq-06-消费者心跳检测 heartbeat【mq】从零开始实现 mq-07-负载均衡 load balance【mq】从零开始实现 mq-08-配置优化 fluent【mq】从零开始实现原创 2022-05-11 19:38:15 · 705 阅读 · 0 评论 -
【mq】从零开始实现 mq-08-配置优化 fluent
前景回顾【mq】从零开始实现 mq-01-生产者、消费者启动 【mq】从零开始实现 mq-02-如何实现生产者调用消费者?【mq】从零开始实现 mq-03-引入 broker 中间人【mq】从零开始实现 mq-04-启动检测与实现优化【mq】从零开始实现 mq-05-实现优雅停机【mq】从零开始实现 mq-06-消费者心跳检测 heartbeat【mq】从零开始实现 mq-07-负载均衡 load balance【mq】从零开始实现 mq-08-配置优化 fluentfluent大家好,原创 2022-05-10 22:12:24 · 445 阅读 · 0 评论 -
更好的 java 重试框架 sisyphus 的 3 种使用方式
回顾我们前面学习了更好的 java 重试框架 sisyphus 入门简介更好的 java 重试框架 sisyphus 配置的 2 种方式介绍更好的 java 重试框架 sisyphus 背后的故事java 重试框架 sisyphus 开源地址这一节让我们一起学习下 sisyphus 的 3 种使用方式。sisyphus 代理模板目的为了便于用户更加方便地使用注解,同时又不依赖 spring。提供基于代码模式+字节码增强实现的方式。使用案例maven 引入引入注解相关模块。&l原创 2021-10-23 11:28:47 · 323 阅读 · 0 评论 -
更好的 java 重试框架 sisyphus 配置的 2 种方式介绍
回顾我们前面学习了更好的 java 重试框架 sisyphus 入门简介更好的 java 重试框架 sisyphus 背后的故事这一节让我们一起学习下 sisyphus 基于函数式的配置和注解式的配置。函数式配置概览为了满足更加方便的配置,Retryer 类提供了许多可以配置的信息。默认配置/** * 默认配置测试 */public void defaultConfigTest() { Retryer.<String>newInstance()原创 2021-10-21 20:33:41 · 211 阅读 · 0 评论 -
更好的 java 重试框架 sisyphus 入门简介
What is Sisyphussisyphus 综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活。为什么选择这个名字我觉得重试做的事情和西西弗斯很相似。一遍遍的重复,可能徒劳无功,但是乐此不疲。人一定要想象西西弗斯的快乐。——加缪其他原因以前看了 java retry 的相关框架,虽然觉得其中有很多不足之处。但是没有任何重复造轮子的冲动,觉得是徒劳无功的。当然这段时间也看了 Netty 的接口设计,和 Hibernate-Validator原创 2021-10-20 21:41:18 · 361 阅读 · 1 评论 -
更好的 java 重试框架 sisyphus 背后的故事
sisyphus 综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活。今天,让我们一起看一下西西弗斯背后的故事。情景导入简单的需求产品经理:实现一个按条件,查询用户信息的服务。小明:好的。没问题。代码UserService.javapublic interface UserService { /** * 根据条件查询用户信息 * @param condition 条件 * @return User 信息原创 2021-10-19 21:26:40 · 275 阅读 · 0 评论 -
java 文档自动生成的神器 idoc
写文档作为一名开发者,每个人都要写代码。工作中,几乎每一位开发者都要写文档。因为工作是人和人的协作,产品要写需求文档,开发要写详细设计文档,接口文档。可是,作为一个懒人,平时最讨厌的一件事情就是写文档。写文档最令我不爽的地方是在于代码备注要改一遍,然后文档再改一遍。所有重复的劳作,都是对于我们宝贵摸鱼时间的最大浪费。于是,我就常常想,能不能只写一遍呢?i-doc 项目简介idoc 为 java 项目生成项目文档。基于原生的 java 注释,尽可能的生成简介的文档。用户可以自定义自己的模原创 2021-10-14 23:06:56 · 1974 阅读 · 0 评论 -
5 年,只为了一个更好的校验框架
天地初开五年前,科技大厦 1 层 B 座。小明的眼睛直勾勾地盯着屏幕,双手噼里啪啦的敲着键盘。思考是不存在的,思考只会让小明的速度降下来。优秀的程序员完全不需要思考,就像不需要写文档和注释一样。“真是简单的需求啊”,小明觉得有些无聊,“毫无挑战。”和无数个 web 开发者一样,小明今天做的是用户的注册功能。首先定义一下对应的用户注册对象:public class UserRegister { /** * 名称 */ private String name原创 2021-08-10 20:03:09 · 321 阅读 · 0 评论 -
一个提升英文单词拼写检测性能 1000 倍的算法?
序言小明同学上一次在产品经理的忽悠下,写好了一个中英文拼写纠正工具:https://github.com/houbb/word-checker。本来以为可以一劳永逸了,直到昨天闲来无事,发现了另一个开源项目,描述简要如下:Spelling correction & Fuzzy search: 1 million times faster through Symmetric Delete spelling correction algorithmThe Symmetric Delete sp原创 2021-07-25 12:04:10 · 792 阅读 · 8 评论 -
从代码生成说起,带你深入理解 mybatis generator 源码
枯燥的任务这一切都要从多年前说起。那时候刚入职一家新公司,项目经理给我分配了一个比较简单的工作,为所有的数据库字段整理一张元数据表。因为很多接手的项目文档都不全,所以需要统一整理一份基本的字典表。如果是你,你会怎么处理这个任务呢?重复的工作一开始我是直接准备人工把所有的字段整理一遍,然后整理出对应的 SQL 插入到元数据库管理表中。meta_table 元数据表信息meta_field 元数据字段信息一开始还有点激情,后来就是无尽的重复,感觉十分无聊。于是,我自己动手写了一个开源的小工具原创 2021-07-22 21:18:34 · 389 阅读 · 1 评论 -
java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊!
简单的需求临近下班,小明忙完了今天的任务,正准备下班回家。一条消息闪烁了起来。“最近发现公众号的拼写检查功能不错,帮助用户发现错别字,体验不错。给我们系统也做一个。”看着这条消息,小明在内心默默问候了一句。“我 TND 的会做这个,就直接去人家总部上班了,在这受你的气。”“好的”,小明回复到,“我先看看”今天,天王老子来了我也得下班,耶稣也留不住。小明想着,就回家了。冷静分析说到这个拼写检查,小明其实是知道的。自己没吃过猪肉,还是见过猪跑的。平时看过一些公众号大佬分享,说是公众号推原创 2021-07-21 21:52:03 · 3019 阅读 · 7 评论 -
开源神器:自动生成随机 mock 数据测试对象
测试的痛点大家好,我是老马。每一位开发者大部分工作都是写代码、测试代码、修BUG。我们有很多测试代码,总是花费大量的实践去构建一个对象。于是就在想,能不能自动填充一个对象呢?于是去 github 查了一下,找到了一个测试神器 data-factory。https://github.com/houbb/data-factory/data-factory作用data-factory 项目用于根据对象,随机自动生成初始化信息。便于测试。特性8 大基本类型的支持数组、对象、枚举原创 2020-12-25 21:49:18 · 1991 阅读 · 1 评论 -
java 如何从零实现一个数据库差异对比工具?
对比数据的痛苦不知道你是否也像我一样,在快乐编写代码的时候,必须进行一些数据库的数据对比工作。诚然,一般的数据差异,比如是每一行的内容不同,市场上有比较成熟的 compare2 等对比工具。但是如果是对比数据的每一列是否相同,这个就会变得比较麻烦。v1.0 纯人工对比我们在做一些数据迁移等功能时,经常需要对比数据是否正确,最常见的方法就是人工一列一列的对比。一开始老马也是这么和同事对的,对了几天之后感觉效率实在是低,而且还容易看花眼。于是我就是琢磨,这个东西用程序对比应该会简单很多。v2.原创 2020-12-12 09:39:19 · 1014 阅读 · 1 评论 -
java 手写并发框架(二)异步转同步框架封装锁策略
序言上一节我们学习了异步查询转同步的 7 种实现方式,今天我们就来学习一下,如何对其进行封装,使其成为一个更加便于使用的工具。思维导图如下:拓展阅读java 手写并发框架(1)异步查询转同步的 7 种实现方式异步转同步的便利性实现方式循环等待wait & notify使用条件锁使用 CountDownLatch使用 CyclicBarrierFutureSpring EventListener上一节我们已经对上面的 7 种实现方式进行了详原创 2020-10-12 21:51:04 · 631 阅读 · 0 评论 -
从零手写缓存框架(14)redis渐进式rehash详解
redis 的 rehash 设计本文思维导图如下:HashMap 的 rehash 回顾读过 HashMap 源码的同学,应该都知道 map 在扩容的时候,有一个 rehash 的过程。没有读过也没有关系,可以花时间阅读下 从零开始手写 redis(13) HashMap源码详解 简单了解下整个过程即可。HashMap 的扩容简介这里简单介绍下:扩容(resize)就是重新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组原创 2020-10-11 21:50:50 · 997 阅读 · 0 评论 -
从零开始手写缓存框架 redis(13)HashMap 源码原理详解
为什么学习 HashMap 源码?作为一名 java 开发,基本上最常用的数据结构就是 HashMap 和 List,jdk 的 HashMap 设计还是非常值得深入学习的。无论是在面试还是工作中,知道原理都对会我们有很大的帮助。本篇的内容较长,建议先收藏,再细细品味。不同于网上简单的源码分析,更多的是实现背后的设计思想。涉及的内容比较广泛,从统计学中的泊松分布,到计算机基础的位运算,经典的红黑树、链表、数组等数据结构,也谈到了 Hash 函数的相关介绍,文末也引入了美团对于 HashMap 的源原创 2020-10-10 21:39:03 · 1063 阅读 · 0 评论 -
java 手写并发框架(一)异步查询转同步的 7 种实现方式
序言本节将学习一下如何实现异步查询转同步的方式,共计介绍了 7 种常见的实现方式。思维导图如下:异步转同步业务需求有些接口查询反馈结果是异步返回的,无法立刻获取查询结果。比如业务开发中我们调用其他系统,但是结果的返回确实通知的。或者 rpc 实现中,client 调用 server 端,结果也是异步返回的,那么如何同步获取调用结果呢?正常处理逻辑触发异步操作,然后传递一个唯一标识。等到异步结果返回,根据传入的唯一标识,匹配此次结果。如何转换为同步正常的应用场景很多,但是有时原创 2020-10-09 21:12:08 · 1141 阅读 · 0 评论 -
从零开始手写缓存框架(12)redis expire 过期的随机特性详解及实现
前言java从零手写实现redis(一)如何实现固定大小的缓存?java从零手写实现redis(二)redis expire 过期原理java从零手写实现redis(三)内存数据如何重启不丢失?java从零手写实现redis(四)添加监听器java从零手写实现redis(五)过期策略的另一种实现思路java从零手写实现redis(六)AOF 持久化原理详解及实现java从零开始手写redis(七)LRU 缓存淘汰策略详解java从零开始手写redis(八)朴素 LRU 淘汰算法性能优化第二原创 2020-10-08 14:32:56 · 866 阅读 · 0 评论 -
java 从零开始手写 redis(11)clock时钟淘汰算法详解及实现
前言java从零手写实现redis(一)如何实现固定大小的缓存?java从零手写实现redis(三)redis expire 过期原理java从零手写实现redis(三)内存数据如何重启不丢失?java从零手写实现redis(四)添加监听器java从零手写实现redis(五)过期策略的另一种实现思路java从零手写实现redis(六)AOF 持久化原理详解及实现java从零开始手写 redis(七)LRU 缓存淘汰策略详解前面我们实现了 FIFO/LRU/LFU 等常见的淘汰策略,不过在操作原创 2020-10-07 19:20:42 · 2388 阅读 · 0 评论 -
java 从零开始手写 redis(十)缓存淘汰算法 LFU 最少使用频次
前言java从零手写实现redis(一)如何实现固定大小的缓存?java从零手写实现redis(三)redis expire 过期原理java从零手写实现redis(三)内存数据如何重启不丢失?java从零手写实现redis(四)添加监听器java从零手写实现redis(五)过期策略的另一种实现思路java从零手写实现redis(六)AOF 持久化原理详解及实现java从零手写实现redis(七)LRU 缓存淘汰策略详解从零开始手写 redis(八)朴素 LRU 淘汰算法性能优化本节一起来原创 2020-10-06 21:56:18 · 1089 阅读 · 0 评论 -
从零开始手写 redis(八)朴素 LRU 淘汰算法性能优化
前言java从零手写实现redis(一)如何实现固定大小的缓存?java从零手写实现redis(三)redis expire 过期原理java从零手写实现redis(三)内存数据如何重启不丢失?java从零手写实现redis(四)添加监听器java从零手写实现redis(五)过期策略的另一种实现思路java从零手写实现redis(六)AOF 持久化原理详解及实现我们前面简单实现了 redis 的几个特性,java从零手写实现redis(一)如何实现固定大小的缓存? 中实现了先进先出的驱除策略。原创 2020-10-04 18:12:36 · 1003 阅读 · 0 评论 -
java 从零开始手写 redis(六)redis AOF 持久化原理详解及实现
前言java从零手写实现redis(一)如何实现固定大小的缓存?java从零手写实现redis(三)redis expire 过期原理java从零手写实现redis(三)内存数据如何重启不丢失?java从零手写实现redis(四)添加监听器java从零手写实现redis(五)过期策略的另一种实现思路我们前面简单实现了 redis 的几个特性,java从零手写实现redis(三)内存数据如何重启不丢失? 中实现了类似 redis 的 RDB 模式。redis aof 基础Redis AOF 持原创 2020-10-02 12:59:32 · 1065 阅读 · 0 评论 -
java 从零开始手写 redis(五)过期策略的另一种实现思路
前言java从零手写实现redis(一)如何实现固定大小的缓存?java从零手写实现redis(三)redis expire 过期原理java从零手写实现redis(三)内存数据如何重启不丢失?java从零手写实现redis(四)添加监听器前面实现了 redis 的几个基本特性,其中在 expire 过期原理时,提到了另外一种实现方式。这里将其记录下来,可以拓展一下自己的思路。以前的实现方式核心思路原来的实现方式见:java从零手写实现redis(三)redis expire 过期原理原创 2020-10-01 22:18:39 · 613 阅读 · 0 评论 -
从零开始手写 redis(四)监听器的实现
前言java从零手写实现redis(一)如何实现固定大小的缓存?java从零手写实现redis(三)redis expire 过期原理java从零手写实现redis(三)内存数据如何重启不丢失?本节,让我们来一起学习一下如何实现类似 guava-cache 中的 removeListener 删除监听器,和类似 redis 中的慢日志监控的 slowListener。删除监听器说明我们在两种场景下删除数据是对用户透明的:(1)size 满了之后,进行数据淘汰。(2)expire 过期时,清原创 2020-09-30 19:56:08 · 1007 阅读 · 0 评论 -
从零手写 cache 之 redis expire 过期实现原理
前言我们在 从零手写 cache 框架(一)实现固定大小的缓存 中已经初步实现了我们的 cache。本节,让我们来一起学习一下如何实现类似 redis 中的 expire 过期功能。过期是一个非常有用的特性,比如我希望登录信息放到 redis 中,30min 之后失效;或者单日的累计信息放在 redis 中,在每天的凌晨自动清空。代码实现接口我们首先来定义一下接口。主要有两个:一个是多久之后过期,一个是在什么时候过期。public interface ICache<K, V>原创 2020-09-28 20:11:15 · 1726 阅读 · 0 评论 -
从零开始手写缓存之如何实现固定缓存大小
程序员的三高前段时间有一位同事体检,体检医生说他三高。我打趣道,程序员三高不是高性能、高并发、高可用吗?你是哪三高?每一个追求性能的开发者,都对高性能孜孜不倦地追求着,而缓存是我们踏上这条高性能大道的必经之路。小到 cpu 设计,大到服务分布式缓存,我们每时每刻都在接触缓存,今天我们就一起学习下缓存的发展之路,以及如何如何手写一个可以指定大小的 cache。cache 发展之路古代社会 - HashMap当我们应用有一定流量之后或者查询数据库特别频繁,这个时候就可以祭出我们的java中自带的H原创 2020-09-27 23:17:25 · 574 阅读 · 5 评论