自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ElasticSearch基本原理

一.ES基本概念介绍1.ES简介ES是一个分布式、可扩展的、近实时的数据搜索、分析与存储引擎。支持全文搜索、结构化搜索、半结构化搜索、数据分析、地理位置和对象间关联关系搜索等功能。其底层基于Lucene,但Lucene比较复杂,面向普通应用开发者而言,易用性不是很好,同时对于目前的主流分布式架构支持也不好,所以就诞生了ES。ES使用Java编写,它的内部使用Lucene做索引与搜索,隐藏了Lucene的复杂性,面向开发者暴露了一套即使是不同编程语言也基本一致的API和client,方便大家将搜索功能

2021-09-09 11:56:36 4789

原创 java中String.intern的坑

空闲时间,一个好友发过来一段代码很有意思,运行的结果比较诡异,代码很简单,三两行,详细如下:StringBuilder sb = new StringBuilder();String str = sb.append("a").toString();System.out.println(str.intern() == str);执行代码,输出结果为false,还可以接受,不过再换下面这...

2018-08-28 11:52:48 1584

原创 linux awk命令介绍

通常来说 我们使用grep即可满足我们大多数的需求了,但是还是有一些情况,grep是解决不了问题的,如我们的日志中有服务的响应时间,想过滤出响应时间超过200ms掉日志,这时候用grep就很难做到了。所以,很多时候我们还会使用到awk命令,awk命令是一个功能十分强大的命令,学会awk命令对我们解决问题有很大帮助。说到这里可能有人会想到sed命令,sed命令常常作用于一整行的处理,awk则比较倾向...

2018-06-02 13:38:24 1909 1

原创 linux正则表达式

正则表达式在linux中是非常重要的一环,很多时候我们需要通过正则表达式来达到我们的目的,如分析日志,过滤数据等。有过开发经验的同学都会和grep打交道,我们处理问题最常用的方法就是查看日志,那么多日志我们不可能一行一行看,所以我们通常会使用grep命令+正则表达式获取我们想要的数据,常见的如异常信息。一.grep命令基本介绍学习正则表达式之前还是简单介绍下grep命令,grep命令后面可以接 -...

2018-06-02 13:33:36 261

原创 shell学习指南

shell脚本是我们开发中经常需要用到的技能之一,我们经常在线上服务器执行脚本,比如服务启动脚本,所以掌握shell也是我们必备技能之一。下面先介绍下学习shell脚本之前一些需要了解的知识。一.shell下的变量变量对于程序员来说一定不会陌生,java中变量的使用频率也是非常高的。不过shell下的变量却有一些特殊的设置规则,下面来了解下。我们可以使用echo命令来显示变量,但是变量在被显示时,...

2018-05-19 23:16:35 211

原创 linux必会命令

我们线上机器都是linux系统,所以linux命令是我们必备技能之一。这里会梳理下我们日常开发中必备或者常用的命令,对linux命令做一个简单的汇总及介绍。一.文件权限相关使用背景之前我认为我们平时不会用到权限相关命令,直到一次一个其他组的同学需要读取我们一个目录下的日志信息,当时的权限对于其他用户是不可读的,所以有时候我们会需要使用权限相关命令。常见命令:1.chmod 改变文件的权限 使用如下...

2018-05-19 21:35:31 1095

原创 HttpServletRequest读取数据body为空的问题

最近新换了一个工作,节奏刚刚调整过来,这段时间没有写东西,有点惭愧,后续还是要回归正确的节奏,争取一周至少一篇。本篇记录下新工作中第一次上线踩到的一个坑,这个坑如果之前没有踩过,真的很难发现,在此记录一下,提醒下其他人避免重复犯错。问题背景本次需求有一项需要区分压测来源的数据,将压测的日志单独区分,不要打到线上正常日志中。这里比较简单,从request的header或者parameter中获取下压...

2018-04-18 23:42:54 11187 1

原创 排序算法之快速排序

