自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Dream it Possible

花开花落 有自己的节奏 从不张扬 自有夺目光芒

  • 博客(415)
  • 资源 (5)
  • 收藏
  • 关注

原创 bizlog通用操作日志组件(使用篇)

在一个系统中,日志主要分为系统日志和操作日志。系统日志主要是为开发排查问题提供依据。操作日志主要是对某条数据进行新增或者修改操作后进行记录,操作日志要求可读性强,因为它是给用户看的,比如订单的物流信息,用户需求知道在什么时候发生了什么事情。本篇博客介绍的日志组件解决的就是该问题:「谁」在「什么时间」对「什么」做了「什么事」

2022-11-16 20:36:31 3038 1

原创 比较图片相似度算法介绍与应用(Java版)

简单介绍三种计算图片相似度算法,算法的本质都是先得到图片的Hash,再计算海明距离,海明距离越小,图片越相似。

2022-11-15 16:14:02 4066 1

原创 MinHash算法原理与应用(Java版)

局部敏感Hash算法之MinHash算法简单介绍及Java应用

2022-11-14 17:19:17 838 1

原创 SimHash算法原理与应用(Java版)

本篇博客将介绍的SimHash算法属于一种局部敏感哈希算法,利用海明距离比较内容之间的相似度。

2022-11-10 14:48:13 2367 5

原创 历尽千帆过尽,归来,又是一年毕业季

2020年的启程,2021年的转折,2022年的告别,继续用文字整理生命。

2022-06-27 10:43:52 470 1

原创 Java操作Elasticsearch6实现单个字段多值匹配

引言单个字段多值匹配的意思类似mysql中某个字段的in查询,最近需求变更,需要在elasticsearch中实现多值匹配,下面总结一下几种实现的方法。基础代码下面是指定查询索引名称和索引类型基础代码:SearchRequest searchRequest = new SearchRequest();searchRequest.indices(indexName);searchRequest.types(indexType);SearchSourceBuilder builder = new

2020-12-11 08:50:02 10228

原创 Java操作Elasticsearch6实现group by分组查询

引言通过上篇博客的总结,我们知道了在Elasticsearch6中count、distinct和count(distinct)方法的使用。本篇博客继续聚合查询的学习,也就是对应mysql中的group by的使用。公共实体对于下面要介绍的查询,返回结果为统一实体,代码如下:/** * 单个字段分组返回结果 * * @author : huzhiting * @date : 2020-11-18 15:02 */@Datapublic class AggregationForOneDTO

2020-11-18 16:26:24 7314 3

原创 Java操作Elasticsearch6实现count统计、distinct去重

引言很久没有更新Elasticsearch系列文章,一方面是之前学会的条件查询足以满足项目需求,另一方面是前段时间一直很忙,几个项目的需求交叉进行,没什么时间学习新的东西。本篇博客将更新count、distinct、count(distinct)这几个新学到的Elasticsearch关于查询的方法。1. Count计算在项目中,count也算是一个比较常用的方法。之前项目中有需要用到,都是基于查询所有的方法,直接取total的值返回。最近发现,其实Elasticsearch单独封装了一个Count

2020-11-18 11:58:28 14618 3

原创 Java操作Elasticsearch6实现基本查询

引言业务系统接入Elasticsearch搜索服务后,开始了写查询接口的任务,本篇博客将总结Java操作Elasticsearch一些基本查询的实现。基础代码构建查询条件,对应Elasticsearch其实就是构建SearchRequest对象,指定索引库Name,指定索引库Type,创建SearchSourceBuilder对象,根据需求创建QueryBuilder对象,下面是创建和使用构建对象的基础代码:SearchRequest searchRequest = new SearchReques

2020-09-23 11:40:40 3368 3

原创 【Elasticsearch6.8】局部更新索引数据报错:The number of object passed must be even but was [1]

