自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 SpringBoot 单元测试利器——Mockito

Mockito 是一种 Java mock 框架,他主要是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean、模拟方法的返回值、模拟抛出异常...等,在了解 Mockito 的具体用法之前,得先了解什麽是 mock 测试1. 什么是 mock 测试?mock 测试就是在测试过程中,创建一个假的对象,避免你为了测试一个方法,却要自行构建整个 bean 的依赖链像是以...

2020-02-10 16:03:58 540

原创 使用ngork解决聊天机器人webhook url

在开发聊天机器人时,最痛苦的事情不是写code,而是测试 聊天机器人的原理就是接收到讯息时,发送一个request到你指定的位置(就是webhook),然后你的程式收到用户传的讯息之后,你再call API回讯息 然而痛苦的点就在这个webhook上,因为webhook url通常都会有两个要求 必须要有一个domain域名(不能只有IP) ...

2019-09-20 16:00:23 1725 1

原创 Maven - 通用settings.xml

<settings> <!-- mvn deploy设定 --> <servers> <server> <id>release</id> <username>your company's release username</us...

2019-06-17 10:04:02 1379

原创 ElasticSearch - 抓取ES数据到本地文件

使用此脚本可以将ES上的数据抓取到本地文件,因为使用ES scroll实现,所以不受限于limit 10000笔影响 需要提前安裝 jq command Linux 安裝 : sudo apt install jq Centos 安裝 : sudo yum install jq MacOS 安裝 : brew install jq #!/bin/bash# ----------...

2019-06-12 10:14:15 3070 1

原创 Java - 内存洩漏

内存洩漏与内存溢出 两者的差别 内存洩漏 : 就是Memory Leak,是指程序在申请内存后,无法释放已申请的内存空间,也就是无用的对象持续佔有内存,得不到释放,从而造成内存空间的浪费 内存溢出 : 就是Out Of Memory,是指程序在申请内存时,没有足够的内存空间供其使用 其实内存洩漏和内存溢出之间没有多大的关係,...

2019-02-23 14:50:26 165

原创 Java - 理解GC日志

阅读GC日志是处理java虚拟机内存问题的必备技能,以下是一条常见的GC日志2.614: [GC [PSYoungGen: 695091K-&gt;2144K(695808K)] 1965832K-&gt;1273408K(2094080K), 0.0161160 secs] [Times: user=0.05 sys=0.00, real=0.02 secs] 2.614 : 代表...

2019-01-28 10:24:02 200

原创 Java - java虚拟机概述、jre, jdk, jvm的区别

Java虚拟机概述 Java推出时,提出了 "Write Once,Run Anywhere" 的口号,能达到跨平台运行代码这件事,就必须归功于java虚拟机 (Java Virtual Machine)的功劳了 传统C/C++是直接把程序员写的.c/.cpp代码,编译成那个平台(ex: Windows)能看懂的machine code,所以当编译一次之后,生成出来的这...

2019-01-22 11:09:43 180

原创 Java - 为什麽 Iterator接口 不提供 add(E) 方法 ?

为什麽Iterator接口,只有hasNext()、next()、remove()方法,而没有add(E)方法 ? 逻辑上来说,迭代器是一个一个去遍历集合中的元素,而当前iterator停下的地方,就是迭代到一半的地方 如果当迭代到一半时调用iterator.add()方法,理论上来说,应该是要在当前这个元素E1后面新增一个元素E2,使得下次遍历此集合时,E2一定会出现...

2018-12-12 16:58:35 1547

原创 Java - Iterator和ListIterator

Iterator是所有Collection类(List、Set....)们都可以使用的迭代器,而ListIterator则是专门为List类所设计的迭代器 Iterator只支持hasNext()、next()、remove()三种操作,而ListIterator除了原本的3种之外,还支持了更多操作 //Iterator接口public interface Iterator...

2018-12-05 22:40:41 1387 1

原创 Java - Iterable接口、迭代器Iterator

所有的集合类(List、Set...)都实现自Collection接口,而Collection接口又继承于Iterable接口,因此可以说所有的集合类(List、Set...)都实现了Iterable接口 当某个类实现Iterable接口时,我们就能称这个类是一个 "可数" 的类,也就是可以使用iterator()获取一个迭代器Iterator,然后使用这个Iter...