快速排序可能是目前使用最广泛的排序算法了。快速排序流行的原因是它实现简单,适用于各种不同的输入数据且在一般应用中都要比其他排序算法快得多。快速排序的优点包括它是原地排序的,且将长度为N的数组排序所需时间和NlogN成正比。另外,快速排序的内循环比大多数排序算法都要短,这意味着无论是理论上还是实际上,快速排序都很快。基本算法快速排序是一种基于分治思想的排序算法。它将一个数组分成两个子数组,将两部分独...

2018-02-26 15:07:10 204

原创 排序算法之归并排序

归并排序是排序算法中比较常用的排序算法,Java里Collections.sort排序方法内部实现在一定场景下就是使用归并排序来实现的。归并排序的核心思想是我们常说的分而治之,是分治的典型应用。归并排序的基本思想是:要将一个数组进行排序,可以先将它递归的分成两半数组分别排序,然后将结果归并起来。归并排序最吸引人的性质是它能够将任意长度为N的数组排序所需时间和NlogN成正比,它的主要缺点是需要的空...

2018-02-26 14:50:08 312

原创 基础排序算法学习

在一次面试之后,觉得自己的算法能力还是偏弱,虽然常用的排序,查找算法都比较熟悉,不过面试的时候问了一个算法题,思路跑偏了没答上来,题的内容是找出一个字符串中有多少回文子串,还是比较有难度的。接下来的一段时间,想加强一下自己的算法能力,弥补下自己的不足,也希望这一段时间的算法学习会比较有收获,最后的目标是算法的灵活使用,能通过算法解决实际问题最好。先从排序算法开始学习一.选择排序选择排序在排序算法中...

2018-02-12 16:41:53 161

转载 Redis实现分布式锁

前言分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。可靠性首先,为了确保分布式锁可用,我们至少要确保

2018-01-30 21:30:33 140

原创 Redis的事务详解

Redis通过multi,exec,watch命令来实现事务的功能。事务提供了一种将多个命令请求打包,然后一次性,按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求。下面来看看Redis中事务的实现原理。一.事务的实现一个事务从开始到结束会经历三个阶段:事务开始,命令入队,事务执行。1.事务开始Redis提供multi命令标志着事务的开

2018-01-08 22:11:00 213

原创 Redis复制实现原理

我们可以通过Redis提供的slaveof命令让一个服务器去复制另一个服务器,我们成被复制的服务器为主服务器,进行复制的服务器称为从服务器。那么Redis是如何实现服务器复制的呢?主从服务器之间如何保持数据一致性的呢?一.Redis复制功能的实现Redis的复制功能分为同步和命令传播,同步用于将从服务器的数据库状态更新至主服务器当前数据库状态;命令传播用于主服务器状态修改时,传播命令到从服

2018-01-08 22:10:31 287

原创 Redis中的事件机制

Redis服务器是一个事件驱动程序,服务器需要处理两类事件:文件事件和时间事件。文件事件主要指客户端向服务器发送命令,如连接命令,读命令以及写命令等。时间事件指的是定时执行的任务,如serverCron函数。一.文件事件Redis基于Reactor模式开发了自己的网络时间处理器,称为文件事件处理器。文件事件处理器使用I/O多路复用程序同时监听多个套接字,并根据套接字目前执行的任务为套接字关

2018-01-08 22:09:48 1021

原创 Redis的AOF持久化详解

Redis提供了AOF持久化功能,大多数情况下,AOF持久化的频率要比RDB持久化执行频率更高,所以AOF持久化记录的数据要比RDB文件记录的数据更新一些。AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。一.AOF持久化的实现AOF持久化功能的实现可以分为命令追加,文件写入,文件同步三个步骤。1.命令追加当AOF持久化功能处于打开状态时,服务器在执行完一个写

2018-01-07 21:33:26 487

原创 Redis的RDB持久化详解

我们知道Redis的数据是存在内存中的,那么就会有一个问题,如果突然宕机了或者故障了,Redis的数据就会全部消失了,为了不让数据丢失,我们需要将数据写到磁盘文件里面,这样当机器回复时可以还原数据,RDB就是Redis持久化的方法之一。RDB持久化既可以手动执行,也可以根据服务器配置自动执行。RDB持久化功能生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成的RDB文件时的数据

2018-01-07 21:32:53 420