引言 上周把ES搜索服务搭建好了,这两天在业务系统上对接该服务,遇到了The number of object passed must be even but was [1]这样一个问题,下面记录一下解决的过程。 背景 依据系统需求,我们会将现有系统中所有的用户数据全量同步一次到ES,后面用户在系统中进行信息的更新会增量同步至ES,增量同步代码是用的单个新增/修改文档的方法,具体代码可参见《Rest Client方式集成Spring Boot应用》。 局部更新引入 因为增量更新时,只更新个别字段.

2020-09-16 12:18:23 1493

原创 【Elasticsearch6.8】基于SpringBoot构建ES搜索服务

引言通过之前的资料调研,在上篇文章中我们已经整合好Springboot+Elasticsearch6.5的demo。为了满足系统需求,我们会将所有数据入口接入Elasticsearch,然后通过ES去查询数据。所以,我们决定单独出一个搜索服务,接入ES,封装一些操作索引的基本方法,其他服务需要使用,直接引用该服务即可。环境• SpringBoot:2.1.9.RELEASE• Elasticsearch:6.8.6工程结构 核心代码有了上面的工程结构之后,就可以开始写代码了。下面展示一些核.

2020-09-12 13:06:00 1553 2

原创 【Elasticsearch6.5】Rest Client方式集成SpringBoot应用

引言 在上一篇博客中,我们对Elasticsearch操作索引API有了简单应用,并且在Head插件下看到了存储在ES中的索引数据结构。本篇文章将实践如何在SpringBoot应用中去集成Elasticsearch,并且通过代码去完成索引的一系列操作。集成方式 Spring Boot应用集成Elasticsearch有多种方式可以选择,比如可以直接引用SpringBoot官方提供的starter,然后通过hibernate JPA规范,dao层继承ElasticsearchRepository,就相当

2020-09-08 20:30:20 786

原创 【Elasticsearch6.5】使用API新建、更新、删除、查询索引数据

引言 通过上篇博客,我们已经在Linux环境下安装好了单机版的Elasticsearch和Head插件。本篇博客主要是照着官网操作一些API,熟悉一下如何建立、查询索引等操作,熟悉一下Head管理页面,这样在后面集成代码的过程中也会有所共鸣。 Index API 通过Index API,我们可以创建或者更新一个具体的索引,数据是JSON格式的文档,通过下面的命令,可以创建一个名为book,类型为_doc,id为377c-11ea-bbca-ec0d9a30b0c2的索引:指定idcurl -.

2020-09-06 13:55:35 642

原创 【Elasticsearch6.5】实例与Head插件安装教程

引言 在上篇博客中,我们对Elasticsearch有了一个入门的了解,为了方便后面的深入学习与实践,本篇博客将分享Elasticsearch的安装流程。环境与版本 • 操作系统:CentOS-7-x86_64 • Java环境:JDK8 • Elasticsearch版本:6.5.4单实例安装 1. 下载安装包wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.tar.gz 2.

2020-09-05 22:27:40 415

原创 全文搜索引擎Elasticsearch入门了解

一. 简要介绍Elasticsearch是实时的分布式搜索分析引擎,底层基于Lucene。Lucene是Java语言编写的全文搜索框架,用于处理纯文本的数据,但它只是一个库,提供建立索引、执行搜索等接口,但不包含分布式服务,这些正是 ES 做的。二. 使用场景基于ES,我们可以很容易地搭建自己的搜索引擎,用于分析日志,或者配合开源爬虫建立某个垂直领域的搜索引擎。除了搜索,ES 还提供了大量的聚合功能,所以它不单单是一个搜索引擎,还可以进行数据分析、统计,生成指标数据。三. 基本概念1. Node和

2020-09-05 20:23:47 379

原创 深入理解Java虚拟机(十一):各种锁概述

