- 博客(244)
- 资源 (1)
- 收藏
- 关注
原创 Spring源码-循环依赖与三级缓存
一、前言循环依赖:就是N个类循环(嵌套)引用。通俗的讲就是N个Bean互相引用对方,最终形成闭环。在日常的开发中,我们都会碰到类似如下的代码@Servicepublic class AServiceImpl implements AService { @Autowired private BService bService; ...}@Servicepublic class BServiceImpl implements BService { @Autowire
2020-10-08 23:56:54
755
1
转载 LRU算法的Java实现
一、LRU算法介绍LRU算法全称Least Recently Used,也就是检查最近最少使用的数据的算法。这个算法通常使用在内存淘汰策略中,用于将不常用的数据转移出内存,将空间腾给最近更常用的“热点数据”。算法很简单,只需要将所有数据按使用时间排序,在需要筛选出LRU数据时,取排名靠后的即可。二、Java中的LRU实现思路根据LRU算法,在Java中实现需要这些条件:底层数据使用双向链表,方便在链表的任意位置进行删除,在链表尾进行添加,这一点用单链表比较费劲,当然用数组等结构也都很费劲,当然双
2020-10-04 16:47:02
4139
转载 MySQL-MVCC机制
一、前言前面介绍了MySQL的锁机制,提到过写锁和读锁是冲突的,那么MySQL是如何处理读写冲突,提高数据库高并发场景下的吞吐性能?本章主要是介绍MVCC (Multiversion Concurrency Control) ,即多版本并发控制。二、什么是MVCCSELECT 操作可以不加锁而是通过 MVCC 机制读取指定的版本历史记录,并通过一些手段保证保证读取的记录值符合事务所处的隔离级别,从而解决并发场景下的读写冲突。下面举一个多版本读的例子,例如两个事务 A 和 B 按照如下顺序进行更新和读
2020-09-10 20:13:44
904
原创 MySQL-锁机制、锁分类、加锁规则、加锁流程
一、前言因为平常主要用的场景都是MySQL的Innodb引擎,所以主要分析MYSQL在Innodb引擎下的锁机制,稍微提及下MYISAM引擎。其中会穿插数据库事务、数据库锁标识、数据库死锁日志分析等。二、MySQL锁机制概述2.1 锁介绍锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要
2020-09-06 18:13:42
1404
转载 Redis布隆过滤器
一、布隆过滤器使用场景比如有如下几个需求:①、原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中?解决办法一:将10亿个号码存入数据库中,进行数据库查询,准确性有了,但是速度会比较慢。解决办法二:将10亿号码放入内存中,比如Redis缓存中,这里我们算一下占用内存大小:10亿*8字节=8GB,通过内存查询,准确性和速度都有了,但是大约8gb的内存空间,挺浪费内存空间的。②、接触过爬虫的,应该有这么一个需求,需要爬虫的网站千千万万,对于一个新的网站url,
2020-09-03 16:33:50
458
1
转载 深入理解Redis-跳跃表
一、经典Skiplist 跳跃表跳表由 William Pugh 于1990年发表的论文 Skip lists: a probabilistic alternative to balanced trees 中被首次提出,查找时间复杂度为平均 O(logN)O(logN)O(logN),最差 O(N)O(N)O(N),在大部分情况下效率可与平衡树相媲美,但实现比平衡树简单的多,跳表是一种典型的以空间换时间的数据结构。1.1 什么是跳跃表对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中
2020-09-03 15:54:36
2518
转载 Redis-底层数据结构详解
一、前言前面介绍过Redis的五大基础数据类型(String、Hash、List、Set、ZSet)由六种底层数据结构(简单动态字符串、链表、字典、跳跃表、整数集合、压缩列表)实现,本章主要分析这六种底层数据结构。PS:Redis有八种编码,但底层数据机构是六种。二、SDS(simple dynamic string)简单动态字符串结构定义struct sdshdr{ //记录buf数组中已使用字节的数量 //等于 SDS 保存字符串的长度 int len;
2020-09-02 16:53:17
1593
转载 Redis-五大数据类型实现原理
一、前言在Redis底层中,有六种数据结构(简单动态字符串、链表、字典、跳跃表、整数集合、压缩列表),但Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这些对象系统也就是String、Hash、List、Set、ZSet五大数据类型,每一种数据类型都至少用到了一种数据结构。通过这五种不同类型的对象,Redis可以在执行命令之前,根据对象的类型判断一个对象是否可以执行给定的命令,而且可以针对不同的场景,为对象设置多种不同的数据结构,从而优化对象在不同场景下的使
2020-09-01 20:05:17
178
1
转载 JVM命令-jstack
一、简介jstack用法/opt/java8/bin/jstackUsage: jstack [-l] <pid> (to connect to running process) 连接活动线程 jstack -F [-m] [-l] <pid> (to connect to a hung process) 连接阻塞线程 jstack [-m] [-l] <executable> <core>
2020-08-17 19:54:48
260
转载 JVM命令-jinfo
一、命令说明jinfo 用来查看正在运行的 java应用程序扩展参数jinfo [option] <pid>Usage: jinfo [option] <pid> (to connect to running process) jinfo [option] <executable <core> (to connect to a core file) jinfo [option] [server_id@]
2020-07-21 20:20:40
248
转载 JVM命令-jmap
一、命令概述jmap 用于生成堆 dump文件,查看堆内对象统计信息、classloader 信息、 finalizer 队列Usage: jmap [option] <pid> (to connect to running process) jmap [option] <executable <core> (to connect to a core file) jmap [option] [server_id@]&l
2020-07-21 20:05:22
454
转载 JVM命令-jstat
jstat用法如下:jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]-t :代表时间粗-h<lines>:即-h跟数字,代表隔几行显示标题vmid :代表vm进程idinterval:代表监控间隔时间段,默认毫秒做单位count:代表取数次数例:jstat -gcutil -t -h5 123456 1000 100表示每1000毫秒收集一次jv
2020-07-21 19:47:28
1140
1
原创 CPU耗时高定位
命令手敲比较麻烦,记录下1、运行top命令后,键入大写P,找出耗CPU最高的进程。比如: 13869附:top交互命令:c: 显示完整的命令d: 更改刷新频率f: 增加或减少要显示的列(选中的会变成大写并加*号)F: 选择排序的列h: 显示帮助画面H: 显示线程i: 忽略闲置和僵死进程k: 通过给予一个PID和一个signal来终止一个进程。(默认signal为15。在安全模式中此命令被屏蔽)l: 显示平均负载以及启动时间(即显示影藏第一行)m: 显示内存信息M: 根据内存资源
2020-07-21 16:31:55
1030
原创 ES集群安装x-pack监控
一、背景线上需要安装x-pack监控ES集群,故记录下安装过程;二、安装过程注:ES集群中每个节点都需要安装x-pack,而且还必须先在woker节点安装,然后再在master节点安装,否则集群会出现no master异常。2.1、首先从ES官网下载对应ES版本的x-pack插件https://www.elastic.co/guide/en/x-pack/5.6/installing-xpack.html下载过程可能比较慢,可以将请求拷贝到迅雷中去下载。2.2、ES集群中worker节点安装x
2020-07-09 20:59:21
1136
原创 SpringBoot启动流程简析(二)
前面分析了SpringBoot启动时,创建SpringApplication实例的流程,接下里分析调用SpringApplication的run()方法的主要执行流程。代码入口:SpringApplication.run(String… args)方法public ConfigurableApplicationContext run(String... args) { //监...
2020-01-22 17:14:30
261
原创 SpringBoot启动流程简析(一)
最近在业务中碰到SpringBoot启动流程相关问题,故梳理记录下:要点:本章主要梳理SpringBoot启动流程中是如何创建SpringApplication实例的。启动主类代码如下:@Slf4j@SpringBootApplicationpublic class ItemFootprintApplication { public static void main(String...
2020-01-22 11:49:06
273
原创 java程序执行linux命令
因某些情况下需要调用Java程序执行Linux命令,过程中有写坑,记录下:@Slf4jpublic class CommandUtil { public static Result<Boolean> run(List<String> commandArr){ File wd = new File("/bin"); Process ...
2020-01-19 11:27:58
1174
转载 Java中SPI机制详解
本文转载于高级开发必须理解的Java中SPI机制本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践、学习开源项目提供参考。一、 SPI是什么SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。整体机制图如下:Java SPI 实际上是“基于接口...
2019-10-10 15:46:12
2191
1
转载 Elasticsearch系列(十)ES线上常用监控命令
原文地址:干货 | Elasticsearch Top10 监控指标Elasticsearch具有通用性,可扩展性和实用性的特点,集群的基础架构必须满足如上特性。合理的集群架构能支撑其数据存储及并发响应需求。相反,不合理的集群基础架构和错误配置可能导致集群性能下降、集群无法响应甚至集群崩溃。适当地监视群集可以帮助您实时监控集群规模,并且可以有效地处理所有数据请求。本文我们将从五个不同的维度来...
2019-09-30 18:03:44
3990
3
转载 Elasticsearch系列(九)ElasticSearch脑裂问题
原文地址:ES脑裂问题概述:一个正常es集群中只有一个主节点,主节点负责管理整个集群,集群的所有节点都会选择同一个节点作为主节点所以无论访问那个节点都可以查看集群的状态信息。 而脑裂问题的出现就是因为从节点在选择主节点上出现分歧导致一个集群出现多个主节点从而使集群分裂,使得集群处于异常状态。原因:1:网络原因 内网一般不会出现此问题,可以监控内网流量状态。外网的网络出现问题的可能性...
2019-09-30 16:43:28
761
转载 Elasticsearch系列(八)ElasticSearch 配置详解
原文地址:ES线上部署elasticsearch的config文件夹里面有两个配置文 件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日 志的,所以logging.yml里的设置按普通log4j配置文件来设置就行了。下面主要讲解下elasticsearch.yml这个文件中可配置的 东西。cluste...
2019-09-30 15:10:16
431
转载 Elasticsearch系列(七)ES数据搜索之原理分析
本文转载于ES映射和分析前言在探究ES数据搜索原理时,先了解下ES的mapping和analysis机制,关于mapping的详细可以参考之前的文章:Elasticsearch系列(三)mapping详解映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型(string, number, booleans, date等)。分析(analysis)机制用于进行全...
2019-03-01 14:37:06
13385
转载 Elasticsearch系列(六)ES数据搜索之基本流程
一、搜索过程文档能够从主分片或任意一个复制分片被检索。下面我们罗列在主分片或复制分片上检索一个文档必要的顺序步骤:(1) 客户端给Node 1发送get请求。(2) 节点使用文档的_id确定文档属于分片0。分片0对应的复制分片在三个节点上都有。此时,它转发请求到Node 2。(3) Node 2返回文档(document)给Node 1然后返回给客户端。对于读请求,为了平衡负载,请求...
2019-02-28 21:48:29
9170
1
转载 Elasticsearch系列(五)ES数据写入
本文转载自:ES数据写入一、路由它被存储在单独一个主分片上。Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢?当你索引一个文档,它被存储在单独一个主分片上。Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢?进程不能是随机的,因为我们将来要检...
2019-02-28 20:40:20
6467
转载 Elasticsearch系列(四)ES数据基本知识
本文转载自:ES数据操作本章就不详细示例ES数据的基本操作,只记录一些知识点,便于读者阅读后面的章节有帮助;一、文档及文档元数据对象(object)是一种语言相关,记录在内存中的的数据结构。为了在网络间发送,或者存储它,我们需要一些标准的格式来表示它。JSON (JavaScript Object Notation)是一种可读的以文本来表示对象的方式。它已经成为NoSQL世界中数据交换的一种...
2019-02-28 17:27:20
3369
转载 Elasticsearch系列(三)ES集群
本文转载自:ES分布式集群前言本章我们解释一些通用的术语,例如集群(cluster)、节点(node)和分片(shard),Elasticsearch的扩展机制,以及它如何处理硬件故障。我们在使用Elasticsearch的时候可以长时间甚至永远都不必担心分片、复制和故障转移——但是它会帮助你理解Elasticsearch内部的工作流程。Elasticsearch用于构建高可用和可扩展...
2019-02-28 12:04:46
1119
转载 Redis缓存使用-穿透、雪崩、热点key问题
一、缓存穿透redis缓存穿透:查询一个数据库中不存在的数据,比如商品详情,查询一个不存在的ID,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成过大地压力。解决方案:1、缓存空对象当查询一个不存在的key时,缓存为空,去查询DB,当DB为空时,将该Key对应的值设为空对象,并设置一个过期时间,当下一次请求再查询该Key时,直接返回空对象,不用再访问DB了;分析:(1)内...
2019-02-25 21:10:40
525
原创 Elasticsearch系列(三)mapping详解
一、前言Elasticsearch中mapping创建类似MYSQL中的表schema,本文大致记录下ES中mapping创建遇到的一些问题,供彼此学习,更多的请查看官网。Elasticsearch-mapping一、示例分析curl -XPUT "http://localhost:9200/rate" -H 'Content-Type: application/json' -d'{...
2019-01-26 18:12:56
4070
原创 Elasticsearch系列(二)SpringBoot集成Spring-Data-Elasticsearch
一、添加依赖SpringBoot版本需2.0x以上: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <versi...
2018-11-24 15:12:26
795
原创 Elasticsearch系列(一)Elasticsearch及相关插件安装
我这边安装的是ES5.5版本,官方文档地址:ES-5.5安装Elastic5.5 需要 Java 8 环境。安装完 Java后,就可以跟着官方文档安装 Elastic。直接下载压缩包比较简单。1、下载安装包curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.3.tar.gz2、...
2018-11-13 20:44:40
625
转载 删除本地仓库中所有的.lastUpdated
windows系统cd %userprofile%\.m2\repositoryfor /r %i in (*.lastUpdated) do del %ilinux系统find /app/maven/localRepository -name "*.lastUpdated" -exec grep -q "Could not transfer" {} \; -print -exec rm...
2018-10-15 15:39:56
3853
转载 动态代理系列(扩展篇)RPC实现原理
本文转载自:扒一扒RPC因为RPC是基于动态代理的。想必大家都听过RPC,但是可能并没有针对的去了解过,因此本文打算以如下结构讲一讲RPC:①尽量浅显易懂的描述RPC的工作原理。②分析一个RPC的Demo。一、 走近RPC1.1 什么是RPCRPC是Remote Procedure Call的缩写,即远程过程调用,意思是可以在一台机器上调用远程的服务。在非分布式环境...
2018-09-17 17:39:04
937
2
转载 Http长连接及短连接
本文转载自HTTP长连接、短连接究竟是什么?一、HTTP协议与TCP/IP协议的关系HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接...
2018-09-14 17:11:57
243
转载 HTTP断点续传(分块传输)
本文转载自HTTP断点续传(分块传输)简述断点续传:指的是在上传/下载时,将任务(一个文件或压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传/下载,如果碰到网络故障,可以从已经上传/下载的部分开始继续上传/下载未完成的部分,而没有必要从头开始上传/下载。可以节省时间,提高速度。一、断点续传的用途有时用户上传/下载文件需要历时数小时,万一线路中断,不具备断点续传的 H...
2018-09-14 15:45:46
3060
转载 TCP可靠传输的实现
本文转载自:TCP可靠传输的实现TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现。一、滑动窗口协议关于这部分自己不晓得怎么叙述才好,因为理解的部分更多,下面就用自己的理解来介绍下TCP的精髓:滑动窗口协议。所谓滑动窗口协议,自己理解有两点:“窗口”对应的是一段可以被发送者发送的字节序列,其连续的范围...
2018-09-13 18:06:44
526
转载 动态代理系列(三)JDK动态代理和CGLIB代理的区别
本文转载自:动态代理:JDK动态代理和CGLIB代理的区别代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法、实际执行的是被代理类的方法。而AOP,是通过动态代理实现的。一、简单来说: JDK动态代理只能对实现了接口的类生成代理,而不能针对类 CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其...
2018-09-07 19:11:31
1151
转载 动态代理系列(二)CGLib动态代理
转载自:CGLib动态代理的介绍及用法(单回调、多回调、不处理、固定值、懒加载)本文将介绍下CGLib动态代理及几种用法。CGLib(Code Generation Library)是一个高效的代码生成库,底层实现是使用asm来转换字节码生成类。在生成代理类的场景中,由于JDK动态代理必须要求源对象有实现接口,而实际场景中,并不是所有类都有实现接口,因此使用CGLib可以用在未实现接口的类上。...
2018-09-07 19:04:39
335
转载 动态代理系列(一)JDK动态代理-超详细源码分析
本文转载自JDK动态代理-超详细源码分析一、为什么需要动态代理1.1 从代理模式说起代理模式是指给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。这种模式有什么用呢?它可以在原对象的基础上增强原对象的功能,比如在原对象调用一个方法的前后进行日志、事务操作等。Spring AOP就使用了代理模式。1.2 代理模式—-静态...
2018-09-07 17:06:51
3166
1
转载 Spring BeanFactory和FactoryBean的区别
有些东西可能知其用,但也需知其所以然,特转载该篇Spring BeanFactory和FactoryBean的区别org.springframework.beans 及 org.springframework.context 包是 Spring IoC 容器的基础。一、BeanFactory是一个接口,public interface BeanFactory,提供如下方法:pack...
2018-09-07 11:48:14
940
1
转载 Paxos算法
本文转载自:Paxos算法一、Paxos算法的描述通过一个决议分为两个阶段:1、prepare阶段: (1) proposer选择一个提案编号n并将prepare请求发送给acceptors中的一个多数派; (2) acceptor收到prepare消息后,如果提案的编号大于它已经回复的所有prepare消息,则acceptor将自己上次接受的提案回复给propose...
2018-08-27 15:06:31
279
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人