自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

JaJian的博客

会定期分享Java技术和一些读书笔记;热爱生活, 快乐前行。

  • 博客(71)
  • 收藏
  • 关注

原创 spark常用语法

Driver:Driver是Spark中Application也即代码的发布程序,可以理解为我们编写spark代码的主程序,因此只有一个,负责对spark中SparkContext对象进行创建,其中SparkContext对象负责创建Spark中的RDD(Spark中的基本数据结构,是一种抽象的逻辑概念)Driver的另外一个职责是将任务分配给各个Executor进行执行。任务分配的原则主要是...

2024-01-30 10:29:00 388

原创 Redis Zset的实现为什么用跳表,而不用平衡树?

之前写过一篇 Redis 数据类型的底层数据结构的实现,其中提到,ZSet 对象的底层数据结构实现之一是跳表。然后,有读者就问:为什么不使用平衡树(如红黑树、AVL 树)?我们先来了解下跳表,再来回答这个问题。跳表Redis 只有 Zset 对象的底层实现用到了跳表,跳表的优势是能支持平均 O(logN) 复杂度的节点查找。zset 结构体里有两个数据结构:一个是跳表,一个是哈希表。这...

2022-10-17 23:08:00 713

原创 使用JAVA状态机实现订单状态控制功能

在电商平台中,一个订单会有多种状态,临时单、已下单、待支付、已支付、待发货、待收货、已完成等等。每一种状态都和变化前的状态以及执行的操作有关。比如,用户将商品加入购物车后,后台会生成一个所谓的“临时单”。因为用户还没有点击下单,所以这个订单实际上还没有生成。只有当用户下单后,这个“临时单”才会转化为一个“待支付的订单”。以上过程中只有将一个处于“临时单”状态的订单执行下单操作,才能得到一个状....

2022-10-12 15:14:00 1243

原创 周末我把HashMap源码又过了一遍

为什么在Java面试中总是会问HashMap?HashMap一直是Java面试官喜欢考察的题目,无论应聘者你处于哪个级别,在多轮的技术面试中似乎总有一次会被问到有关 HashMap 的问题。为什么在Java面试中一定会深入考察HashMap?因为 HashMap 它的设计结构和原理的特点,它既可以考初学者对 Java 集合的了解又可以深度的发现应聘者的数据结构功底。围绕着HashM...

2020-11-16 09:10:00 263

原创 Mybatis 批量更新遇到的小问题

小问题记一个开发过程中因为小细节的遗漏而引发的 "莫名其妙",公司中有个2B(to B)供应链项目,持久层用的是 JPA,这里我就不吐槽 JPA 了,这种 SQL 嵌入在代码里的方式真的不够简洁。由于是新功能的开发,查询的功能中需要多字段的条件查询,涉及到多张表的关联操作。我试着用 JPA 来写,发现写的很头疼,于是干脆来个改造,将 Mybatis 引入到了项目中,自己掌控 SQL ...

2020-11-09 18:23:00 384

原创 MapStruct 解了对象映射的毒

前言MVC模式是目前主流项目的标准开发模式,这种模式下框架的分层结构清晰,主要分为Controller,Service,Dao。分层的结构下,各层之间的数据传输要求就会存在差异,我们不能用一个对象来贯穿3层,这样不符合开发规范且不够灵活。我们常常会遇到层级之间字段格式需求不一致的情况,例如数据库中某个字段是datetime日期格式,这个时间戳在数据库中的存储值为2020-11-06 ...

2020-11-09 09:31:00 465 1

原创 Java对象的内存布局

今天来讲些抽象的东西 -- 对象头,因为我在学习的过程中发现很多地方都关联到了对象头的知识点,例如JDK中的 synchronized锁优化 和 JVM 中对象年龄升级等等。要深入理解这些知识的原理,了解对象头的概念很有必要,而且可以为后面分享 synchronized 原理和 JVM 知识的时候做准备。对象内存构成Java 中通过 new 关键字创建一个类的实例对象,对象存于内存的...

2020-09-21 08:47:00 187

原创 线程池其实看懂了也很简单