引言在上一篇文章《深入理解Java虚拟机(十):线程安全问题和实现方法》中,我们提到了线程安全,不论是使用synchronized关键字或是使用Lock实现类等方法去保证线程安全,最核心的点就在于“锁”。在Java并发编程中,有很多关于锁的名词,例如:乐观锁、悲观锁、可重入锁、自旋锁、轻量级锁等等,本篇文章将会逐个总结,各种锁的含义,看这一篇文章就够了!分类在详细解释各种锁之前,我们先从宏观上把握,从不同的角度,将各种锁进行划分整理一下。从线程是否要锁住同步资源角度,可以分为乐观锁和悲观锁。根

2020-07-27 16:19:03 307 1

原创 深入理解Java虚拟机(十):线程安全问题和实现方法

引言当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的。Java中的线程安全按照线程安全的“安全程度”由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。1. 不可变在Java语言里面(特指JDK 5以后,即Java内存模型被修正之后的Java语言),不可变(Immu

2020-07-21 18:43:10 372

原创 深入理解Java虚拟机(九):Java内存模型(Java Memory Model,JMM)

引言《Java虚拟机规范》中曾试图定义一种“Java内存模型”(Java Memory Model,JMM)来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。定义Java内存模型并非一件容易的事情,这个模型必须定义得足够严谨,才能让Java的并发内存访问操作不会产生歧义;但是也必须定义得足够宽松,使得虚拟机的实现能有足够的自由空间去利用硬件的各种特性(寄存器、高速缓存和指令集中某些特有的指令)来获取更好的执行速度。经过长时间的验证和修补,直至JDK 5

2020-07-21 10:45:22 266

原创 深入理解Java虚拟机(八):类加载器与双亲委派模型

引言Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(Class Loader)。类与类加载器类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。通俗地说,比较两个类是否“

2020-07-13 18:18:11 256

原创 深入理解Java虚拟机(七):虚拟机的类加载机制

引言Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。类加载时机一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分

2020-07-08 20:36:49 249

原创 深入理解Java虚拟机(六):内存回收实践者——经典垃圾收集器

引言《Java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定,因此不同的厂商、不同版本的虚拟机所包含的垃圾收集器都可能会有很大差别,不同的虚拟机一般也都会提供各种参数供用户根据自己的应用特点和要求组合出各个内存分代所使用的收集器。收集器概览上图展示了七种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。收集器划分收集器可划分为并行和并发两种。并行(Parallel):并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在协同工作,通常默

2020-06-22 20:46:37 245

原创 深入理解Java虚拟机(五):内存回收方法论——垃圾收集算法

引言从如何判定对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”。下面总结的算法均属于追踪式垃圾收集的范畴。分代收集理论相关名词部分收集(Partial GC):指目标不是完整收集整个Java堆的垃圾收集,其中又分为:1)新生代收集(Minor GC/Young GC):指目标只是新生代的垃圾收集。2)老年代收集(Major GC/

2020-06-18 11:51:49 295

原创 深入理解Java虚拟机(四):关于对象

引言在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)了。判断方法1. 引用计数算法?很多教科书判断对象是否存活的算法是这样的:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。但是,在Java领域,至少主流的Java虚拟机里面都没有选用引用计数算法来管理内存,主要原因是,

2020-06-09 20:22:44 281

原创 深入理解Java虚拟机(三):实战OutOfMemoryError异常

引言在系列文章的第一篇中,我们就了解到,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM)异常的可能。本篇博客将通过代码示例来再现异常情景,最后也会总结若干最基本的与自动内存管理子系统相关的HotSpot虚拟机参数。异常场景首先,我们可以在开发工具中设置一些JVM运行参数,如最大堆、最小堆等,这对示例代码的结果会有直接影响。以IDEA开发工具来说,我们在Edit Configurations对话框中的VM Options一项中进行设置,如下:1

2020-06-09 15:42:19 226

原创 深入理解Java虚拟机(二):HotSpot虚拟机对象探秘

引言通过上篇博客,我们已经了解了Java虚拟机的内存区域的划分及每个区域存储的内容,那么,本篇博客将以HotSpot虚拟机和内存区域Java堆为例,继续深入了解内部是如何创建、布局和访问的。探秘之旅1. 对象的创建Java是一门面向对象的编程语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,仅仅是一个new关键字而已,而在虚拟机中,又是怎样一个过程呢? 1) 检查,如果没有被加载、解析和初始化过,执行类加载过程当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的