原创 Redis数据库的实现原理

知道了Redis的各种数据结构,对象结构,那么Redis是如何保存数据的,又是如何操作数据的呢,Redis里面的命令是怎么实现的呢?这一系列问题值得我们思考一.Redis维护多个数据库Redis内部维护一个db数组,每个db都是一个数据库,默认情况下Redis会创建16个数据库。我们可以通过select命令来切换数据库,如select 1切换到数据库号为1的数据库。select实现是通过修

2018-01-07 21:32:09 5989

原创 Redis中的对象详解

上文介绍了Redis底层的几个数据结构,接下来可以看看Redis中的字符串,链表,集合,哈希表,有序集合是怎么实现的了,这几种类型的对象都用了之前介绍的至少一种数据结构。Redis通过定义这五种不同类型的对象,可以在执行命令之前,根据对象的类型判断一个对象是否可以执行给定的命令。下面我们看下Redis中对象的结构Redis对象主要包括type属性(说明对象是五种中的哪种类型),encodi

2018-01-07 21:31:24 428

原创 Redis底层数据结构详解

我们知道Redis提供了五种数据结构:字符串,链表,集合,哈希表,有序集合这五种结构,并提供了各自的api接口供我们操作。虽然我们经常使用Redis提供的各种api,但是我们很少知道Redis底层是如何实现这几种结构的,接下来一起看下Redis底层的几种数据结构,这几种数据结构在很多Redis核心功能上随处可见。一.简单动态字符串Redis底层使用C语言编写,所以大多数人都会以为Redis

2018-01-07 21:30:44 2050

原创 系统过载保护机制

最近我们组自己开发了一个过载保护服务,用来解决服务或者站点过载导致系统雪崩的问题,最近看了下底层实现,还是很有参考意义的,接下来介绍下过载保护的功能和原理。一.过载保护的作用我们这里开发的过载保护的主要目的是:避免服务中的某个接口调用堆积导致的整个服务不可用,这里调用堆积的原因可能有两个1.某个接口的访问量突然增大,达到了平时高峰调用量的几倍乃至几十倍。产生的原因可能为产品加了个类似于

2018-01-06 17:44:58 2373

转载 Java终止线程池的原理

Java终止线程池的实现原理终止线程池主要有两个方法:shutdown() 和 shutdownNow()。    shutdown()后线程池将变成shutdown状态,此时不接收新任务,但会处理完正在运行的 和 在阻塞队列中等待处理的任务。    shutdownNow()后线

2017-12-09 17:54:25 521

转载 Java线程池原码分析

Java线程池的实现原理分析execute()是 java.util.concurrent.Executor接口中唯一的方法,JDK注释中的描述是“在未来的某一时刻执行命令command”,即向线程池中提交任务,在未来某个时刻执行,提交的任务必须实现Runnable接口,该提交方式不能获取返回值。下面是对

2017-12-09 17:52:29 207

转载 Java线程池的基本原理

Java线程池的实现原理分析最近读了下线程池的源码(jdk1.7版本),学习了线程池的实现原理,感觉很有帮助,本想自己写一篇文章介绍下源码,但是看到这个系列的源码分析的真心好,所以就转载了.......以下是原文内容:线程池是可以控制线程创建、释放,并通过某种策略尝试复用线程去执行任务的一种管

2017-12-09 17:46:22 186

原创 虚拟机类加载器

在虚拟机中,有一个重要的角色,承担了字节码加载阶段的工作,它就是ClassLoader,类加载器。类加载器的主要作用使从外部系统获得Class二进制数据流,下面一起了解下类加载器的原理以及类加载器是如何把字节码加载到虚拟机的。一.认识ClassLoaderClassLoader是Java的核心组件,所有的class都是由ClassLoader进行加载的,ClassLoader负责通过各种方

2017-11-26 11:52:30 242

原创 虚拟机类加载机制

我们知道虚拟机的主要功能之一是执行字节码文件,那么字节码从二进制数据到可运行的Java实例,这中间都经过了哪些步骤呢?我们来一起了解下Java的类加载机制一.Class文件的装载流程系统装载Class类型可以分为:加载,连接,初始化三个步骤,其中,连接以后可以分为验证,准备,解析三步。1.类装载的条件什么情况下需要开始类加载过程的第一个阶段:加载?虚拟机规范中并没有进行强制约束,这

