Elasticsearch学习笔记
Elasticsearch 概述Elasticsearch 是什么
The Elastic Stack, 包括 Elasticsearch、Kibana、Beats 和 Logstash(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。Elasticsearch,简称为 ES,ES 是一个开源的高扩展的分布式全文搜索引擎,是整个 Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB 级别的数据。
全文搜索引擎 Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。
一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段。进行全文检索需要扫描整个表,如果数据量大的话即使对 SQL 的语法优化,也收效甚微。建立了索引,但是维护起来也很麻烦,对于 ins ...
JDK/Dubbo/Spring 三种 SPI 机制
背景SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。
本文主要是特性 & 用法介绍,不涉及源码解析(源码都很简单,相信你一定一看就懂)
SPI 有什么用?举个栗子,现在我们设计了一款全新的日志框架:super-logger。默认以XML文件作为我们这款日志的配置文件,并设计了一个配置文件解析的接口:
代码示例
12345package com.github.kongwu.spisamples;public interface SuperLoggerConfiguration { void configure(String configFile);}
然后来一个默认的XML实现:
12345678package com.github.kongwu.spisamples;public class XMLConfigura ...
Linux CentOS 7.8安装MySQL5.7
安装MySQL源123456# 下载bash > wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm# 安装 MySQL 源bash > yum localinstall mysql57-community-release-el7-11.noarch.rpm
检查源是否安装成功123yum repolist enabled | grep "mysql.*-community.*"
页面输出信息表示源安装成功
12345mysql-connectors-community/x86_64 MySQL Connectors Community 165mysql-tools-community/x86_64 MySQL Tools Community 115mysql57-community/x86_64 MySQL 5.7 Community Server ...
Java线程池实现原理及其在美团业务中的实践
背景随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。
本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程池遇到的问题,并给出了一种动态化线程池解决方案。
写在前面线程池是什么线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。
线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。
而本文描述线程池是JDK中提供的ThreadPoolExecutor类。
当然,使用线程池可以带来一系列好处:
降低资源消耗:通过 ...
从ReentrantLock的实现看AQS的原理及应用
前言Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQS。由于篇幅原因,本篇文章主要阐述AQS中独占锁的逻辑和Sync Queue,不讲述包含共享锁和Condition Queue的部分(本篇文章核心为AQS原理剖析,只是简单介绍了ReentrantLock,感兴趣同学可以阅读一下ReentrantLock的源码)。
下面列出本篇文章的大纲和思路,以便于大家更好地理解:
ReentrantLockReentrantLock特性概览ReentrantLock意思为可重入锁,指的是一个线程能够对一个临界资源重复加锁。为了帮助大家更好地理解ReentrantLock的特性,我们先将ReentrantLock ...
在Spring Boot中优雅的实现定时任务
背景在日常的项目开发中,往往会涉及到一些需要做到定时执行的代码,例如自动将超过24小时的未付款的单改为取消状态,自动将超过14天客户未签收的订单改为已签收状态等等,那么为了在Spring Boot中实现此类需求,我们要怎么做呢?
Spring Boot早已考虑到了这类情况,先来看看要怎么做。
第一种方式是比较简单的,基于@Scheduled注解1234567891011121314@EnableCaching // 启用缓存功能@EnableScheduling // 开启定时任务功能@ComponentScan(basePackages = "org.javamaster.b2c")@EnableTransactionManagement@SpringBootApplicationpublic class ScheduledApplication { private static Logger logger = LoggerFactory.getLogger(ScheduledApplication.class); public static ...
SpringBoot 定时任务
背景Spring 中,创建定时任务除了使用@Scheduled 注解外,还可以使用 SchedulingConfigurer。
@Scheduled 注解有一个缺点,其定时的时间不能动态的改变,而基于 SchedulingConfigurer 接口的方式可以做到。SchedulingConfigurer 接口可以实现在@Configuration 类上,同时不要忘了,还需要@EnableScheduling 注解的支持。
基于@Scheduled注解的实现方式代码示例
12345678@Component@EnableSchedulingpublic class TimeScheduled { @Scheduled(cron = "${scheduled.cron}") public void run() { //业务逻辑 }}
基于实现SchedulingConfigurer的实现方式在启动类必须加上@EnableSched ...
Spring Boot引起的“堆外内存泄漏”排查及经验总结
背景为了更好地实现对项目的管理,我们将组内一个项目迁移到MDP框架(基于Spring Boot),随后我们就发现系统会频繁报出Swap区域使用量过高的异常。笔者被叫去帮忙查看原因,发现配置了4G堆内内存,但是实际使用的物理内存竟然高达7G,确实不正常。JVM参数配置是“-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:+AlwaysPreTouch -XX:ReservedCodeCacheSize=128m -XX:InitialCodeCacheSize=128m, -Xss512k -Xmx4g -Xms4g,-XX:+UseG1GC -XX:G1HeapRegionSize=4M”,实际使用的物理内存如下图所示:
排查过程使用Java层面的工具定位内存区域(堆内内存、Code区域或者使用unsafe.allocateMemory和DirectByteBuffer申请的堆外内存)笔者在项目中添加-XX:NativeMemoryTracking=detailJVM参数重启项目,使用命令jcmd pid VM.native_me ...
修改CentOS默认yum源为国内yum镜像源
前言有时候CentOS默认的yum源不一定是国内镜像,导致yum在线安装及更新速度不是很理想。这时候需要将yum源设置为国内镜像站点。国内主要开源的开源镜像站点应该是网易和阿里云了。
修改CentOS默认yum源为mirrors.163.com首先备份系统自带yum源配置文件/etc/yum.repos.d/CentOS-Base.repo123mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
进入yum源配置文件所在的文件夹123cd /etc/yum.repos.d/
下载163的yum源配置文件到上面那个文件夹内CentOS71wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
CentOS61wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
CentOS51wget http://mirrors.163.com/.help/CentOS5-Base- ...
Java 线程到底有几种状态
Java 线程到底有几种状态网上对Java线程状态的讨论很多,有说是5种状态的,有说是6种状态的,甚至还有说是7种状态的。那到底有几种状态呢?查看JDK源码java.lang.Thread.State这个枚举类,可以明确的看到,它只定义了6种状态
12345678public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; }
6大状态说明新建状态(New)查看jdk源码对NEW状态注释
1234/** * Thread state for a thread which has not yet started. */NEW
可以看到NEW状态是一种线程刚创建,但还没有开始的状态。代码示例
1234public static void main(String[] args) { Thread thread = new Thread(); System.out.println(" ...