- 博客(37)
- 收藏
- 关注
原创 厨神之蛋糕制作
失败了7次,成功了6次。成功的6次里有好有坏,总结一下蛋糕制作的过程与要点。低筋面粉(筋度越高越偏向包子馒头的口感,松软度越低)、白糖、鸡蛋、水(也可以用牛奶或其他含水的物质)、食用油面粉跟油的比例在5:35:35:3到1:11:11:1之间。油的作用是在水蒸气撑开蛋糕后能保留蛋糕的柔软度,跟馅饼类的回油后的作用类似。不加油的话蛋糕会变成包子馒头的口感。白糖按口味调鸡蛋跟面粉的比例为1:11:11:1,鸡蛋不够的话,蛋糕的口感会向饼干跟馒头发展面粉跟水的比例在1:1.21:1.21:1.2到1:1.51:1
2022-12-05 21:24:31 701
原创 MySQL之InnoDB架构浅析
InnoDB是一个兼顾高可靠性和高性能的通用存储引擎。在 MySQL 5.7 中,InnoDB是默认的 MySQL 存储引擎。
2022-11-26 01:09:25 699
原创 MySQL浅析之架构概览
MySQL主要分为Server层,跟存储引擎层。Server层负责“逻辑处理”,包括连接器、分析器、优化器、执行器以及所有内置函数。所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。存储引擎层跟文件系统交互,负责数据读写。可插拔式架构,支持InnoDB、MyISAM、Memory、Archive等多个存储引擎。默认使用InnoDB。
2022-11-26 01:06:30 706
原创 Spring Cloud源码分析之eureka+feign远程调用
是一个REST (Representational State Transfer)服务,用于定位服务,以实现中间层服务器的负载平衡和故障转移,我们称此服务为Eureka服务器。Eureka还有一个基于java的客户端组件,Eureka客户端,这使得与服务的交互更加容易,同时客户端也有一个内置的负载平衡器,它执行基本的循环负载均衡。是一种声明式服务调用组件,它在的基础上做了进一步的封装。通过 Feign,我们只需要声明一个接口并通过注解进行简单的配置(类似于Dao接口上面的Mapper注解一样)即可实现对。
2022-11-02 23:41:45 1361
原创 Mysql之AUTO_INCREMENT浅析
文章目录术语锁模式注意点总结参考链接AUTO_INCREMENT用于为表中的列设置一个自增序列,在非集群模式下,用它来为主键列自动生成值是一件很方便的事。并且,Mysql提供了一系列的锁机制来保证它的性能跟可靠性,通过这些锁机制,我们可以让它变得很高效。术语先来了解后面将要用到的术语。Simple inserts能预先知道插入行数的语句。比如说单行插入(不包括[INSERT ... ON DUPLICATE KEY UPDATE](https://dev.mysql.com/doc/refma
2022-02-09 17:33:59 1651 1
原创 算法之快速排序浅析
聊一聊快排的实现思路、性能快排相对冒泡排序的巧妙之处首先,快排在大部分情况下比冒泡排序的性能更好,即大部分时候,快排的划分(遍历/比较)次数比冒泡排序要少。冒泡排序的特点是数组中任意两个数都会发生一次比较,进而最终确定一个数跟其他数的大小关系。显然,这其中有一些多余的操作。因为,如果一个数x大于另一个数y,那么x势必会大于所有小于等于y的数,所以,x完全没必要跟所有小于等于y的数进行比较就能确定x跟这些数的大小关系。而快排就是利用了这个特点从而使得大部分时候其性能都要优于冒泡排序。快排的实现思路
2022-01-19 19:15:29 291
原创 Mysql之浅析INSERT ON DUPLICATE
前言如果不特别指出,默认mysql版本为8.0简介往数据库中插入记录时,如果发生唯一索引值冲突,insert on duplicate允许进行进一步的crud操作。伪代码如下:insert recordIF exist duplicate record THEN do something on duplicated rowsELSE do nothingEND IF具体用法先初始化将要用到的表跟数据create table t1( id bigint primary
2022-01-04 13:59:20 5390
原创 厨神之风干牛肉
前言最近制作了一些牛肉干,感觉味道还可以,来分享一下。先上成品图:原材料必备牛肉、香油、生抽/老抽、蚝油、料酒、姜可选干辣椒、芝麻、八角、桂皮、香叶、白糖、橙子皮、柚子皮、白酒过程PS: 配料计量单位:汤勺-15ml将牛肉切成长条状 将牛肉加水或者料酒放入冰箱浸泡3个小时泡出血水(这一步也可以跳过)按一斤牛肉的比例进行调料添加:1/3勺香油、一勺生抽、一勺蚝油、两勺料酒、5克姜、半勺干辣椒、半勺芝麻、1个八角、桂皮5克、香叶2片、半勺白糖、橙子皮跟柚子皮切成细条状(量随意)、白酒
2021-12-07 13:10:19 487
原创 浅析hashCode
文章目录hashCode是什么?Java里为什么要有hashCode这个函数?一些有意思的点总结案例代码hashCode是什么?首先,hashCode在计算机领域指的是一个数据经过hash funcation后得到的一个摘要,而这个摘要可以作为索引应用到hash map中去。接下来我们聊聊hashCode在java中是什么样的。hashCode是Java.lang.Object定义的一个native方法,默认返回的是一个由对象的内存地址转换而来的一个数值。在Object的子类中会有一些其他的实现,比
2021-11-26 16:58:16 378
原创 杂谈之容器内访问宿主机docker命令
原理docker在被安装时默认会在/var/lib/docker.sock创建unix domain socket。docker守护进程会通过它来监听我们发往docker的请求(命令)。而docker命令本质上是在/bin/docker里包装了这些请求交互的细节(猜想)。所以我们只需要将这些目录挂载到容器中即可。具体操作docker run -d --name <yourContainerName> -v /var/run/docker.sock:/var/run/docker.s
2021-09-20 08:42:56 733 1
原创 杂谈之非root用户运行docker命令
步骤1. 将用户添加至docker组中usermod -aG docker currUser`docker命令本质上是通过访问(读写)/var/run/docker.sock来完成与docker的交互。/var/run/docker.sock默认属于docker组以及root用户,所以,要想获得docker命令执行权,需要将用户添加到docker组中。2. 切换到docker组newgrp docker参考https://docs.docker.com/engine/reference/
2021-09-19 23:36:42 954
原创 杂谈之树莓派挂载硬盘
挂载步骤fdisk -l 找到新加入(未挂载)的硬,加入是/dev/sdamkfs.ext4 /dev/sda 硬盘文件系统格式化为ext4sudo mount /dev/sda /home/pi/xxx 将硬盘挂载到/home/pi/xxx目录下。df -h 即可看到新挂载的硬盘对应的目录信息配置开机自动挂载vim /etc/fstab添加一行:/dev/sda /home/pi/xxx defaults 0 0reboot...
2021-09-19 17:30:06 764
原创 踩坑日记之Gradle自定义JacocoReport跟Test task
起因最近新写了一个项目,为了更好的保证项目输出的质量,引入了单元测试覆盖率统计框架Jacoco。由于gradle官网上的案例只有几个默认的task(test、JacocoTestReport等)的设置,而我希望能够额外为不同的层提供单独的test,也就发生了接下来这些有趣的事儿。1. 为什么JacocoTestReport总是被SKIPPED首先,我写了一个自定义的test。并且通过将finalizedBy指定为JacocoTestReport来让test执行完毕后自动执行JacocoTestRepo
2021-09-18 12:56:33 3441
原创 单元测试之浅析Mockito mock Kotlin Object类方法
比如我创建一个Kotlin Object类:ObjectMethodpackage com.baichuan.example.unit_testobject ObjectMethod { fun doSomething() { println("this is ObjectMethod#doSomething") } @JvmStatic fun doSomethingWithJvmStatic() { println("this i
2021-09-12 23:38:56 1721
原创 踩坑日记之Springfox+Kotlin lateinit引发NullPointException
相关技术栈Kotlin1.5 Springboot2.5 Springfox3.0起因最近对接支付宝的电脑网站支付,需要定义一个支持表单Post提交的接口来接收支付宝的回调。在定义完接口后发现Springfox初始化swagger时报了空指针,导致swagger api doc无法加载分析1. 报错位置springfox.documentation.service.RequestParameter#equalsspringfox.documentation.schema.Example#e
2021-09-03 13:24:47 1068
原创 Auto DevOps之gitlab CI/CD
文章目录CI/CD介绍CI/CD的工作流程ci整体原理安装gitlab runner编写.gitlab-ci.yml关于更优雅的达成目标CI/CD介绍CI(Continuous Integration)跟CD(Continuous Delivery/Continuous Deployment)的出现主要是为了帮助我们在开发时能更早的发现代码中的bug,避免我们在这些bug上进行后续的开发(一错再错-.-),甚至将这些bug合并到qa或者staging环境去(错上加错)。说人话就是,我们在提交代码到gi
2021-08-02 00:12:36 1259
原创 GC调优之避免临时对象进入老年代
文章目录什么是临时对象?临时对象进入看年代有什么后果怎么避免临时对象进入老年代什么是临时对象?顾名思义,临时对象就是不能长期存活的对象,那么,怎么判断这个临时性呢?从代码层来看,这个临时对象通常是指一些局部变量对象有个属性叫分代年龄。分代年龄的值代表着这个对象经历的gc次数。在survivor区域不溢出的情况下经过有限次(默认是15次,具体要看系统实例情况,比如如果系统里年轻代大部分对象的分代年龄超过5就不太可能被回收,就可以认为分代年龄小于5的对象为临时对象)minor gc就能被回收的对象
2021-06-09 18:25:00 470
原创 随笔之Http为什么经常被吐槽慢?
http1因为没有对请求跟响应加上唯一标识(历史包袱),为了保证请求跟响应的一一对应,同一个连接上请求的发送必须在上一个请求完成之后(http层面的hol blocking问题)。所以,只要有并发,必然就会有阻塞,这个阻塞会随着请求并发的程度跟网络环境逐渐放大,这也是http1效率低(慢)的主要原因。像1.0的keep-alive出现之前,每次请求都需要重新建立连接,效率更是可怕的低。不过http2在frame(应用层)层面加了一个streamId,使得不同请求的数据可以在同一条连接上混合传输,使得并发的
2021-06-03 20:18:21 198
原创 Vertx实战之如何追踪异步函数调用
文章目录背景实现技术栈1. 同步or基于jdk的异步实现思路总结2. Vertx 中的实现1. eventbus上异步传递消息关于类加载2. 基于netty的异步io操作总结背景日常开发中我们经常需要排查各种系统问题,比如说因未处理的异常导致某次http请求返回了响应码为500的response、消息处理失败等。有时候我们可能直接通过异常本身给出的信息就能定位到问题,但有些时候我们可能必需要通过debug复原案发现场来定位问题所在,这个时候就需要知道这次事故的输入是什么(比如请求的参数)。这个问题在同
2021-06-03 19:31:41 864 2
原创 kotlin mockk用法解析
文章目录本例用到的类定义mockk()mockkObject()spyk() & spyk(T obj)every{...} ...returnsanswersandthenandthenThrowAndThenAnswer本例用到的类定义@Slf4jpublic class ServiceImplA implements Service { @Override public void doSomething1(String s) { log.info("in
2020-11-18 17:59:26 5489 4
原创 vert.x源码解析之redis集成
文章目录前言vertx是什么vertx-redis-client是什么vertx-redis-client有哪些特性怎么使用vertx-redis-client几个核心类的使用方法RedisConnectionredisOptions各项主要配置的含义typemasterNameroleRedisClientSTANDALONE前言vertx是什么vert.x是一个全异步框架,它是reactor线程模型的一种实现,通过内部的event bus跟event loop做到了处处皆异步。关于里面的细节,后面
2020-11-10 14:58:19 1304 1
原创 Spring源码解读之@Autowired如何解决循环依赖
文章目录@Autowired的what&how什么是循环依赖spring如何解决循环依赖@Autowired的what&how在spring框架下,我们可以通过@Autowired注解对属性或者方法参数进行标注,当spring ioc容器初始化时,会帮我们从容器中拿到对应的实例进行注入什么是循环依赖加入现在有两个Bean如下所示public class BeanA { @Autowired private BeanB beanB;}public class B
2020-10-22 14:42:21 7310 5
原创 Spring源码浅析之事务管理.md
文章目录看完本篇文章能收获什么?概览注入TransactionInterceptor的过程参考类图看完本篇文章能收获什么?spring是怎样帮助我们进行事务管理的spring是如何实现事务的传播的概览spring事务需要aop的支持,在spring容器初始化的时候,会将一个TransactionInterceptor的实例加入到所有方法上加了@Transactional注解的bean的代理对象的advisor数组中,当我们执行事务方法时,就会去执行TransactionInterceptor.
2020-07-16 18:13:20 238
原创 seata源码分析之如何控制下游服务的提交与回滚
概览seata client跟维持了一个连接,监听server端的消息,根据接到的消息判断是提交还是回滚。客户端建立流程:GlobalTransactionScanner.afterPropertiesSet() GlobalTransactionScanner.initClient() TMClient.init TmRpcClient.getInstance new TmRpcClient new ...
2020-07-12 12:07:06 2018 2
原创 seata源码分析之全局事务的开启跟xid的传递
概览首先我们通过@GlobalTransactional这个注解开启一个全局事务,而GlobalTransactionScanner.wrapIfNecessary()会为所有方法上加了这个注解的bean注入一个包装了GlobalTransactionalInterceptor实例的advisor,然后返回一个代理对象。GlobalTransactionalInterceptor会在该bean的方法调用前进行拦截,判断是否开启全局事务@Overrideprotected Object wrapI
2020-07-11 23:50:44 6063
原创 netty实现http代理
前段时间写了个http代理程序(科学上网),结合核心代码大概总结一下原理 ServerBootstrap serverEndpoint = new ServerBootstrap(); EventLoopGroup eventExecutors = new NioEventLoopGroup(); try { serverEndpoint.group(eventExecutors) .chan
2020-07-07 17:11:31 1304
原创 Spring源码分析之核心流程总结
核心方法:AbstractApplication-->refresh() 在调用refresh方法之前,会实例化一个scanner(ClassPathBeanDefinitionScanner)跟reader(AnnotatedBeanDefinitionReader),实例化内部会执行AnnotationConfigUtils.registerAnnotationConfigProcessors()去注册几个基础beanDefinition,如:ConfigClassPostProcessor
2020-07-07 16:47:35 253
原创 java里的锁机制(偏向锁,轻量级锁,重量级锁)
MARK WORD首先跟大家介绍一下mark word,它是对象头的一部分。其内部存储了hash code,gc分代年龄,标志位,偏向模式,偏向线程ID,指向栈空间的指针hash code:通过调用Object的hashCode()方法才会把这个值存储到mark word中,重写的不会标志位:主要用来标志锁的状态(当前是什么级别的锁)以及是否处于GC中偏向模式:当前对象是否可偏向,如果mark word里已经保存了hash code,由于此时Mark word中没有足够的空间去存储线程id,
2020-07-07 16:21:03 283
原创 ThreadPoolExecutor源码解析
首先为什么要有线程池这个设计线程的创建需要申请系统资源,会耗费一定的时间跟CPU资源,如果每次调用都新建一个线程,这个对性能的损耗是比较大且没必要的 线程是CPU调度的基本单元, 可以理解为线程是我们代码执行的载体,CPU通过线程间接去执行我们的代码,而载体是可以复用的 如果不对线程资源的使用加以控制,很可能会因为创建大量的线程而引发一系列的问题。如 频繁的线程上下文切换带来性能大幅降低,具体表现就是响应速度大幅降低 大量资源得不到释放而引发OOM 为了规避这些问题,引入了线程池...
2020-05-29 23:10:07 153
原创 mysql innodb(联合索引,二级索引,覆盖索引)解析
一丶联合索引(and B+树)1. 为什么建议尽量用联合索引:多个单列索引在多条件查询时优化器会选择最优索引策略,可能只用一个索引,也可能将多个索引全用上!但多个单列索引底层会建立多个B+索引树,比较占用空间,也会浪费一定搜索效率,所以索引建议最好建联合索引!2.联合索引本质:当创建**(a,b,c)联合索引时,相当于创建了(a)单列索引**,(a,b)联合索引以及**(a,b,c...
2020-05-22 23:51:17 1433
原创 INNODB MVCC
基础概念每个事物启动时,会像innodb的事物系统申请一个transaction id(后续简称TXID),此ID全局唯一,按申请顺序递增。 DB_TRX_ID, 6byte, 创建这条记录/最后一次更新这条记录的事务IDDB_ROLL_PTR, 7byte,回滚指针,指向这条记录的上一个版本(存储于rollback segment里,undo log内) DB_ROW_ID, 6byte,隐含的自增ID,如果数据表没有主键,InnoDB会自动以DB_ROW_ID维护一个聚簇索引 记录头中还会.
2020-05-22 16:15:10 212
转载 数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)
第1章 引言随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的 互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来提高网站性能,横向扩展数据层 已经成为架构研发人员首选的方式。水平切分数据库,可以降低单台机器的负载,同时最大限度的降低了了宕机造成的损失。通过负载均衡策略,有效的降低了单台
2017-07-14 17:24:57 371
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人