2020-05-27 22:10:31 375

原创 深入理解Java虚拟机(一):Java虚拟机内存区域介绍

引言对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过,也正是因为Java程序员把控制内存的权力交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误、修正问题将会成为一项异常艰难的工作。本篇博客开始,将在《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》一书的引导下,开启Java虚拟机学习之旅。运

2020-05-27 17:09:24 402

原创 【Spring Boot】一文带你掌握面试题

【引言】最近一段时间,公司招人,面试了不少人,主要是需要做过Spring Boot项目,所以,利用这个机会,结合一些面试题,做了一些整理。【问题整理】一. 什么是Spring Boot?SpringBoot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。二. Spr...

2019-09-29 17:11:47 1965 1

原创 【Spring Boot】IDEA + Maven + Spring Boot + Dubbo + Mybatis Plus

【引言】    Spring Cloud和Dubbo是当前微服务架构中主流技术选型方案。Spring Cloud为我们的微服务架构提供了整套的技术体系方案,所以被称作为“全家桶”。    而关于dubbo的发展,曾经看到过停止维护的相关消息,使得很多公司转向Spring Cloud,而2017年9月,dubbo源码...

2019-07-26 23:34:51 2153 3

原创 【Spring Boot】Mybatis Plus 3.1.X 自动生成代码配置

【引言】    在前面的spring boot与mybatis plus 集成的相关博客中,用的是2.x的版本,而mybatis plus已经发布3.1.x版本,所以,参照着官方文档,将集成spring boot应用,实践下代码自动生成。【核心源码】    AutoGenerator 是 MyBatis-Plus...

2019-06-03 23:15:57 4936 12

原创 【Spring Cloud】Eureka Server源码解析

【学习背景】    在上篇文章中,分析了Eureka Client的源码,核心类是DiscoveryClient,完成了Client端的主要工作。本篇博客接着分析Eureka Server端。【学习内容】    ...

2019-05-26 13:21:08 958 1

原创 【Spring Cloud】Eureka Client源码解析

【学习背景】    在上一篇文章中,总结了Eureka中的相关组件与行为,也是分析其原理的第一步。本篇文章,先从Eureka Client出发,了解其是如何运行的。【学习内容】    先看下图,分阶段地展示了Eureka Client需要完成的工作:    在上图中,像...

2019-05-12 02:27:24 353 1

原创 【Spring Cloud】Eureka相关组件总结

【学习背景】    在前面的Spring Cloud系列学习文章中,把几个重要的组件总结并搭建了相关的demo,对于应用来说,基本上知道该如何集成了。    但仅仅停留在应用方面,是远远不够的,对于其中的原理及源码,有时间也是需要学习一下。本篇博客先简单地开个头,总结下Eureka注册中心中的相关组件,也是了解原理...

2019-05-12 00:55:07 499

原创 【Spring Cloud】集成Apollo分布式配置中心

【学习背景】    在上一篇博客中,学习并实践了Spring Cloud管理配置文件的组件Config,也用不同方式实现其刷新机制。而对于分布式配置中心,除了Spring Cloud Config,如Apollo、Disconf等,也都可以帮助我们实现分布式配置管理的功能。本篇博客就将实现Spring Cloud应用与Apollo分布式配置的集成。【学习...

2019-05-01 07:39:30 6418 1

原创 【Spring Cloud】刷新config配置文件信息的实现

【学习背景】    在前面一篇博客中,搭建了配置中心的demo,实现各服务配置文件的统一管理。但其实,存在这样一个问题:默认情况下并不能及时的获取实时变更的配置文件信息,而需要重启服务。所以,本篇博客主要解决上述问题,实现配置文件的修改,可以不重启服务,获取到最新的配置文件信息。【学习内容】1. 实现方法   &nbsp...

2019-04-26 10:20:25 753 1

