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

原创 大规模分布式存储系统笔记一
大规模分布式存储系统笔记一欢迎进入分布式的世界概述功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎进入分布式的世界...
2020-03-24 17:58:13
3679
12
原创 一文搞懂 MyISAM 与 InnoDB 的区别
该题应该从下面四个维度来回答事务外键索引count日志锁主键存储文件Innodb 支持事务,MyISAM 不支持Innodb 支持外键,MyISAM 不支持InnoDB 是聚集索引,MyISAM 是非聚集索引InnoDB 是聚集索引,使用B+Tree作为索引结构,数据文件是和索引绑在一起的,必须要有主键。MyISAM 是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。`InnoDB 不保存表的具体行数
2022-04-26 17:55:22
285
原创 一文搞懂线程和线程的区别
该题应该从下面四个角度来回答调度并发性系统开销拥有资源开头(一句废话):进程和线程的主要差别在于它们是不同的操作系统资源管理方式1. 进程拥有资源、CPU调度单位是线程在传统的操作系统中,CPU调度和分派的基本单位是进程。而在引入线程的操作系统中,则把线程作为CPU调度和分派的基本单位,进程则作为资源拥有的基本单位,从而使传统进程的两个属性分开,线程便能轻装运行,这样可以显著地提高系统的并发性。同一进程中线程的切换不会引起进程切换,从而避免了昂贵的系统调用。但是在由一个进程中的线程切换到另
2022-04-26 16:58:46
1327
原创 一文弄懂 Spring boot 启动流程
Spring Boot、Spring MVC 和 Spring 有什么区别?分别描述各自的特征:Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等;但他们的基础都是Spring 的ioc和 aop,ioc 提供了依赖注入的容器, aop解决了面向切面编程,然后在此两者的基础上实现了其他延伸产品的高级功能。Spring MVC 提供了一种轻度耦合的方式来开发 web 应用;它是 Spring 的一个模块,是一个 web 框架;通过 DispatcherServle
2022-04-04 20:51:39
815
原创 如何剖析一个项目之Redis(三)
拆解的项目源码地址:https://github.com/wiqer/ef-redis.git感谢开源!!!如何剖析一个项目之Redis(一)如何剖析一个项目之Redis(二)已知这是一款阉割的Java版的redis,通信基于Netty编写。我已经知到一个redis-cli发送一个命令过来后,是如何解析处理返回报文的。aof机制是如何实现得。已知的缺陷riteCreated with Raphaël 2.3.0开始我的操作确认?结束yesno...
2022-02-05 20:26:15
849
原创 如何剖析一个项目之Redis(二)
拆解的项目源码地址:https://github.com/wiqer/ef-redis.git感谢开源!!!如何剖析一个项目之Redis(一)已知的已知这是一款阉割的Java版的redis,通信基于Netty编写。我已经知到一个redis-cli发送一个命令过来...
2022-02-01 22:20:29
1048
原创 如何剖析一个项目之Redis(一)
拆解的项目源码地址:https://github.com/wiqer/ef-redis.git感谢开源!!!已知这是一款阉割的Java版的redis,通信基于Netty编写。已知的未知(该篇我们能学到什么)一个命令被该系统接收到后,是如何处理然后又返回的。解决已知的未知我们先准备一个redis-client(我这里用的Windows)。windows版redis下载地址下载完成后,我们开始调试这个java版的redis。用这个main方法来启动该redis服务!redis已.
2022-01-27 22:48:19
1865
原创 RocketMQ延迟消息(五)
RocketMQ的延迟消息是什么RocketMQ 不支持任意时间自定义的延迟消息,仅支持内置预设值的延迟时间间隔的延迟消息。预设值的延迟时间间隔为:1s、 5s、 10s、 30s、 1m、 2m、 3m、 4m、 5m、 6m、 7m、 8m、 9m、 10m、 20m、 30m、 1h、 2h延时消息的使用场景比如电商里,提交了一个订单就可以发送一个延时消息,1h后去检查这个订单的状态,如果还是未付款就取消订单释放库存。发送消息package my.demo.delay;impor
2021-10-11 21:46:05
218
原创 RocketMQ实践之广播模式(四)
发送消息:package my.demo.broad;import org.apache.rocketmq.client.producer.DefaultMQProducer;import org.apache.rocketmq.client.producer.SendResult;import org.apache.rocketmq.common.message.Message;import org.apache.rocketmq.remoting.common.RemotingHelper;
2021-10-11 21:14:05
151
原创 RocketMQ实践之有序消息(三)
发送消息:package my.demo;import org.apache.rocketmq.client.producer.DefaultMQProducer;import org.apache.rocketmq.client.producer.MessageQueueSelector;import org.apache.rocketmq.client.producer.SendResult;import org.apache.rocketmq.common.message.Message
2021-10-10 21:30:52
137
原创 RocketMQ实践之消息收发(二)
一、工程搭建前提:请大家自行装好IntelliJ IDEA并配好Maven。File->New->Project…Maven->org.apache.maven.archetypes:maven-archetype-quickstartname:rocket-mq,GroupId:my.demoFinishAdd Dependencymaven: <dependency> <groupId>org.apach
2021-10-10 16:51:55
249
原创 RocketMQ实践之环境准备(一)
一.安装RokcetMQ 现在执行以下命令来解压 4.9.1 源版本并构建二进制工件。unzip rocketmq-all-4.9.1-source-release.zipcd rocketmq-all-4.9.1/mvn -Prelease-all -DskipTests clean install -Ucd distribution/target/rocketmq-4.9.1/rocketmq-4.9.1...
2021-10-10 12:15:59
118
原创 DIY一个属于自己的微服务框架
从Vertx提供的通信方式开始第一个集群节点启动package org.example;import com.hazelcast.config.Config;import com.hazelcast.config.FileSystemXmlConfig;import io.vertx.core.Vertx;import io.vertx.core.VertxOptions;import io.vertx.core.eventbus.EventBusOptions;import io.ver
2021-08-16 23:20:31
285
原创 面试官问我为什么要尽量避免数据表的 join 查询操作
理论指导实践,实践反过来又完善理论,没有孰轻孰重,只有相辅相成看法 对于开发提交的含有join的查询,一般比较抗拒,从而建议将join拆分,避免join可能带来的性能问题,同时也增加了程序和DB的网络交互。建议从数据库设计层面和应用程序编码中尽量避免join。事实 5.5 版本之前,MySQL本身只支持一种表间关联方式,就是嵌套循环(Nested Loop)。如果关联表的数据量很大,则join关联的执行时间会非常长。在5.5以后的版本中,MySQL通过引入BNL算法来优化嵌套执行,本文介绍两.
2021-07-11 14:29:25
1667
1
原创 面试官问我如何快速上手项目
费曼学习法把认知细化成三个步骤:第一步:获取某个只是/某概念,并且去理解这些内容。第二步:按照教程自己来讲解/复述你所获得的主要内容。第三步:用自己的方式再次复述一下所学到的知识。了解项目数据落地的存储关系 比如用的关系型数据库如MySQL,我们可以找公司相关人员要到ER关系图,如果公司没有人维护这样的文档,我们也要自己去理清或者请教最熟悉业务的开发。向架构和开发去了解项目 他们往往更加偏向工程的角度跟你鼓吹这个项目的设计之精妙。向产品和测试了解项目 了解这个项目的来龙去脉,问问.
2021-07-09 08:25:46
653
原创 阿里巴巴开发规范-命名风格
命名风格1. 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。反例:_name / name / name/name/namename / name_ / namename/name/name / name2. 【强制】所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,纯拼音命名方式更要避免采用。正例:ali / alibaba / taobao / cainiao/ ali
2021-07-09 08:05:06
1070
原创 面试官问我Mysql binlog如何运作的
主节点binary log dump线程 当从节点连接主节点时,主节点会创建一个 log dump 线程,用于发送 binlog 的内容。在读取 binlog 中的操作时,此线程会对主节点上的 binlog 加锁,当读取完成,在发送给从节点之前,锁会被释放。从节点 I/O 线程 当从节点上执行start slave命令之后,从节点会创建一个 I/O 线程用来连接主节点,请求主库中更新的 binlog。I/O 线程接收到主节点 binlog dump 进程发来的更新之后,保存在本地 relay-l.
2021-07-02 22:46:11
272
1
原创 面试官问我redo log如何实现Mysql持久性
如果你觉得符合逻辑,那便也许是对的回顾持久性持久性是指事务一旦提交,它对数据库的改变就应该是永久性的,接下来的其他操作或故障不应该对本次事务的修改有任何影响。redo logredo log包括两部分:一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;二是磁盘上的重做日志文件(redo log file),该部分日志是持久的并且是物理日志并且顺序存储在redo log buffer或者redo log file on disk中,由很多log block组成,大家.
2021-06-24 08:36:59
1166
2
原创 面试官问我undo log如何实现Mysql原子性
源码固然重要,但是每个问题背后都有一个基本的逻辑思路 undo log即回滚日志,update操作时undo log记录了某行记录变更之前的样子,行记录通过回滚指针(DATA_ROLL_ID)关联到undo log变更前的记录,这条记录依然可以DATA_ROLL_ID找到之前的还原点(undo log中的记录)。insert和delete记录了反向的delete和insert操作。从我的描述来看undo log记录的是逻辑上如何还原。 这次一次Mysql事务只要记录下undo log,这样在我们.
2021-06-20 20:42:17
631
原创 面试官常说的多线程并发是要解决什么问题?续
这里再赘述一次最关键性的根源对于并发百度百科上这样描述的: 并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能只有一道程序在执行,故微观上这些程序只能是分时交替执行。 所以可能不是并发要解决什么问题,而是并发产生了一些列问题,并发才是万恶之源 原子性、可见性、有序性全然是并发而导致的吗?并发导致原子性这是我们上篇叙说的,那可见性和有序性呢。CPU 增加了缓存,以均衡与内存的速度差异;// 导
2021-01-30 22:21:17
385
1
原创 面试官常说的多线程并发是要解决什么问题?
对于并发百度百科上这样描述的: 并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能只有一道程序在执行,故微观上这些程序只能是分时交替执行。 打个比方:你在一家公司工作,boss让你既做前台又做HR,这时候你就并发了,后来老板看来你干得不错,公司又融到资了,觉得HR更适合你,又招了一个前台,这时候你们两就并行了。 为了并发这个理论的实现,操作系统弄出了进程这个东西。但是多进程的出现会引发原子性、如何协
2021-01-24 13:14:17
1224
原创 vert.x实践六——让Eventbus像使用MVC一样
这几天呕血封装,终于把Event Bus封装成人能用的样子了如何使用我们看下vert.x-create项目如何使用之DemoController.javapackage wanke.com.controller;import wanke.com.common.annotion.Controller;import wanke.com.common.annotion.RequestMapping;import wanke.com.common.msghandle.WrapMsg;im.
2020-08-03 10:34:33
763
1
原创 vert.x实践五——Json?Protocol Buffer?FlatBuffers?
本节我们来比较一下Json、FlatBuffers、Protocol Buffer在vertx中使用时的占用资源情况比较。方式阐述启动一个消费端进程和一个生产端进程,其中生产端发布一个web服务,方便使用ab测试工具进行测试(其中消费端和生产端分布在两台机器)。ab调用生产端web -> 生产端通过bus传输消息 -> 消费端通过bus回复消息Json序列化生产端 JsonObject jsonObject = new JsonObject(); fo.
2020-07-30 14:29:02
573
原创 vert.x实践四——集群中的长连接保持
前面我已经知道了通过Event Bus可以定义consumer和prouducer采用请求-应该形式来进行交互,注意定义多个consumer这种方式可以我
2020-07-28 16:43:35
871
原创 vert.x实践二——基于EventBus的交互demo
代码展示第一个vertx服务启动类package org.example;import com.hazelcast.config.Config;import com.hazelcast.config.FileSystemXmlConfig;import io.vertx.core.Vertx;import io.vertx.core.VertxOptions;import io.vertx.core.eventbus.EventBusOptions;import io.vertx.spi.
2020-07-20 16:05:57
459
1
原创 vert.x实践一——集群及监控
1.部署监控中心程序监控中心下载地址解压后目录是这样我这边是在命令行运行start.bat 7070 mancenter表示端口7070 应用根路径 mancenter启动!2.vertx集群代码展示启动类package org.example;import com.hazelcast.config.Config;import com.hazelcast.config.FileSystemXmlConfig;import io.vertx.core.Vertx;impor
2020-07-20 15:15:55
1873
原创 DDD领域驱动设计
目录概述软件开发和DDD区别建立领域知识通用语言模型驱动设计实体(Entity) & 值对象(Value Object)服务模块概述软件开发不是一蹴而就的事情,我们不可能在不了解产品(行业领域)的前提下进行软件开发,在开发前,通常需要进行大量的业务知识梳理,而后到达软件设计的层面,最后才是开发。而在业务知识梳理的过程中,我们必然会形成某个领域知识,根据领域知识来一步步驱动软件设计,就是领域驱动设计的基本概念。软件开发和DDD区别一般软件设计或者说软件开发分两种:瀑布式,敏捷式。瀑布式:一
2020-07-08 11:16:21
994
1
原创 分布式JVM监控工具
介绍该项目为了方便开发者更快监控多个远程主机jvm,如果你的项目是Spring boot那么很方便集成,jar包引入即可,不是Spring boot也不用气馁,你可以快速自行初始化一个Spirng boot程序引入jar包即可效果展示整体架构使用前提需要机器中有JDK,不仅仅是JRE,配置好java path,程序中依靠ExcuteCmd找寻jdk基本命令手把手教你用克隆monitor-servergit clonehttps://github.com/xk4848123/monitor
2020-06-24 23:42:07
923
1
原创 推一个带版本管理的小网盘工具
目录网盘简介创建云盘导航栏进入云盘创建目录上传文件文件浏览仓库下版本比对仓库下版本回退单个文件历史版本查看下载网盘对应git地址网盘简介最近换了点时间写一个小网盘,可学习或局域网使用。这里给大家一个临时访问地址http://x7h94v.natappfree.cc,感兴趣看后文可以去github拉下来自己搭建创建云盘导航栏进入云盘创建目录上传文件文件浏览仓库下版本比对仓库下版本回退单个文件历史版本查看下载点击CommitID还可以查看该版本文本内容,不过大文件无法
2020-06-15 10:32:52
1360
3
原创 类加载那些事儿
类加载想必大家都知道类加载的机制是双亲委派模式但是有些地方需要破坏双亲委派模型我们再看看类加载的流程类加载和初始化时机图解分析加载想必大家都知道类加载的机制是双亲委派模式双亲委派如何实现?当我们自定义加载器必然要继承java.lang.ClassLoader 而它有一个无参构造方法protected ClassLoader() { this(checkCreateClassLoader(), getSystemClassLoader()); } protected Cl
2020-06-03 21:25:49
269
1
原创 由深浅拷贝引发JVM内存区域思考
Some things have no reason, but they have to be done先来看一个浅拷贝的例子/* clone方法实现浅拷贝 */public class ShallowCopy { public static void main(String[] args) { Age a=new Age(20); Student stu1=new Student("摇头耶稣",a,175); //通过调用重写后的cl.
2020-05-25 17:23:44
318
1
原创 一篇整理JDK8新特性
目录static?default? lamda表达式?static?default? lamda表达式?package com.wanke.microgrid.mgcc;@FunctionalInterfacepublic interface NullAnnotation { //抽象方法 public void getName(String a); boolean equals(Object obj); //default方法 default void getAg
2020-05-17 12:09:14
2850
4
原创 模块化gradle项目构建
根目录创建settings.gradleinclude 'proto'include 'common'include 'mgcc'include 'mgcc-config'include 'mgcc-create'include 'mgcc-redis'include 'microgrid-model'包含七个模块根目录创建build.gradleapply plugin: ...
2020-05-09 17:32:47
1624
2
原创 字符串常量池的坑知多少?
常量池有坑吗,下面我们用jdk1.8环境来看看怎么回事public static void main(String[] args) { String str1 = new StringBuilder("计算机").append("软件").toString(); System.out.println(str1.intern() == str1); ...
2020-05-05 09:51:46
2167
5
原创 你了解JVM常量池吗?
常量池啥啥分不清吗?来一篇洗洗脑吧字符串常量池结构:它是一个String Table类,实质上是一个Hash表,默认长度是1009。全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例存到string pool中。特点:A、这个String Table在每个JVM中的实例只有一份,被所有的类共享。B、string pool中存的是具体的实例对象存储的数据:...
2020-05-04 12:19:14
1288
3
原创 数据库驱动【获取connection对象】【篇幅一】
我们不应该仅仅靠记忆来掌握技术,我们要靠我们自身的逻辑分析能力,理出一道逻辑线,总结出学习技术和解决技术问题的方法论,记忆知识帮助我们快速拿出东西解决问题,而方法论才是我们面临后续挑战的真正手段。本次分析基于mysql驱动8.0.13版本 public static Connection getConnection(String url, String user, S...
2020-04-30 23:18:46
1021
3
原创 驱动加载【Class.forName】的背后
本篇我们来聊聊数据库驱动是如何工作的下面我们以mysql驱动8.0.13来讲述先来看看驱动的加载 Class.forName("com.mysql.cj.jdbc.Driver");相信这一段代码大家都很熟悉,加载一个类,那它做了什么呢?大家都知道加载一个类,会执行他的静态块的,如果你问为什么?public static Class<?> forName(String...
2020-04-21 21:15:43
568
1
原创 分布式键值系统redis思考四
双写一致性但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新数据库。从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可。也就是说如果数据库写成功,缓存更新失败,那么只要到达过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。因...
2020-04-17 11:14:13
410
2
原创 分布式键值系统redis思考三
上篇我们主要从分析了redis的线程模型,本篇我们来看看redis的持久化。目录一起探讨redis持久化为什么要持久化怎么持久化一起探讨redis持久化为什么要持久化前面说过redis是一个内存数据库,那东西放在内存好好的为什么要持久化呢?想想如果宕机了咋办,重启一下,啥也没了,雪崩了,所有的流量打到DB,后果难以想象。关于缓存雪崩、穿透、击穿的话题后面的文章会讲到,谢谢大家。怎么持...
2020-04-11 17:07:40
444
4
原创 线上订单号重复了?一招搞定它!
问题的背景公司老的系统原先采用的时间戳生成订单号,导致了如下情形打断一下:大家知道怎么查系统某项重复的数据吧SELECT * FROM XX表 WHERE 重复项 in( SELECT 重复项 FROM XX表 GROUP BY 重复项 HAVING count(1) >= 2)不得了,这样重复岂不是一单成功三方回调导致另一单也成功了。多个服务怎么保证生成的订单号唯一呢?先上...
2020-04-10 17:27:17
3275
2
jdk下载/Linux64位 JDK8最新版本!!!
2020-05-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人