- 博客(293)
- 资源 (1)
- 收藏
- 关注

原创 Mybatis从零开始学习系列
项目日志:Log4j与Log4j2日志记录详解(一)Mybatis入门之第一个程序Mybatis一定需要commit才能够成功修改数据么Mybatis关于创建SqlSession源码分析(二)Mybatis多个mapper文件以及namespace命名问题(三)Mybatis使用工具类读取配置文件以及从属性读取DB信息(四)关于Mybatis别名定义(五)Mybatis增删改查demo(六)Mybatis插入数据返回主键id(七)Mybatis如何知道增删改是否成功执行(八)Mybat.
2020-10-11 01:06:46
565
4

原创 关于作者
关于文章一个好文章不是要写完所有的知识点,也不是细致到不能再细致,而是定位清楚,详略得当,在定位 力所能及之处画一个圈子,分轻重。个人认为,一篇好的文章可以参考三点,解惑,拓展,思考。思路应该是把整体框架讲一遍,让读者有个大概的印象,然后开始细致的讲解,开始拓展,不断提出疑问,提出那些大多数人读到此刻可能有的疑问,然后把知识圈子再拓展远一些,不再那么细致的讲,然后收住。毕竟一篇文章是讲不完所有的东西的,权当是抛砖引玉。(世上大佬遍地走,除了我菜鸟)最后比较重要的一点,是梳理前面的知识,因为大多数人读到
2020-10-08 22:41:35
345
原创 关于CodeReview 的些许想法
《史记·礼书》有云:“不弃微末,久久为功。” code review 并非一朝一夕之功,每一个细微的改动都可能引发系统的巨大波动,故而我们在审查中总是小心翼翼,力求精确。
2024-12-11 00:34:17
1183
原创 面试官:Redis 3.2 版本之前的 list 怎么实现的?
在 Redis 3.2 版本前,List 数据结构包括两种主要实现方式:双向链表和压缩列表。这两者是互斥的,即在同一个 List 中,Redis 会根据一定的条件选择使用其中的一种数据结构。
2024-12-11 00:31:44
839
原创 Go 语言基础知识语法
很早听人说过一句话:“每年学习(接触)一门新的编程语言”,这听起来可能有点不太现实,但是其实很多种语言都是相通的。掌握新的编程语言不仅仅是增加职业工具箱中的工具,更是一种扩展我们思维方式、解决问题能力和创新能力的方式。每种语言都有其独特的构造和哲学,从中我们可以获得新的见解,这些见解可以转化为处理日常任务时的新技能和更广阔的视角。
2024-12-07 19:12:58
1115
原创 Redis【2】- SDS源码分析
本文详细解析了 Redis 中字符串类型的实现及其背后的设计逻辑。从基础用法入手,介绍了 Redis 自实现字符串类型 SDS(Simple Dynamic String)的必要性和优势,包括二进制安全性、内存分配优化(如预分配和惰性释放)、操作效率提升等。通过对比 C 语言原生字符串,展示了 SDS 如何兼容传统字符串操作,同时克服了存储二进制数据的局限性和效率问题。
2024-12-07 18:01:32
800
原创 FIFO 缓存算法很简单,但也可以聊挺久
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决,这句话就是整个计算机软件以及系统设计中的核心思想,而缓存对这一思想的一种实践。缓存,总归会受到存储空间的限制,当缓存的空间不足的时候,如果在保持一定系统文档的情况下,还能兼顾到缓存命中率呢?这就需要我们选择合适的缓存淘汰算法。缓存淘汰算法种类比较多,我们本次主要介绍 FIFO:先进先出,类似队列的特性,淘汰缓存中最早添加的记录,该算法基于"最早被添加的数据,不再被使用的可能性最大"。
2024-11-28 23:48:30
950
原创 Redis【1】- 如何阅读Redis 源码
Redis 实际上是简称,全称为(远程字典服务器),由 Salvatore Sanfilippo 写的高性能 key-value 存储系统,其完全开源免费,遵守 BSD 协议。Redis 与其他 key-value 缓存产品(如 memcache)有以下几个特点。Redis 也是一种 分布式缓存 [[1. 从缓存到分布式缓存]],其代码是 c 语言写的,那我们该如何阅读呢?
2024-11-27 22:57:21
1262
原创 设计模式【15】--从审批流中学习责任链模式
已经来到了责任链模式,各位客官听我瞎扯…责任链模式是什么责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。(百度百科)责任链模式是一种行为型设计模式,也就是重点是处理数据,假设我们有一份数据,需要经过很多个节点处理,那么就会是以下这个样子:一个节点处理完之后,交给下一.
2022-02-16 09:08:14
1195
原创 设计模式【14】-- 从智能音箱中学习命令模式
开局还是那种图,各位客官往下看…张无忌学太极拳,忘记了所有招式,打倒了"玄冥二老",所谓"心中无招"。设计模式可谓招数,如果先学通了各种模式,又忘掉了所有模式而随心所欲,可谓OO之最高境界。命令模式是什么?在面向对象程式设计的范畴中,命令模式(Command Pattern)是一种设计模式,它尝试以物件来代表实际行动。命令模式是一种行为型模式,它将请求以命令的形式包裹在对象里面,传递给调用对象,调用对象寻找匹配该命令的对象,将命令给该对象执行。也就是分为了三步:1、命令被包裹在请求对象.
2022-02-11 09:08:16
567
原创 设计模式【13】-- 模板模式怎么弄?
开局还是那种图,各位客官往下看…张无忌学太极拳,忘记了所有招式,打倒了"玄冥二老",所谓"心中无招"。设计模式可谓招数,如果先学通了各种模式,又忘掉了所有模式而随心所欲,可谓OO之最高境界。模板模式是什么?模板模式,同样是一种行为型模式,也就是关于对象做什么或者怎么做的设计模式。模板模式的本质需要定义操作中的算法的框架,但是有一些步骤,又不需要具体的实现,而是不同的子类各自实现。子类不能修改流程框架,但是部分的步骤可以做定制化的实现。主要要解决一个问题:一些通用的方法,但是每一个子类却都重新写.
2022-02-10 08:36:25
349
原创 设计模式【12】-- 最近大火的策略模式
开局还是那种图,最近策略模式貌似很火,各位客官往下看…策略模式到底是什么?前面我们其实已经将结构型模式讲解完了,剩下的全都是行为型模式,三种模式的区分:创建型模式:如何创建一个对象结构型模式:对象内部的构造是如何构造的行为型模式:对象是如何运行(可以做什么)而提到策略模式,我们该如何理解呢?从北京到上海,可以坐飞机,也可以坐动车,也可以坐绿皮,甚至可以骑自行车,这些不同的方式,就是策略。一件商品,可以直接打 5 折,也可以加 100 再打 6 折,也可以打 5.5 折之后返回现
2022-01-24 08:33:03
327
原创 2021小结暨2022打脸计划
2021 年过去了,但是疫情还没有完全好,甚至于今年春节能否回家都是比较悬的事情。期望大家健健康康,疫情早日退散。本来不想写,但是今晚又立了 2022 年的打脸计划,新年早就开启了,那计划也得写下来。可惜人总爱幻想,于是乎回溯过去的一年。过去的一年,很多东西我都记不太清了,但是稍微影响计划节奏的事情,只有两件,一件是换了工作,第二件事还是一样穷(第2点比较重要)。想起《有无收成都是一年》中的一句话:“有无收成都是一年,生活也是”。工作变动上一家公司携程,包括实习,待了三年多,我大三开始实习了,写过
2022-01-17 09:11:24
369
原创 带你漫游数据结构世界
数据结构是什么?程序 = 数据结构 + 算法是的,上面这句话是非常经典的,程序由数据结构以及算法组成,当然数据结构和算法也是相辅相成的,不能完全独立来看待,但是本文会相对重点聊聊那些常用的数据结构。数据结构是什么呢?首先得知道数据是什么?数据是对客观事务的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号总称。那为何加上**“结构”**两字?数据元素是数据的基本单位,而任何问题中,数据元素都不是独立存在的,它们之间总是存在着某种关系,这种数据元素之间的关系我们称之为结构.
2022-01-12 08:23:47
470
原创 无聊的周末用Java写个扫雷小游戏
周末无聊,用Java写了一个扫雷程序,说起来,这个应该是在学校的时候,写会比较好玩,毕竟自己实现一个小游戏,还是比较好玩的。说实话,扫雷程序里面核心的东西,只有点击的时候,去触发更新数据这一步。Swing 是过时了,但是好玩不会过时,不喜勿喷源码的地址:https://github.com/Damaer/Game/tree/main/SweepMine下面讲讲里面的设计:数据结构设计视图和数据尽可能分开点击时候使用BFS扫描判断成功失败数据结构设计在这个程序里面,为了方便,使用了全局
2022-01-11 09:00:00
521
原创 java集合【13】——— Stack源码分析走一波
前言集合源码分析系列:Java集合源码分析前面已经把Vector,ArrayList,LinkedList分析完了,本来是想开始Map这一块,但是看了下面这个接口设计框架图:整个接口框架关系如下(来自百度百科):原来还有一个漏网之鱼,Stack栈的是挂在Vector下,前面我们已经分析过Vector了,那么顺便把Stack分析一遍。再不写就2022年了:Stack介绍栈是一种数据结构,并不是Java特有的,在Java里面体现是Stack类。它的本质是先进后出,就像是一个桶,只能不断的放在上面,
2022-01-10 08:36:07
817
原创 设计模式【10】-- 顺便看看享元模式
开局还是那种图,各位客官往下看…享元模式是什么?享元模式(FlyWeight),是结构型模式的一种,主要是为了减少创建对象的数量,减少内存占用以及提高性能。说到这里,不知道你是否会想到池技术,比如String 常量池,数据库连接池,缓冲池等等,是的,这些都应用了享元模式。比如,有一些对象,创建时候需要资源比较多,创建成本比较高,内存开销比较大,如果我们一直创建,机器吃不消,那么我们就想到了池化技术,把创建好的对象放在里面,需要时,去池子里面取就可以了,也就是大家共享了池子里面的对象,这就是共享。听.
2022-01-09 15:18:45
527
原创 设计模式【9】-- 外观模式?没那么高大上
开局一张图,剩下全靠写…外观模式是什么外观模式,其实是用来隐藏系统的复杂性的,屏蔽掉了背后复杂的逻辑,向用户提供简单的可以访问系统的接口,也是属于结构型模式的一种 。举个例子,比如我们的Java 三层MVC架构,对外提供的是controller,但是controller内部可能调用了很多service,service又调用了一些mapper,反正就是内部很复杂,但是对外只是一个接口,一个门面,外部看起来是简单的,外观很好看,实际上,你都懂。再举个栗子,我们用的电脑,其实内部也是极其复杂的,但是我.
2022-01-07 08:38:56
334
原创 设计模式【8】-- 手工耿教我写装饰器模式
装饰器模式前面学习了好几种设计模式,今天继续…装饰器模式,属于结构型模式,用来包裹封装现在的类对象,希望可以在不修改现在类对象和类定义的前提下,能够拓展对象的功能。调用的时候,使用的是装饰后的对象,而不是原对象。,提供了额外的功能。不知道大家有没有看手工耿的自制钢琴烤串车视频【https://www.bilibili.com/video/BV1334y1Z7kq?spm_id_from=333.999.0.0 】, 本来是一个钢琴,但是为了边弹琴,边烤串,改造装饰了一下,变成了特殊的钢琴,提供了.
2022-01-06 08:41:22
370
原创 设计模式【7】-- 探索一下桥接模式
设计模式,写代码必备神器…桥接模式是什么?桥接模式是把抽象化和实现化解耦,让两者可以独立,该设计模式属于结构性设计模式。何为将抽象化和实现化解耦,可以理解为将功能点抽象出来,功能的实现如何取决于不同的需求,但是抽象的功能点(接口)已经被桥接到原本的类型上,只用关注与实现。原本的类型变化,和抽象的功能点可以自由变化,中间的桥梁已经搭建起来了。桥接模式其实就是不单单使用类继承的方式,而是重点使用类聚合的方式,进行桥接,把抽象的功能点,聚合(注入)到基类里面。桥接模式的好处一般用于解决什么问题呢?主
2022-01-05 08:19:47
338
原创 数据库批量插入这么讲究的么?
最近新的项目写了不少各种 insertBatch 的代码,一直有人说,批量插入比循环插入效率高很多,那本文就来实验一下,到底是不是真的?测试环境:SpringBoot 2.5Mysql 8JDK 8Docker首先,多条数据的插入,可选的方案:foreach循环插入拼接sql,一次执行使用批处理功能插入搭建测试环境`sql文件:drop database IF EXISTS test;CREATE DATABASE test;use test;DROP TABLE IF
2022-01-04 08:36:38
1385
原创 完蛋,我的事务怎么不生效?
前言事务大家平时应该都有写,之前写事务的时候遇到一点坑,居然不生效,后来排查了一下,复习了一下各种事务失效的场景,想着不如来一个总结,这样下次排查问题,就能有恃无恐了。那么先来复习一下事务相关知识,事务是指操作的最小工作单位,作为一个单独且不可切割的单元操作,要么全部成功,要么全部失败。事务有四大特性(ACID):原子性(Atomicity):事务包含的操作,要么全部成功,要么全部失败回滚,不会存在一半成功一半失败的中间状态。比如A和B一开始都有500元,A给B转账100,那么A的钱少了100,B的钱
2021-12-28 09:08:52
2059
原创 如何用Docker Compose部署项目?
文章目录前言Docker Compose1. Docker Compose是什么?2. Docker Compose 的具体步骤3. 如何在IDEA项目里面使用Docker Compose启动可能出现的坑点前言之前我们用docker部署了springboot,redis,mysql的项目,但是是部署在三个不同的容器里,还需要先知道redis和mysql的ip地址,手动配置到springboot应用容器里,我只是想快速在本地进行测试啊,这样成本太高了,有没有什么办法,把他们集中管理呢?比如把它构建成为一
2021-12-21 08:56:57
1124
原创 无快不破,在本地 docker 运行 IDEA 里面的项目?
文章目录前言Docker Compose1. Docker Compose是什么?2. Docker Compose 的具体步骤3. 如何在IDEA项目里面使用Docker Compose启动可能出现的坑点前言之前我们用docker部署了springboot,redis,mysql的项目,但是是部署在三个不同的容器里,还需要先知道redis和mysql的ip地址,手动配置到springboot应用容器里,我只是想快速在本地进行测试啊,这样成本太高了,有没有什么办法,把他们集中管理呢?比如把它构建成为一
2021-12-18 19:01:00
2467
原创 如何基于 Docker 快速搭建 Springboot + Mysql + Redis 项目
文章目录前言项目目录搭建项目1. docker安装启动mysql以及redis1.1 安装mysql1.2 安装redis2. 初始化数据库3.创建项目4.初始化代码4.1 全局配置文件以及启动类4.2 实体类4.3 Redis工具类4.4 Mysql 数据库操作4.5 Service层4.6 Controller 控制层4.7 pom依赖测试前言有时候我们需要快速启动一些项目,但是环境往往折腾了好久,因此弄一个可以重用的快速搭建的教程,docker简直就是这方面的神器,Docker 是一个开源的应用容
2021-12-17 00:26:23
2084
1
原创 设计模式【6.1】-- 初探适配器模式
设计模式文章集合:http://aphysia.cn/categories/designpattern开局一张图,剩下全靠写…介绍适配器模式(百度百科):在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。适配器模式的主要目的就是为了兼容性,把原来不匹配的两个类或者接口可以协同工作,它属于结构型模式,主要分为三种:类适配器,对象适配器,接口适配器。适
2021-12-14 08:42:31
567
原创 剑指Offer刷题全集 --V1 版本
文章目录前言1.二维数组中的查找题目描述思路 & 解答暴力破解比较查找法2.替换空格题目描述思路 & 解答调用API函数自实现c++实现3.从尾到头打印链表题目描述思路 & 解答借助栈实现递归调用头插法4.重建二叉树题目描述思路 & 解答5.旋转数组的最小数字题目描述思路 & 解答直接遍历二分法6.斐波那契数列题目描述思路 & 解答直接暴力重复利用结果(动态规划)7.跳台阶题目描述思路 & 解答暴力递归动态规划8.两个栈实现一个队列题目描述思路 &am
2021-12-12 00:31:27
1451
原创 设计模式【5】-- 原型模式
开局一张图,剩下全靠写…设计模式文章集合:http://aphysia.cn/categories/designpattern前言接触过 Spring 或者 Springboot 的同学或许都了解, Bean 默认是单例的,也就是全局共用同一个对象,不会因为请求不同,使用不同的对象,这里我们不会讨论单例,前面已经讨论过单例模式的好处以及各种实现,有兴趣可以了解一下:http://aphysia.cn/archives/designpattern1。除了单例以外,Spring还可以设置其他的作用域,也
2021-12-11 09:57:37
697
原创 面试官说:你来设计一个短链接生成系统吧
引言相信大家在生活中,特别是最近的双十一活动期间,会收到很多短信,而那些短信都有两个特征,第一个是几乎都是垃圾短信,这个特点此处可以忽略不计,第二个特点是链接很短,比如下面这个:我们知道,短信有些是有字数限制的,直接放一个带满各种参数的链接,不合适,另外一点是,不想暴露参数。好处无非以下:太长的链接容易被限制长度短链接看着简洁,长链接看着容易懵安全,不想暴露参数可以统一链接转换,当然也可以实现统计点击次数等操作那背后的原理是什么呢?怎么实现的?让你实现这样的系统,你会怎么设计呢?【来自于
2021-12-04 15:34:38
421
原创 设计模式【4】-- 建造者模式详解
开局一张图,剩下全靠写…引言设计模式集合:http://aphysia.cn/categories/designpattern如果你用过 Mybatis ,相信你对以下代码的写法并不陌生,先创建一个builder对象,然后再调用.build()函数:InputStream is = Resources.getResourceAsStream("mybatis.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBu
2021-12-02 09:03:13
676
原创 雪花算法对System.currentTimeMillis()优化真的有用么?
前面已经讲过了雪花算法,里面使用了System.currentTimeMillis()获取时间,有一种说法是认为System.currentTimeMillis()慢,是因为每次调用都会去跟系统打一次交道,在高并发情况下,大量并发的系统调用容易会影响性能(对它的调用甚至比new一个普通对象都要耗时,毕竟new产生的对象只是在Java内存中的堆中)。我们可以看到它调用的是native 方法:// 返回当前时间,以毫秒为单位。注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,可能更大。例如,许多
2021-11-30 21:51:03
649
原创 面试官:讲讲雪花算法,越详细越好
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子组成。在雪花形成过程中,会形成不同的结构分支,所以说大自然中不存在两片完全一样的雪花,每一片雪花都拥有自己漂亮独特的形状。雪花算法表示生成的id如雪花般独一无二。snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bi
2021-11-15 23:53:01
4075
1
原创 讲分布式唯一id,这篇文章很实在
分布式唯一ID介绍分布式系统全局唯一的 id 是所有系统都会遇到的场景,往往会被用在搜索,存储方面,用于作为唯一的标识或者排序,比如全局唯一的订单号,优惠券的券码等,如果出现两个相同的订单号,对于用户无疑将是一个巨大的bug。在单体的系统中,生成唯一的 id 没有什么挑战,因为只有一台机器一个应用,直接使用单例加上一个原子操作自增即可。而在分布式系统中,不同的应用,不同的机房,不同的机器,要想生成的 ID 都是唯一的,确实需要下点功夫。一句话总结:分布式唯一ID是为了给数据进行唯一标识。分布式
2021-11-09 22:31:43
1693
原创 设计模式【3.3】-- CGLIB动态代理源码解读
cglib 动态代理cglib介绍CGLIB 是一个开源项目,一个强大高性能高质量的代码生成库,可以在运行期拓展 Java 类,实现 Java 接口等等。底层是使用一个小而快的字节码处理框架 ASM,从而转换字节码和生成新的类。理论上我们也可以直接用 ASM 来直接生成代码,但是要求我们对 JVM 内部,class 文件格式,以及字节码的指令集都很熟悉。这玩意不在 JDK 的包里面,需要自己下载导入或者 Maven 坐标导入。我选择 Maven 导入, 加到 pom.xml 文件:<de.
2021-11-08 22:37:03
656
原创 设计模式【3.2】-- JDK动态代理源码分析有多香?
前面文章有说到代理模式:http://aphysia.cn/archives/dynamicagentdesignpattern那么回顾一下,代理模式怎么来的?假设有个需求:在系统中所有的 controller 类调用方法之前以及之后,打印一下日志。假设原来的代码:public class Person{ public void method(){ // 表示自己的业务逻辑 process(); }}如果在所有的类里面都添加打印方法,这样肯定
2021-11-06 21:00:47
375
原创 马拉车算法,其实并不难!!!
要说马拉车算法,必须说说这道题,查找最长回文子串,马拉车算法是其中一种解法,狠人话不多,直接往下看:题目描述给你一个字符串 s,找到 s 中最长的回文子串。例子示例 1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。示例 2:输入:s = "cbbd"输出:"bb"示例 3:输入:s = "a"输出:"a"示例 4:输入:s = "ac"输出:"a"马拉车算法这是一个奇妙的算法,是1957年一个叫Manacher的人发明的,所
2021-10-10 18:27:08
336
原创 100台机器上海量IP如何查找出现频率 Top 100?
场景题有 100 机器,每个机器的磁盘特别大,磁盘大小为 1T,但是内存大小只有 4G,现在每台机器上都产生了很多 ip 日志文件,每个文件假设有50G,那么如果计算出这 100 太机器上访问量最多的 100 ip 呢?也就是Top 100。思路其实,一开始我有往布隆过滤器那边考虑,但是布隆过滤器只能大致的判断一个 ip 是否已经存在,而不能去统计数量,不符合该场景。那么一般这种大数据的问题,都是因为一次不能完全加载到内存,因此需要拆分,那怎么拆呢?ip是32位的,也就是最多就 232 个, 常
2021-10-08 23:59:25
363
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人