理论知识周末上海下起了雨也降温了,无事打开电脑看看源码,就想到了线程池。线程池的技术网络上已经有很多文章都已经写过了,而且理论都是一样的。但是理论归理论,面试的时候也许你刚好看了一篇能应付过去,但是如果深究细节可能就会懵逼。所以我很建议任何理论我们都需要自己去探究一下才好,自己实践过的才有自己的理解而不是死记硬背,这样才会经久不忘。线程池属于开发中常见的一种池化技术,这类的池化技术...

2020-09-08 09:11:00 301

原创 那些Java架构师必知必会的技术

Java基础Java 7 和 Java 8 中的 HashMap原理解析Java7 和 Java8 中的 ConcurrentHashMap 原理解析Java中自定义注解Java函数式编程和lambda表达式TCP三次握手原理,你真的了解吗?“三次握手,四次挥手”你真的懂吗?程序员你为什么这么累 | 编码规范一个正则表达式引发的血案全解史上最快的JOSN解析库 - a...

2019-11-11 10:08:00 449

原创 对Java中HashCode方法的深入思考

前言最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址。学习过 C 语言的猿友应该都知道指针的概念。Go 语言语法与 C 相近,可以说是类 C 的编程语言,所以 Go 语言中有指针也是很正常的。我们可以通过将取地址符&放在一个变量前使用就会得到相应变量的内存地址。package mainimport "fmt"func main() { v...

2019-08-13 16:06:12 304

原创 Elasticsearch 技术分析(九):Elasticsearch基础和原理总结

前言之前已经分享过Elasticsearch的使用和原理的知识,由于近期在公司内部做了一次分享,所以本篇主要是基于之前的博文的一个总结,希望通过这篇文章能让读者大致了解Elasticsearch是做什么的以及它的使用和基本原理。生活中的数据搜索引擎是对数据的检索,所以我们先从生活中的数据说起。我们生活中的数据总体分为两种:结构化数据 和 非结构化数据。结构化数据: 也称作行数据...

2019-07-22 09:32:00 554

原创 Elasticsearch 技术分析(九):全文搜索引擎Elasticsearch,这篇文章给讲透了!

之前已经分享过Elasticsearch的使用和原理的知识,由于近期在公司内部做了一次分享,所以本篇主要是基于之前的博文的一个总结,希望通过这篇文章能让读者大致了解Elasticsearch是做什么的以及它的使用和基本原理。生活中的数据搜索引擎是对数据的检索,所以我们先从生活中的数据说起。我们生活中的数据总体分为两种:结构化数据 和 非结构化数据。结构化数据: 也称作行数据,是由...

2019-07-22 09:32:00 260

原创 分布式全局ID生成方案

传统的单体架构的时候,我们基本是单库然后业务单表的结构。每个业务表的ID一般我们都是从1增,通过AUTO_INCREMENT=1设置自增起始值,但是在分布式服务架构模式下分库分表的设计,使得多个库或多个表存储相同的业务数据。这种情况根据数据库的自增ID就会产生相同ID的情况,不能保证主键的唯一性。如上图,如果第一个订单存储在 DB1 上则订单 ID 为1,当一个新订单又入库了存储在 DB2...

2019-07-08 09:00:00 638

原创 从单体架构升级到微服务,在代码层面应注意的一些问题

由于近年来的移动端的发展和 2C模式 的红利,一些在风口的企业的业务得到爆发式增长。从架构层面来说,业务驱动技术的变革,所以微服务架构的概念得到很多企业的青睐,因为可以解决服务的大流量和高并发以及稳定性的要求。但是任何架构设计不是一蹴而就的,不能从起步就开始使用微服务,一般都是先通过单体架构来快速实现需求和抢占市场,然后再迭代式扩展。不能一口气吃个胖子。这几年自己有经历从单体到微服务的架构演变...

2019-07-02 15:31:52 353

原创 我是技术总监,你干嘛总问我技术细节?

最近在公众号号上看到了一篇文章,读后蛮有感触的,程序员常常因为走技术还是管理两个方向而犹豫不决,希望通过以下文章的分享对大家有所思考,以下是作者原文。熟悉我的人都知道,我有位从事猎头工作的老婆,平时的工作是专为某些医疗、金融投资机构提供中、高级岗位职位人才招聘及相关咨询服务。相比之下,这项工作对业务专业性与人脉关系要求较高,经常会被行业大咖问:“这家公司你觉得怎么样?和某某公司比,你觉得他们...

2019-06-26 18:03:00 277

原创 将博客搬至CSDN

为了信息同步,目前将博客园的文章同步发表到CSDN,地址为:JaJian。获取更多信息可以关注我的微信,每周精彩技术内容推送。微信公众号会是首发的平台,如果想要第一时间看到最新的内容,可以关注微信公众号【JaJian】。目前在以下平台同步推送,博客园,CSDN,掘金...

2019-06-18 23:39:00 209

原创 通过IDEA快速定位和排除依赖冲突

前言我们程序员在开发的时候经常会遇到各种各样的 BUG 问题,其中大部分是业务逻辑异常,还有一些是代码书写不规范造成的异常例如:NullPointException(NPE),IndexOutOfBoundsException 等等,其实这些我们都好定位和修复。但是还有一些运行时异常定位起来是特别头疼的,那就是 jar 包冲突引起的异常。一般程序在运行时发生类似于 java.lang.Cl...

2019-06-12 09:09:00 752

原创 分布式系统中session一致性问题

业务场景在单机系统中,用户登陆之后,服务端会保存用户的会话信息,只要用户不退出重新登陆,在一段时间内用户可以一直访问该网站,无需重复登陆。用户的信息存在服务端的 session 中,session中可以存放服务端需要的一些用户信息,例如用户ID,所属公司companyId,所属部门deptId等等。但是随着业务的发展,技术架构需要调整,原来的单机系统逐渐被更换,架构由单机扩展到分布式,...

2019-06-03 08:31:00 340

原创 分布式系统中接口的幂等性

业务场景公司有个借贷的项目,具体业务类似于阿里的蚂蚁借呗,用户在平台上借款,然后规定一个到期时间,在该时间内用户需将借款还清并收取一定的手续费,如果规定时间逾期未还上,则会产生滞纳金。用户发起借款因此会产生一笔借款订单,用户可通过支付宝或在系统中绑定银行卡到期自动扣款等方式进行还款。还款流程都走支付系统,因此用户还款是否逾期以及逾期天数、逾期费等都通过系统来计算。但是在做订单系统的...

2019-05-27 08:57:00 282

原创 分布式系统中一致性哈希算法

业务场景近年来B2C、O2O等商业概念的提出和移动端的发展,使得分布式系统流行了起来。分布式系统相对于单系统,解决了流量大、系统高可用和高容错等问题。功能强大也意味着实现起来需要更多技术的支持。例如系统访问层的负载均衡,缓存层的多实例主从复制备份,数据层的分库分表等。我们以负载均衡为例,常见的负载均衡方法有很多,但是它们的优缺点也都很明显:随机访问策略。系统随机访问,缺点:可能造成服务...

2019-05-23 09:52:00 248

原创 线程数究竟设多少合理

需求缘起Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍,有些业务设置为CPU核数的32倍。“工作线程数”的设置依据是什么,到底设置为多少能够最大化CPU性能,是本文要讨论的问题。一些共性认知在进行进一步深入讨论之前,先以提问的方式就...

2019-05-14 15:20:00 272

原创 Elasticsearch 技术分析(八):剖析 Elasticsearch 的索引原理

前言创建索引的时候,我们通过Mapping 映射定义好索引的基本结构信息,接下来我们肯定需要往 ES 里面新增业务文档数据了,例如用户,日志等业务数据。新增的业务数据,我们根据 Mapping 来生成对应的倒排索引信息 。我们一直说,Elasticsearch是一个基于Apache Lucene 的开源搜索引擎。Elasticsearch的搜索高效的原因并不是像Redis那样重依赖内存的,...

2019-05-13 09:02:00 745

原创 作为程序员你是如何学习的?

学习的需要这篇文章不做技术分享,和大家一起讨论一下学习的途径和方法。程序员行业技术更新迭代速度快,这个特点身为行业内的每个猿友们都有深刻体会。很多技术基本每年都有一个大小版本,每个版本的出现意味着有新的技术思想和应用技巧出现。也许你用不到但是你需要去了解。你看自从甲骨文公司宣布收购Sun公司,Java 的 JDK 版本基本保持一年一更的频率。2014年,甲骨文公司发布了Java8正式版,5...

2019-04-10 07:43:00 425

转载 系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路

前言处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出jstack...

2019-03-22 15:35:00 235

原创 Elasticsearch 技术分析(七): Elasticsearch 的性能优化

硬件选择Elasticsearch(后文简称 ES)的基础是 Lucene,所有的索引和文档数据是存储在本地的磁盘中,具体的路径可在 ES 的配置文件../config/elasticsearch.yml中配置,如下:# ----------------------------------- Paths ------------------------------------## P...

2019-03-11 10:44:00 1381

原创 记一次在咸鱼上购买 MacBook Pro 的经历

前言以前一直用的是 windows 的,但是最近特别想买个 macOS 的。其实不是为了其他什么目的,只是涉及到开发 macOS更接近 linux 系统,一直没使用过所以就想尝试体验下,而且现在很多公司都配置了 mac 给开发人员使用,像阿里很多部门都是配 Macbook 的。提前体验下,不仅自己在家使用,娱乐、编程等。以后如果进了类似的公司也不需要适应能立即上手不影响工作。苹果的产品也不...

2019-03-04 00:20:00 5208 1

原创 记一次在闲鱼上购买 MacBook Pro 的经历

前言以前一直用的是 windows 的,但是最近特别想买个 macOS 的。其实不是为了其他什么目的,只是涉及到开发 macOS更接近 linux 系统,一直没使用过所以就想尝试体验下,而且现在很多公司都配置了 mac 给开发人员使用,像阿里很多部门都是配 Macbook 的。提前体验下,不仅自己在家使用,娱乐、编程等。以后如果进了类似的公司也不需要适应能立即上手不影响工作。苹果的产...

2019-03-04 00:20:00 771

原创 程序员为什么会有职业瓶颈?

寒冬的思考2019年初,俗话说"金三银四"。这时候面试不知道你们慌不慌张。因为2018年冬天是寒冷的。其实18年的低温持续时间不算很长,我也没有披上军大衣。但是突如其来的互联网寒冬影响了不少人,互联网寒冬当然主要受影响的就是程序员了。回顾过往,2017年是互联网高速发展的一年,共享经济仅仅一个概念就成就了多少家公司,各种共享单车满天飞,然而到了2018年下旬,好像所有的情况都发生了变化,你...

2019-02-18 09:06:00 428

转载 Java7 和 Java8 中的 ConcurrentHashMap 原理解析

Java7 中 ConcurrentHashMapConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一些。整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表”部分“或”一段“的意思,所以很多地方都会将其描述为分段锁。注意,行文中,我很多地方用了“槽”来代表一个 segment。简单理解就...

2019-02-17 17:24:00 198

转载 “三次握手,四次挥手”你真的懂吗?

记得刚毕业找工作面试的时候,经常会被问到:你知道“3次握手,4次挥手”吗?这时候我会“胸有成竹”地“背诵”前期准备好的“答案”,第一次怎么怎么,第二次……答完就没有下文了,面试官貌似也没有深入下去的意思,深入下去我也不懂,皆大欢喜!作为程序员,要有“刨根问底”的精神。知其然,更要知其所以然。这篇文章希望能抽丝剥茧,还原背后的原理。什么是“3次握手,4次挥手”CP是一种面向连接的单播协议...

2019-01-22 23:09:00 183

原创 互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第四篇

前情提示上篇文章:《互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第三篇》,我们分析了 RabbitMQ 开启手动ack机制保证消费端数据不丢失的时候,prefetch 机制对消费者的吞吐量以及内存消耗的影响。通过分析,我们知道了 prefetch 过大容易导致内存溢出,prefetch 过小又会导致消费吞吐量过低,所以在实际项目中需要慎重测试和设置。这篇文章,我们转移到消息中...

2019-01-21 09:58:00 222

原创 互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第三篇

前情提示上一篇文章:<<互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第二篇>>,我们分析了 ack 机制的底层实现原理(delivery tag机制),还有消除处理失败时的nack机制如何触发消息重发。通过这个,已经让大家进一步对消费端保证数据不丢失的方案的理解更进一层了。这篇文章,我们将会对 ack 底层的delivery tag机制进行更加深入的分...

2019-01-20 12:01:00 228

原创 互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第二篇

前情提示上一篇文章《互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第一篇》,我们初步介绍了之前制定的那些消息中间件数据不丢失的技术方案遗留的问题。一个最大的问题,就是生产者投递出去的消息,可能会丢失。丢失的原因有很多,比如消息在网络传输到一半的时候因为网络故障就丢了,或者是消息投递到MQ的内存时,MQ突发故障宕机导致消息就丢失了。针对这种生产者投递数据丢失的问题,Rabbit...

2019-01-19 20:10:00 294

原创 互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第一篇

背景引入这篇文章,我们来聊聊在线上生产环境使用消息中间件技术的时候,从前到后的全链路到底如何保证数据不能丢失。这个问题,在互联网公司面试的时候高频出现,而且也是非常现实的生产环境问题。如果你的简历中写了自己熟悉MQ技术(RabbitMQ、RocketMQ、Kafka),而且在项目里有使用的经验,那么非常实际的一个生产环境问题就是:投递消息到MQ,然后从MQ消费消息来处理的这个过程,数据到底会...

2019-01-11 21:56:00 410

转载 面试中被问Spring循环依赖的三种方式!!!

什么是循环依赖?循环依赖其实就是循环引用,也就是两个或则两个以上的 Bean 互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。如下图:如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错。下面说一下Spring是如果解决循环依赖的。注意,这里不是函数的循环调用,是对象的相互依赖关系。循环调用其实就是一个死循...

2019-01-08 22:56:00 819

原创 Elasticsearch 技术分析(六): 自动发现机制 - Zen Discoveryedit

发现方式Zen discovery是内建的、默认的、用于Elasticsearch的发现模块。它提供了单播和基于文件的发现,可以通过插件扩展到支持云环境和其他形式的发现。Zen Discovery 是与其他模块集成的,例如,节点之间的所有通信都使用 transport 模块完成。某个节点通过 发现机制 找到其他节点是使用 Ping 的方式实现的。Zen Discovery 使用种子节点...

2018-12-27 09:01:00 554

原创 Elasticsearch 技术分析(四): 分布式工作原理

前言通过前面章节的了解,我们已经知道 Elasticsearch 是一个实时的分布式搜索分析引擎,它能让你以一个之前从未有过的速度和规模,去探索你的数据。它被用作全文检索、结构化搜索、分析以及这三个功能的组合。 Elasticsearch 可以横向扩展至数百(甚至数千)的服务器节点,同时可以处理PB级数据。虽然说 Elasticsearch 是分布式的,但是对于我们开发者来说并未过多的参与...

2018-12-26 22:30:00 430

原创 Elasticsearch 技术分析(三): 索引别名Aliases问题

业务问题业务需求是不断变化迭代的,也许我们之前写的某个业务逻辑在下个版本就变化了,我们可能需要修改原来的设计,例如数据库可能需要添加一个字段或删减一个字段,而在搜索中也会发生这件事,即使你认为现在的索引设计已经很完美了,在生产环境中,还是有可能需要做一些修改的,需要添加映射字段或者需要修改字段类型等等。数据库中我们可以直接修改原来的表设计语句,前提是需要做好数据迁移。但是在 Elastic...

2018-12-20 21:47:00 553

原创 Elasticsearch 技术分析(二): 索引映射Mapping问题

数据库建表的时候,我们的DDL语句一般都会指定每个字段的存储类型,例如:varchar,int,datetime等等,目的很明确,就是更精确的存储数据,防止数据类型格式混乱。CREATE TABLE `shop_` ( `id_` varchar(36) NOT NULL COMMENT 'id', `shop_name_` varchar(50) DEFAULT NULL COMM...

2018-12-18 21:51:00 654

原创 Elasticsearch 技术分析(五):如何通过SQL查询Elasticsearch

前言这篇博文本来是想放在全系列的大概第五、六篇的时候再讲的,毕竟查询是在索引创建、索引文档数据生成和一些基本概念介绍完之后才需要的。当前面的一些知识概念全都讲解完之后再讲解查询是最好的,但是最近公司项目忙经常加班,毕竟年底了。但是不写的话我怕会越拖越久,最后会不了了之了,所以刚好上海周末下雪,天冷无法出门,就坐在电脑前敲下了这篇博文。因为公司的查询这块是我负责的所以我研究了比较多点,写起来也顺...

2018-12-10 08:40:00 896

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除