2018-12-05 22:37:59 271 1

原创 Java - final关键字

final可以加在成员变量、方法、类上,在java中的final,通常他指的是 "这是无法改变的" 的意思 final加在成员变量上 当final加在成员变量上时,意义就是指这个变量的值一旦被初始化之后,就不允许再被改变 如果final是加在基本类型(int、boolean、Integer...)上,因为这些变量中存的是实际的值,所以实际上是不允许改变他的值...

2018-10-31 20:34:38 134

原创 Java - 泛型

为什麽需要使用泛型 泛型是Java提供的给类加上一种模板,其意义为"一个类可以适用于许多样的类型",可以说泛型是实现了 "参数化类型" 的概念,他能使得代码具有更好的 可读性、安全性和可重用性 可读性 如果使用泛型的话,一眼就可以知道ArrayList&lt;String&gt;裡放的都是String对象,一目了然 安全...

2018-10-19 09:25:56 254

原创 Java - 对象的初始化

Java中的初始化 java会尽力保证所有的变量在使用前都能够得到恰当的初始化,避免出现一堆null导致报错 因此当变量是 基本类型 时,Java都会给他初始化一个初值 但如果变量是 对象类型 时,因为Java无法知道这个自定义的类型要给什麽初始化的值,因此如果没有初始化的话,还是会得到一个null值 初始化的顺序 : 先执行...

2018-09-19 16:06:13 205

原创 Java - 传参到底是哪种? pass by value or pass by reference

在了解Java传参数是pass by value或是pass by reference之前,先了解=赋值的用法会对理解传参很有帮助 赋值(=)的用法 =的意义是赋值,但是这个赋值用在 基本类型 和 对象类型 上会有非常大的差别 如果=用在基本类型上,因为基本类型储存了实际的数值,所以在为其赋值时,是直接将值複製一份新的过去 因此假设a、b都是基本类型...

2018-09-10 17:48:53 1605

原创 ElasticSearch - 输入即搜索 edge n-gram

在此之前,ES所有的查询都是针对整个词进行操作,也就是说倒排索引存了hello这个词,一定得输入hello才能找到这个词,输入 h 或是 he 都找不到倒排索引中的hello 然而在现实情况下,用户已经渐渐习惯在输入完查询内容之前,就能为他们展现搜索结果,这就是所谓的即时搜索(instant search),或是可以称为 输入即搜索(search-as-you-type) ...

2018-08-19 22:30:44 3201

原创 ElasticSearch - 环境架设、基本运维

ElasticSearch环境架设 先下载想要的版本ES ElasticSearch : https://www.elastic.co/downloads/elasticsearch 确保每台机器都升级 jdk 到 1.8 在每台机器上都安装ElasticSearch sudo rpm -ivh elasticsearch...

2018-08-14 11:49:49 448

原创 Java多线程 - 线程池 ThreadPoolExecutor类的使用

