ID 生成方案

通常情况下,一个应用可以直接使用数据库的自增主键 ID 作为生成方案,这种做法既方便又通过数据库唯一约束避免了 ID 冲突的问题。但这种具有连续性的ID会暴露平台的数据量,并且在数据量过大进行分库分表后,就无法依赖数据库的自增 ID 作为生成方案了。如何在这种情况下生成一个全局唯一的ID呢?

Read More

Java类加载

一个 Java 应用在主动使用某个类时,如果该类还未加载到内存中,那么会由类加载器读取指定的 class 文件加载该类、链接、然后由 JVM 对该类进行初始化。

Read More

Java基础——JVM

Java 是高级语言的其中一种,要把高级语言转换为计算机可以识别的机器码需要经过解释或者编译处理。编译的过程就是通过编译器把高级语言代码翻译成可以被机器执行的机器码(如C语言),解释的过程就是通过解释器直接解释执行(如PHP、Javascript),不需要编译成机器语言。但是现代高级语言很难简单的用“编译型”、“解释型”来区分,代码执行过程中并不是只有其中一种行为。

在 Java 中,为了实现跨平台以及提升运行速度,需要先将源代码使用 javac 编译成 Java 字节码,这个字节码并不能被计算机直接识别,需要使用 Java 虚拟机 JVM 来解释执行。JVM 在解释执行代码的过程中,如果发现某个方法或代码块运行频繁,会认为这是热点代码(Hot Spot Code),被标记为热点代码的部分在运行时被动态地编译程序(JIT)转换为本地机器码,以便直接在CPU上执行,而无需再次解释执行。除了 JIT 之外, JDK17 支持的 AOT 编译也可以直接将 Java 代码编译为计算机可以直接识别执行的机器码。

Read More

ElasticSearch分页查询

Elasticsearch 是一个分布式的搜索与分析引擎,它的部分使用经典场景与关系型数据库(在本篇文章中以 MySQL 举例)非常相似,比如分页、遍历等。

在分页场景下,数据库需要遍历全表读取,然后根据参数跳过舍弃指定条数的记录,最终返回数据,在页码较大的深度分页场景时,数据库的响应时间较长,且会占用较多的服务器资源。Elasticsearch 中也同样如此,Elasticsearch 会聚合、遍历整个索引读取文档,然后舍弃指定条数的文档,最终返回数据,此过程也将占用较多的服务器资源。因此不管是在关系型数据库中还是 ElasticSearch ,在分页场景下应该尽量避免使用普通的分页查询进行深度分页读取较后的数据。

Read More

ElasticSearch数据类型与映射

不同版本的 ElasticSearch API 可能有所区别,本文基于 7.17 版本。ElasticSearch 有三个重要的概念,索引、映射、文档,本文介绍 ElasticSearch 的映射。映射是用来用来定义文档及其字段的存储方式、索引方式的手段,与关系型数据库中的表结构类似,可以从映射信息中得知索引下有哪些字段,字段的数据类型以及有哪些约束信息。

Read More

那些有趣的数据结构——BitMap

在开发的时候,时常会遇到去重或者校验是否存在的需求,在 Java 中当数据量小的时候可以直接使用 Set 集合进行去重或者校验存在,但数据量逐渐变大的时候使用这种去重策略可能会导致内存溢出的问题,可以根据数据的特性决定是否使用 Bitmap 解决相关需求。

Read More

Zookeeper Cluster

Zookeeper 提供单机和集群两种搭建方式,在生产环境中通常使用集群部署的方式来提高可用性。其作为分布式协调服务,应保持数据的一致性。

Zookeeper 集群是一个 CP(一致性+分区容错性)的分布式系统,任何时刻对正常工作的 Zookeeper 集群的任意节点发起的请求都尽量得到一致的数据结果,对于Zookeeper的操作是原子性的,只有成功和失败,不存在只产生部分结果的情况。

Read More