Go语言深入浅出

Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行计算模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo[3],Go也具有这个模型的特征,比如通道传输。通过goroutine和通道等并行构造可以建造线程池和管道等[8]。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。

img

与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收功能、接口等特性的语言级支持[3]。Go 2.0版本将支持泛型[9],对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。

不同于Java,Go原生提供了关联数组(也称为哈希表(Hashes)或字典(Dictionaries))。

Kubernetes实现Traefik代理MySQL流量

云原生为我们的DevOps带来了巨大的便利,但同时对新技术栈学习也带来新的挑战。以本文所介绍的为例,传统的开发方式中,我们通常使用Nginx作为反向代理实现网络流量的转发(HTTP、HTTPS以及TCP等),在容器的世界里同样提供了这样一个利器Traefik。HTTP流量的代理比较简单,本文以MySQL为例实现TCP代理,使我们在外部访问MySQL服务。以方便Navicat等客户端或其它服务的连接。

二叉树及BST相关算法总结

树是一种数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

  1. 每个节点有零个或多个子节点;
  2. 没有父节点的节点称为根节点;
  3. 每一个非根节点有且只有一个父节点;
  4. 除了根节点外,每个子节点可以分为多个不相交的子树。

Binary Search tree

基于K3S快速搭建Flink集群

K3s 是一个轻量级的 Kubernetes 发行版,它针对边缘计算、物联网等场景进行了高度优化,并且可用于生产环境。Kubernetes 是一个 10 个字母的单词,简写为 K8s。所以,有 Kubernetes 一半大的东西就是一个 5 个字母的单词,简写为 K3s。K3s 没有全称,也没有官方的发音。因为公司开发需要,准备搭建一个Flink集群。

比较过Yarn和Native安装方法,都觉得后期运维比较麻烦Kubernetes相对来讲比较通用,可以方便迁移到公有云并创建1:1的运行环境。

image-20220414175321429

关系型数据库的单列索引与联合索引

数据库只做两件事情:存储数据、检索数据。而索引是在你存储的数据之外,额外保存一些路标(一般是B+树),以减少检索数据的时间。所以索引是主数据衍生的附加结构。一张表可以建立任意多个索引,每个索引可以是任意多个字段的组合。索引可能会提高查询速度(如果查询时使用了索引),但一定会减慢写入速度,因为每次写入时都需要更新索引,所以索引只应该加在经常需要搜索的列上,不要加在写多读少的列上。

二分法查找深入解析

二分法是一种普通又重要的算法思想,二分搜索又称折半搜索,区别于线性查找O(n)的时间复杂度,二分法的时间复杂度降到了O(logN)。但二分法的使用也是有条件的,它要求原始序列具有单调性。本文会详细介绍二分法的前提、推论以及例题,力求深入浅出。

image-20220413180555294

Java SDK中的SPI机制

本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践、学习开源项目提供参考。SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。

从ReentrantLock的实现看AQS的原理

Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQS。由于篇幅原因,本篇文章主要阐述AQS中独占锁的逻辑和Sync Queue,不讲述包含共享锁和Condition Queue的部分(本篇文章核心为AQS原理剖析,只是简单介绍了ReentrantLock,感兴趣同学可以阅读一下ReentrantLock的源码)。

HashMap、Hashtable等Map接口的实现和原理

Map 集合和 Collection 集合不同,Map 集合是基于键(key)/值(value)的映射,Collection中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储;Map中的集合,元素是成对存在的,每个元素由键与值两部分组成,通过键可以找对所对应的值。

Collection中的集合称为单列集合,Map中的集合称为双列集合。需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

JDBC ORM模型基于JAVA操作数据库

在我们日常的开发过程中,肯定不可避免的会使用到数据库以及 SQL 语句。比如,刚开始学习 Java 的时候可能会遇到 JDBC,它是连接 Java 和数据库的桥梁,我们可以使用 JDBC 来建立与数据库之间的连接并且执行相应的 SQL 语句。虽然 JDBC 的执行效率很高,但是其开发效率比较低。正是如此,市面上出现了一大批 ORM(对象关系映射)框架,例如 Hibernate,iBATIS 以及本文将要介绍的 MyBatis。

MySQL索引底层的数据结构与算法

索引是帮助MySQL高效获取数据的排好序的数据结构,由于以上实现的数据结构与数据库中索引相关,关于索引,有以下知识:

  1. 唯一索引:唯一索引不允许两行具有相同的索引值
  2. 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。
    主键索引要求主键中的每个值是唯一的,并且不能为空
  3. 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
  4. 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。
    数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针可以有多个(小于 249 个)

Mybatis 动态SQL

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

BPM工作流引擎Activiti

Activiti 是一个业务流程管理的开源框架,支持BPMN2.0流程定义协议。其主要功能有流程定义、流程部署、流程执行、用户群组管理、历史记录查询等功能。越是复杂的业务越是需要流程管理的工具,activiti就是很好的选择,从oa系统的审批到电商系统的购物,这些复杂的业务场景都能看到Activiti的身影。硬编码复杂的业务时,每一步的流转判断充满了风险,稍有不慎就得不到想要的结果,而问题追踪起来也非常麻烦。而基于activiti编写复杂的业务时,按照规范画出流程定义文件,业务可见即可得一目了然,大大降低了复杂业务出错的概率,剩下的事情就交给activiti去执行,它会严格按照流程的定义去执行。

JVM 类的加载机制

从类被加载到虚拟机内存中开始,到卸御出内存为止,它的整个生命周期分为7个阶段,加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸御(Unloading)。其中验证、准备、解析三个部分统称为连接。

Java中ArrayList和LinkedList的区别

从数据结构上看,顾名思义,ArrayList是实现了基于动态数组的结构,而LinkedList则是基于实现链表的数据结构。而两种数据结构在程序上体现出来的优缺点在于增删和改查的速率,就此,我们分别作出说明。

MySQL中事务隔离的级别

数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。事务的使用是数据库管理系统区别文件系统的重要特征之一。事务拥有四个重要的特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),人们习惯称之为 ACID 特性。下面我逐一对其进行解释。