ThreadPoolExecutor类可以非常方便的创建线程池对象,而不需要程序员设计大量的new去实例化Thread相关的代码 最常用的构造方法 (不过threadFactory可以视情况设或不设) ThreadPoolExecutor(    int corePoolSize,    int maximumPoolSize,    long keepAliveTim...

2018-08-02 21:24:21 274

原创 ElasticSearch - 批量操作 bulk

bulk允许在一个请求中进行多个操作(create、index、update、delete),也就是可以在一次请求裡做很多事情 也由于这个关系,因此bulk的请求体和其他请求的格式会有点不同 bulk的请求模板 分成action、metadata和doc三部份 action : 必须是以下4种选项之一 index(最常用) :...

2018-07-30 21:25:57 5895

原创 Java多线程 - 线程同步 synchronized

synchronized是Java同步的基础,只有彻底了解synchronized的对象锁、可重入锁...特性,将来在使用高阶的ReentrantLock、ReentrantReadWriteLock才能得心应手本文将透过大量的具体实例来了解synchronized的特性 具体实例 假设现在有一个MyObject对象myObject,他有methodA()和methodB()方...

2018-07-28 15:04:23 139

原创 Intellij Idea - 升级遇到的问题 Error: java: invalid flag: -version

有时候在升级idea时会遇到 Error: java: invalid flag: -version 解决办法 打开 File -&gt; settings,搜索 Java compiler 此时会发现右下角的每一个module裡的Compilation options中,都多加了一个-version 把每个module的-...

2018-07-26 17:10:20 3668 1

原创 Linux - 查看日志的指令 tail、multitail、less

tail -f catalina.log : 实时看log,会自动把新增的log直接显示出来 在实时日志上打印颜色,给每个状态给上不同的颜色,INFO绿色、WARN黄色、ERROR红色 tail -f catalina.out | perl -pe 's/(INFO)/\e[0;32m$1\e[0m/g,s/(WARN)/\e[0;33m$1\e[0m/g,s/(ERROR)...

2018-07-25 17:27:55 1352

原创 ElasticSearch - 聚合 aggs

聚合概念 ElasticSearch除了致力于搜索之外,也提供了聚合实时分析数据的功能 如果把搜索比喻为大海捞针(从海量的文档中找出符合条件的那一个),那麽聚合就是去分析大海中的针们的特性,像是 在大海里有多少针? 针的平均长度是多少? 按照针的製造商来划分,针的长度中位值是多少? 每月加入到海中的针有...

2018-07-23 19:13:56 40527 10

原创 Java多线程 - ThreadLocal类的使用

ThreadLocal是线程的局部变量, 是每一个线程所单独持有的,其他线程不能对其进行访问 ThreadLocal支持泛型,也就是支持value是可以设置类型的,像是ThreadLocal&lt;Date&gt;就是设置value为Date类型 每个线程会有自己的一份ThreadLocalMap变量,去储存这个线程自己想存放的ThreadLocal变量们,他内部储存...

2018-07-16 10:24:34 238

原创 ElasticSearch - function_score (衰减函数 linear、exp、gauss 具体实例)

阅读本文需要先了解function_score的相关知识,请看 ElasticSearch - function_score 简介很多变量都可以影响用户对于酒店的选择,像是用户可能希望酒店离市中心近一点,但是如果价格足够便宜,也愿意为了省钱,妥协选择一个更远的住处如果我们只是使用一个 filter 排除所有市中心方圆 100 米以外的酒店,再用一个filter排除每晚价格超过100元的酒店,这种作...

2018-07-11 16:59:19 16992 10

原创 Spring - 注解 vs XML 哪个好?

Spring中,使用注解@Autowired进行注入好,还是使用xml配置进行注入好?先讲结论,使用注解@Autowired注入比较好当时Spring开发的初衷是为了解决类与类之间的强藕合new,所以当时提出了xml配置注入bean的方法,就是让代码只关注我需要什麽service,但此service是由哪个实现类提供的我并不关心使用xml的好处就是,实现类更换的时候并不需要去改动代码,只要去改动x...

2018-07-06 12:35:57 8081 8

原创 ElasticSearch - function_score (weight具体实例)

阅读本文需要了解function_score的相关知识,先看 ElasticSearch - function_score 简介先准备数据和索引,在ES插入三笔数据,其中language是keywork类型,like是integer类型(代表点赞量){ "language": "java", "like": 5 }{ "language": "python", "like": 5 }{

2018-07-05 18:50:40 7068 1

原创 ElasticSearch - function_score (field_value_factor具体实例)

首先准备数据和索引,在ES插入三笔数据,其中title是text类型,like是integer类型(代表点赞量){ "title": "ES 入门", "like": 2 }{ "title": "ES 进阶", "like": 5 }{ "title": "ES 最高难度", "like": 10 }先使用一般的query,

2018-07-04 15:09:13 4243 2

原创 ElasticSearch - function_score 简介

function_score内容较多,此篇主要是对function_score内容做系统性的讲解,之后会出几篇实际应用的方法,参考以下链接ElasticSearch - function_score (field_value_factor具体实例)ElasticSearch - function_score (weight具体实例)ElasticSearch - function_sc...

2018-07-04 15:05:51 17129 6

原创 ElasticSearch - 解决ES的深分页问题 (游标 scroll)

ES为了避免深分页,不允许使用分页(from&amp;size)查询10000条以后的数据,因此如果要查询第10000条以后的数据,要使用ES提供的 scroll(游标) 来查询假设取的页数较大时(深分页),如请求第20页,Elasticsearch不得不取出所有分片上的第1页到第20页的所有文档,并做排序,最终再取出from后的size条结果作爲最终的返回值假设你有16个分片,则需要在coord...

2018-06-26 22:04:52 34005 4

原创 ElasticSearch - 嵌套对象 nested

由于在ES中,所有单个文档的增删改都是原子性的操作,因此将相关的实体数据都储存在同一个文档是很好的,且由于所有信息都在一个文档中,因此当我们查询时就没有必要像mysql一样去关联很多张表,只要搜一遍文档就可以查出所有需要的数据,查询效率非常高因此除了基本数据类型之外,ES也支持使用複杂的数据类型,像是数组、内部对象,而要使用内部对象的话,需要使用nested来定义索引,使文档内可以包含一个内部对象...

2018-06-22 20:58:56 19654

原创 ElasticSearch - term 和 match 的差别

term 和 match牵扯到了分词器、mapping、倒排索引等term 是直接把field拿去查询倒排索引中确切的termmatch 会先对field进行分词操作,然后再去倒排索引中查询具体实例假设有一个字段nickname,存放的类型是text,因此当新增一笔文档时,内容会被分词器分词,然后才储存进倒排索引假设插入了一笔文档,其中"nickname": "1 hello",分词过后变为1、h...

2018-06-20 14:23:18 1095 1

原创 Dubbo - 远程debug

由于Dubbo的特性是远程调用,因此正常来说无法在本地进行debug因为你调用的方法在别台机器上跑,你只能知道给他的input和他返回的结果,但没办法知道这个接口内部的执行,所以也没办法在裡面打断点进行debug就算在本地有dubbo代码,在本地的dubbo代码打断点也没办法debug,因为实际上调用的是远程服务器上的dubbo代码,而不是本地的dubbo代码所以如果要对远程服务器上的dubbo代...

2018-06-12 20:18:48 2611 1

原创 Java - 注解的使用

Java基本内置注解@Override@Override用在方法上,表示这个方法重写了父方法,如toString()如果父方法没有这个方法,那麽就无法编译过如果实现接口,需要在每个实现方法都加上@Override,说明这是要实现那个接口的方法,而不是自己新创的方法@Deprecated@Deprecated 表示这个方法已经过期,不建议开发者使用暗示在将来某个不确定的版本,就有可能会被取消掉@Su...

2018-06-11 19:14:21 165

原创 ElasticSearch - 自定义分析器

ElasticSearch的分析器实际上是将三个功能封装在一起,这三个功能按照顺序执行,而这三个功能都是能自定义的字符过滤器 (char_filter) 首先,字符串按顺序通过每个字符过滤器,他们的任务是在分词前整理字符串一个字符过滤器可以用来去掉HTML,或者将&amp;转化成and分词器 (tokenizer)其次,字符串被分词器分爲单个的词条,一个简单的分词器遇到空格和标点的时候,可能会将文...

2018-06-09 10:34:42 5735

原创 ElasticSearch - 基本类型与映射 (es5.x以上)

ElasticSearch支持的基本类型在 2.x -&gt; 5.x 时进行了修改,主要是针对 string 字段的改变本文是基于ES 5.x以上所写Elasticsearch支持的基本类型字符串 : text, keywordtext:存储数据的时候,会自动分词,并生成索引keyword:存储数据的时候,不会分词,而是直接整个词拿去建索引整数 : byte, short, integer, l...

2018-06-07 14:34:11 1982

原创 MySQL - 自动更新时间

在modified_time字段上使用ON UPDATE CURRENT_TIMESTAMP,就可以在执行update语句时自动更新这个字段的时间 但是要注意,update语句必须有影响某个列,才会发动这个效果 因此如果update没有更新任何字段,modified_time字段就不会被更新 CREATE TABLE `document` ( `id` int(1...

2018-05-31 11:44:09 2835

空空如也

空空如也

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

TA关注的人

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