2017-11-26 11:51:58 153

原创 锁与并发

我们在开发中为了保证多线程环境下程序正常运行,经常会与锁打交道。随着锁使用的越来越频繁,虚拟机也在锁的实现上做了很多优化,接下来我们了解下虚拟机对锁都做了哪些优化。一.锁的基本概念和实现锁是多线程开发的重要工具,基本作用使保护临界区资源不会同时被多个线程访问而受到破坏。通过锁,可以让多个线程排队,顺序访问临界区的对象,使对象的状态总是保持一致,这就是锁的作用。1.对象头和锁在虚拟机

2017-11-26 11:51:20 205

原创 Java垃圾回收机制详解

Java拥有一套成熟的垃圾回收机制,这让我们在开发中不用像C/C++语言那样手动释放内存,担心程序没有释放内存引起内存溢出问题,所以说Java垃圾回收机制帮助我们做了很多事情,让我们可以更专心于业务实现。既然Java垃圾回收机制可以自动回收对象,我们还关心垃圾回收机制有什么意义呢?JVM已经帮我们做的够多的了呀。其实,即使有垃圾回收机制,Java还是会存在内存溢出的情况,如果不了解垃圾回收机制,那

2017-11-19 21:13:14 255

原创 常用Java虚拟机参数

一.跟踪调试参数1.跟踪垃圾回收日志-XX:+PrintGC 这个参数是用来打印虚拟机垃圾回收日志的参数,使用这个参数启动Java虚拟机后,只要遇到GC就会打印日志,如下所示:[GC 4112K->1700K(10240K), 0.0020904 secs]表示在GC前,堆内存使用量约为4MB,GC后,堆空间使用量为1700KB,当前可用的堆空间总和10M。最后显示的是本次GC所花

2017-11-19 21:12:39 780

原创 HotSpot虚拟机对象探秘

一.对象的创建通常我们会使用new关键字创建一个Java对象,那么对象的创建是个什么样的过程呢?虚拟机在遇到一条new指令时,会先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载,解析和初始化过。如果没有,就必须先执行类加载过程。类加载检查通过后,虚拟机将为新生对象分配内存。对象所需内存大小在类加载完成后便可完全确定,为对象分配空间的任务等

2017-11-19 21:12:02 223

原创 Java虚拟机的基本结构

一.Java虚拟机介绍所谓虚拟机,就是一台虚拟的计算机,它是一款软件,用来执行一些列虚拟计算机指令。虚拟机是Java跨平台特性的主要原因,通过将程序变异成虚拟机识别的字节码,从而达到一次编译到处运行的目的。Java虚拟机是一台执行Java字节码的虚拟计算机,拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成,像Groovy,Scala等语言生成的Java字节码也可以由J

2017-11-19 21:11:16 294

转载 String类为什么要设计成不可变的

这是一个老生常谈的话题(This is an old yet still popular question). 在Java中将String设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内存,同步,数据结构以及安全等方面的考虑. 在下文中,我将为各种原因做一个小结。

2017-10-22 10:55:21 571

原创 String.indexOf源码分析

最近看了下String的一些源码,觉得indexOf(String str)这个方法有点意思,这个方法的功能是找到当前字符串中第一次出现str的位置,返回int表示位置。试想一下,如果不看源码,我们自己实现一个这样的方法,我们会怎么做呢?先说下我的思路:1.遍历当前字符串,找到当前字符串中和str字符串第一个字符相同的字符,比如当前字符串为"abcdabcdefg",str为"def",那

2017-10-22 10:43:12 7294 2

原创 synchronized和ReentrantLock的区别

重入锁可以说是synchronized的替代品甚至可以说是增强版,重入锁可以完全替代synchronized关键字。看到网上有很多重入锁的性能远远好于synchronized的说法,事实上,在JDK5.0以前的确这样,但从JDK6.0开始,JDK在synchronized做了大量的优化,使得两者的性能差距并不大。1.重入锁的灵活性更好与synchronized相比,重入锁有着现实的操作过程