原创 【Spring Cloud】学习和搭建Config分布式配置中心

【学习背景】    上篇博客学习的是Spring Cloud的Hystrix组件,从而保证在高并发情况下,在使用服务熔断、服务降级、服务隔离等方法,避免服务雪崩效应。本篇博客学习的组件是Config,分布式配置中心。【学习内容】一. 为什么要使用分布式配置中心?    在微服务中,如果使用传统方式管理配置文件,...

2019-04-25 11:16:37 305 1

原创 【Spring Cloud】Hystrix实现服务保护

【学习背景】隔了很长一段时间,没有更新Spring Cloud系列博客了,最近一直在看《重新定义Spring Cloud实战》一书,发现书中写了一些深层次的东西,对于之前自己有学习的一些组件,如Eureka、Feign、Ribbon等,在看书的过程中,又有了很多新的收获。所以,还是想继续把其他的一些组件学习下,本篇博客学习的组件是Hystrix。【学习内容】一. 什么是Hystrix?Hy...

2019-04-19 23:21:58 294

原创 【Spring Boot】Mybatis Plus 2.X 自动生成代码配置

【引言】在前面的博客《知道Mybatis,知道Mybatis-Plus么?》一文中,对Mybatis-Plus做了一个简单的认识及demo示例,Mybatis的增强版,确实很强大,更加简单高效。其中有提到一个强大的功能之一是内置代码生成器,也是本篇博客的主要内容,下面主要总结下demo搭建的过程。【demo】1. 新建项目spring-boot-mybatis-plus-generator...

2019-04-19 09:37:32 2895 1

原创 【Spring Cloud】声明式Feign客户端调用工具

【学习背景】通过前面的总结学习,我们可以回想下,是通过什么方式做到服务间的调用的?答案是:Ribbon+RestTemplate,且通过@LoadBalanced注解实现了客户端的负载均衡。本篇博客将介绍另一种调用方式,Feign。Feign也使用了ribbon,只要使用@FeignClient时,ribbon就会自动使用。【学习内容】1. Feign框架介绍Feign 是一个声明web服...

2019-02-15 17:36:42 481

原创 【Spring Cloud】Ribbon实现客户端负载均衡

【学习背景】在前面几篇博客中,学习到的都是将服务部署到不同的注册中心。而在系统架构中,一般都要求做到高可用,从而注册中心,服务提供者和服务调用者都会搭建集群部署。集群环境下,我们调用服务的哪个节点,如何做到客户端负载均衡,是本篇博客接下来总结的内容。【学习内容】1. 什么是客户端负载均衡?Nginx对我们来说,应该是听过且比较熟悉的,它可以帮助我们实现服务端的负载均衡。客户端所有请求统一交...

2019-02-15 11:18:27 420

原创 【Spring Cloud】Consul注册中心实现服务发现

【学习背景】除了前面两篇博客中学习到的Eureka和Zookeeper可以实现服务的发布与调用,本篇博客要总结的Consul同样也可做服务的注册中心。【学习内容】1. Consul是什么?Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源....

2019-02-02 16:55:10 968

dubbo管理平台war包(兼容jdk1.8)

dubbo-admin2.5.3版本源码war包不兼容jdk1.8,资源为自己修改了源码相关依赖后重新生成的war包,可在jdk1.8环境下的tomcat下直接部署。

2017-07-08

SSH框架整合

SSH框架整合实例。

2017-01-03

Struts2工作流程

本文件内容包含用EA软件画的Struts2的工作时序图(.eap文件)、对应生成的图片文件(.bmp文件)以及一张经典的Struts2流程图(.png文件)。此文件对理解Struts2的工作原理有极大的帮助。

2016-07-06

Struts2登录实例

利用Struts2的框架实现简单的登录,在实例中了解Struts2的流程以及相应的配置。

2016-06-08

Struts1.2登录实例

利用Struts1的框架实现简单的登录,在实例中了解Struts1的流程以及相应的配置。

2016-06-03

空空如也

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

TA关注的人

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