2017-10-21 18:00:20 1593

原创 高可用的服务设计

可复用的服务模块为业务产品提供基础公共服务,大型网站中这些服务通常都独立分布式部署,被具体应用远程调用。可复用的服务和应用一样,也是无状态的服务,因此可以使用类似负载均衡的失效转移策略实现高可用的服务。除此之外,具体实践中,还有以下几点高可用的服务策略:一.分级管理分级管理意思是,对核心服务和非核心服务进行分级,核心服务部署在更好的硬件上,同时在服务部署上进行必要的隔离,避免故障的连锁

2017-10-15 10:35:39 589

原创 应用服务器集群的Session管理

应用服务器的高可用架构设计主要基于服务无状态这一特性,但是事实上,业务总是有状态的,在交易类的电子商务网站,需要有购物车记录用户的购买信息,用户每次购买请求都是向购物车中增加商品,在社交类的网站中,需要记录用户的当前登录状态,最新发布的消息及好友状态等,用户每次刷新页面都需要更新这些消息。Web应用中将这些多次请求修改使用的上线文对象称为会话(Session),单机情况下,Session可由部

2017-10-15 10:35:09 247

原创 提高网站性能的常见方法

一.Web前端性能优化一般来说Web前端指网站业务逻辑之前的部分,包括浏览器加载,网站视图模型,图片服务,CDN服务等,主要优化手段有优化浏览器访问,使用反向代理,CDN等。1..浏览器访问优化(1)减少http请求HTTP协议是无状态的应用层协议,意味着每次HTTP请求都需要简历通信链路,进行数据传输,而在服务器端,每个HTTP都需要启动独立的线程去处理,这些通信和服务的开销都很

2017-10-15 10:34:22 9088

原创 大型网站架构模式

为了解决大型网站面临的高并发访问,海量数据处理,高可靠运行等一系列问题和挑战,大型互联网公司在实践中提出来许多解决方案,以实现网站高性能,高可用,易伸缩,可扩展,安全等技术架构目标。一.分层分层是企业应用系统中最常见的一种架构模式,分层将系统在横向维度上切分成几个部分,每个部分负责一部分相对比较单一的职责,然后通过上层对下层的依赖和调用组成一个完整的系统。大型网站架构将网站软件系统分为

2017-10-15 10:33:39 267

原创 大型网站架构演化

一.大型网站系统的特点与传统企业应用系统相比,大型互联网应用系统有以下特点:1.高并发,高流量:需要面对高并发用户,大流量访问。2.高可用:系统7*24小时不间断服务。3.海量数据:需要存储管理海量数据,需要使用大量服务器。4.用户分布广泛,网络情况复杂:用户分布范围广,各地网络情况千差万别。5.安全环境恶劣:每天都会被黑客攻击。6.需求快速变更,发布频繁:为了满足用户

2017-10-15 10:26:53 223

原创 重构代码总结

一.代码的坏味道1.重复代码书中将"重复代码"作为代码的坏味道第一点,足以说明"重复代码"的危害。“坏味道行列中首当其冲的就是重复代码”。最单纯的重复代码就是“同一个类的两个函数含有相同的表达式”。这时候你需要使用提炼函数提炼出重复的代码,然后让这两个地点都调用被提炼出来的那一段代码。2.过长函数拥有短函数的对象会获得比较好,比较长。“程序越长越难以理解”,你应该积极地分解函数。我

2017-10-09 10:41:41 411

原创 重构之简化函数调用

一.函数改名函数的名称未能揭示函数的用途,修改函数的名称。我极力提倡的一种编程风格就是:将复杂的处理过程分解成小函数。但是,如果做得不好,这会使你费尽周折却弄不清楚这些小函数各自的用途。要避免这种麻烦,关键就在于给函数起一个好名称。函数的名称应该准确表达它的用途。给函数命名有一个好办法,首先考虑应该给这个函数协商一句怎样的注释,然后再想办法将注释变成函数名称。生活就是如此。你常常无法第

2017-08-28 11:38:22 371

空空如也

空空如也

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

TA关注的人

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