自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 资源 (2)
  • 收藏
  • 关注

原创 【FastDFS】一文学会一个分布式文件系统!

当系统模块逐渐增多,有时候需要拆分模块单独做成一个服务,或者直接微服务架构,这是我们可能需要将图片、音频、视频等文件单独作为一个文件服务,fastdfs就是这样一个文件系统!

2022-06-26 18:34:13 268 1

原创 分布式配置中心之Apollo实战

为什么要有分布式配置中心?微服务架构下,服务的数量视项目的规模大小而定,但数量肯定最少有十几二十个,这些微服务有时候共用一些配置,修改一个配置,这诸多服务都要跟着一起改。任务繁多,而且容易出错。分布式分配置中心将多个服务的配置集中在一处进行管理,统一修改,实时生效,节约时间的同时还降低出错率。这篇文章和大家一起探讨下一款配置管理软件:Apollo。Apollo简介关于Apollo的简介,人家自己官网的介绍就是最权威的:Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用

2021-06-14 19:54:55 584 2

原创 关于MySQL主从复制的数据同步延迟问题

关于MySQL主从复制的原理及环境搭建,在我之前的文章中有述:MySQL高可用之主从复制这种主从复制环境在单机应用的时候没有问题,但是在实际的生产环境中,会存在复制延迟的问题。查看从库同步状态在从库中执行 show slave status\G:mysql> show slave status\G*************************** 1. row *************************** Slave_IO_State: Wai

2021-06-11 12:10:52 560 3

原创 还有比Redis更骚的分布式锁的实现方式吗?有,etcd!

分布式锁关于为什么要有分布式锁这个东西,欢迎阅读我的zk分布式锁的实现,介绍了单机高并发、分布式高并发的解决方案:用ZooKeeper实现分布式锁这里再切入本例将使用的场景模拟:商品秒杀,或者说高并发下,对于商品库存扣减操作。我用一个SpringBoot小项目模拟一下该操作。本例用到的技术栈:SpringBootRedisetcd在正式肝代码之前,先来对etcd分布式锁实现的机制和原理做一个了解。etcd分布式锁实现的基础机制Lease机制租约机制(TTL,Time To Live

2020-10-24 12:11:32 243

原创 【优雅的避坑】不安全!别再共享SimpleDateFormat变量了

0x01 开场白JDK文档中已经明确表明了SimpleDateFormat不应该用在多线程场景中:SynchronizationDate formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized external

2020-10-22 17:46:23 379

原创 【优雅的避坑】避免HashMap扩容的正确姿势

设置HashMap的初始容量设置HashMap的初始容量只是优化的开始。HashMap在Java的使用中占据着很重要的地位,平时使用的时候,相信很多Java程序员都知道在定义HashMap的时候,给它设置一个初始容量,以便减少hashMap扩容(resize)带来的额外开销,比如像我同(zi)事(ji)的这段代码:@Testpublic void longLongAGo() { int count = 1000000; System.out.println("---------

2020-10-15 23:38:22 1860 1

原创 【优雅的避坑】你的钱算错了!为什么0.1+0.2不等于0.3了!?

问题初现我碰到过这样一个问题,对项目上用车记录中的用车里程、油耗、计价等数据进行计算,有一辆车花费了108.1元,还有一辆车的花费是29.2元,当计算这两个价格的和时出问题了,结果竟然不是137.3,而是137.29999999999998!@Testpublic void test() { Double d = 108.1; Double dd = 29.2; System.out.println("108.1 + 29.2 = " + (d + dd));}结果:1

2020-10-14 09:09:46 379 2

原创 手摸手助你从零开始搭建etcd集群

之前我整过关于zookeeper集群、zookeeper分布式锁的实现的文章,分布式锁的实现还有基于etcd的,基于redis的,基于MySQL的等,后面会完成这一些列的知识分享。今天从etcd集群的搭建开始切入。计划从VMware安装CentOS虚拟机开始,先创建一个模板机,后续搭建redis集群、etcd集群等各种需要创建虚拟机的时候,直接克隆模板机。因此,我们先搞一个模板机,并对其进行一个简单的优化,比如安装基础软件vim,wget,net-tools等,还有比较重要的配置网络信息。VMwa.

2020-10-13 21:57:46 294

原创 【优雅的避坑】从验证码生成代码的优化到JVM栈和堆

验证码功能实际业务中用验证码进行登录、注册等场景非常普遍,基本上现在的应用都会有这个功能,Java中已为我们提供了Math.random()以及Random类。Math.random():public static double random()返回大于或等于0.0且小于1.0的double类型的整数。返回值的选择是伪随机的,在这个范围内(近似)均匀分布。Random类:public class Randomextends Objectimplements Serializable

2020-09-30 17:37:46 209

原创 【优雅的避坑】不要轻易使用==比较两个Integer的值

引入没有前戏,直奔代码,来看下面这段代码的运行结果:@Testpublic void test() { Integer i = 666; int j = i + 1; System.out.println("j = " + j);}自然,我们都知道会打印 j = 667,曾经我很好奇,i是Integer对象,属于包装类型,而j是int基础数据类型,他俩怎么会在一起运算呢?直到我扒开Integer的外表,直接看到了他的内涵…当然我是借助于工具看到程序运行的内涵的,IDE

2020-09-30 17:10:07 302

原创 【设计模式】详解访问者(Visitor)模式-有多段代码出没

前方有多段代码出没,祝您理解访问者模式...

2020-09-29 22:23:01 355

原创 【设计模式】Prototype原型模式-一段关于对象拷贝的故事

原型模式原型(Prototype)模式的定义:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。比如,用过VMware安装过虚拟机的可能知道,我们可以先安装一个模板机,然后通过克隆模板机创建出很多虚拟机出来,这种采用复制的方法大大提升了效率。再比如,群发消息的场景,我们希望群发出去的东西title随着发送对象的不同而改变,这时可以构造出一个消息对象,群发复制这个对象,然后title进行个性化定制。用消息

2020-09-27 22:05:01 230

原创 多图养眼!Partition,荷兰国旗问题与随机快排

快速排序的思想是通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归方式实现,以此达到整个数据变成有序序列。在实现快速排序之前,先了解:Partition荷兰国旗问题这两个问题,将有助于我们实现快速排序算法。PartitionPartition的过程:给定一个数组arr,和一个整数num。把小于等于num的数放在数组的左边,大于num的数放在数组的右边。比如数组int[] a.

2020-09-27 18:42:25 228

原创 一文精通ZooKeeper分布式锁,都是干货!

什么是分布式锁一个很典型的秒杀场景,或者说并发量非常高的场景下,对商品库存的操作,我用一个SpringBoot小项目模拟一下。用到的知识架构:SpringBootRedisZooKeeper我提前将库存stock放在redis,初始值为288:127.0.0.1:6379> set stock 288OK127.0.0.1:6379> get stock"288"扣减库存的api:@RequestMapping("/v1/reduce")public String

2020-09-18 21:10:13 301

原创 用ZooKeeper实现分布式配置中心 微服务注册发现

ZooKeeper集群主要是帮我们做分布式协调的,今天我们用zk实现分布式配置。引入zk jar包<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.2</version></dependency>这里zk的jar包版本一定要和你自己zk serv

2020-09-16 20:41:31 410

原创 排序算法-归并排序的实现与时间复杂度分析

归并排序归并排序是分而治之的排序算法。划分步骤很简单:将当前数组分成两半(如果N是偶数,则将其完全平等,或者如果N是奇数,则一边稍大于一个元素),然后递归地对这两半进行排序。递归写法归并排序递归写法的思想是,设定一个函数,函数实现的目的是让int[] arr在L ~ R位置上有序,处理过程是从L ~ R上找一个中间位置M,递归调用该函数,让int[] arr的L ~ M上有序,M+1 ~ R上有序,每一次不能往下递归了,便调用归并的方法将左右两边的数组合并成一个数组,到最后整个数组便有序了。因此,

2020-09-15 08:25:30 2812

原创 分布式高可用的ZooKeeper集群搭建与基本操作

ZooKeeper介绍ZooKeeper是一个为分布式应用提供的分布式、开源的协调服务。它公开了一组简单的原语,分布式应用程序可以根据这些原语来实现用于同步、配置维护以及组和命名的更高级别的服务。怎么理解协调服务呢?比如我们有很多应用程序,他们之间都需要读写维护一个id,那么这些id怎么命名呢,程序一多,必然会乱套,ZooKeeper能协调这些服务,解决命名、配置、同步等问题,而做到这些,只需要一组简单的原语即可:create : 在树中的某个位置创建一个节点delete : 删除一个节点e

2020-09-14 22:45:26 267

原创 还在手动维护API文档吗?是时候用用丝袜哥(swagger)了!

在现在微服务满天飘的年代,一个稍微大点的项目就可能有10几个服务,每个服务会产生很多API互相调用,如果没有一个自动生成API文档的工具,那就有的搞了!Swagger是一个简单但功能强大的API表达工具。它具有地球上最大的API工具生态系统,数以千计的开发人员,使用几乎所有的现代编程语言,都在支持和使用Swagger。使用Swagger生成API,我们可以得到交互式文档,自动生成代码的SDK以及API的发现特性等。来体验一把吧!Swagger使用swagger能帮我们生成API文档,那么它会生.

2020-09-11 23:30:33 380

原创 记一次线上调优:我用线程池ThreadPoolExecutor处理任务和Redis做缓存查询,将程序效率提升了5倍!

痛苦的源头我们线上有个小程序,主要用来实时查询某省所有地市上报的一些信息,这些信息在后台,每5分钟推送一次Excel文件到我们的Kafka服务,这些信息就存储在Excel文件中。我要做的是,监听Kafka消息,得到Excel文件后,处理16个地市的消息,并将结果存储为图片(比较耗时),处理完之后,提供给小程序查询。为了追求开发速度,我直接按照地市顺序解析了Excel,截图,将图片url以及一些相关信息存储在MySQL数据库。但是,问题出现了:虽然勉强能够保证大部分时候5分钟内能处理完16个地市的

2020-09-08 12:10:30 696

原创 终于看懂别人的代码了!总结Java 8之Lambda表达式的写法套路

引入相信现在搞Java的童鞋都知道启动一个线程可以这样写:Thread t = new Thread(() -> System.out.println("Hello"));t.start();Thread里面需要传的是一个Runnable接口,为什么我们可以直接一个括号(),加上->,然后直接sout呢?这得益于Java 8引入的新特性:Lambda表达式。如果没有Lambda表达式的写法,我们需要老老实的这么写:Thread t1 = new Thread(new Runnab

2020-08-29 17:35:53 447

原创 IDEA中gradle项目启动报错 java.lang.NoClassDefFoundError DefaultConvention解决

在Idea中创建gradle项目编译时报错:详细报错信息为:java.lang.NoClassDefFoundError: org/gradle/api/internal/plugins/DefaultConvention at org.jetbrains.plugins.gradle.tooling.builder.ProjectExtensionsDataBuilderImpl.buildAll(ProjectExtensionsDataBuilderImpl.groovy:50) at or

2020-08-28 18:06:06 8124

原创 Java8新特性Stream还有这种操作?

Java 8新特性之一Stream的官方描述:Classes in the new java.util.stream package provide a Stream API to support functional-style operations on streams of elements.The Stream API is integrated into the Collections API, which enables bulk operations on collections, su

2020-08-28 09:39:18 727 1

原创 从一道面试题进入Java并发新机制---J.U.C

什么是J.U.C?它是Java java.util.concurrent包的缩写,从包的名称就可以看出,它应该主要提供一些线程同步的类。这个包下面的类提供了多种实现线程同步的方式,还有诸如Executor、Callable、Future、ExecutorService等耳熟能详的接口。本着天天向上的原则,非常有必要学习它。一道面试题实现一个容器,提供两个方法add,size,实现两个线程:线程1,向容器中添加10个元素到容器中;线程2,实时监控容器元素个数,当元素个数到5个时,线程2给出提.

2020-08-27 23:58:27 145

原创 synchronized底层实现知多少?synchronized加锁还会升级?

还记得当初我们刚接触Java或者刚写Java代码时怎么处理多线程访问共享数据的吗?加锁synchronized。但是,why?为什么加了synchronized就能保证共享数据一致了呢?带着这样的疑问,我们来深入底层探究一下synchronized的实现原理。synchronized实现细节Java代码实现我们先来了看下如果多线程间竞争共享资源,不采取措施会出现什么情况:public class TestSync implements Runnable { private int c.

2020-08-26 17:04:37 244

转载 Java 动态调试技术原理及实践

作者:胡健 美团到店餐饮研发中心研发工程师原文链接:https://tech.meituan.com/2019/11/07/java-dynamic-debugging-technology.html断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径。但断点调试会在断点位置停顿,使得整个应用停止响应。在线上停顿应用是致命的,动态调试技术给了我们创造新的调试模式的想象空间。本文将研究Java语言中的动态调试技术,首先概括Java动态调试所涉及的技术基础,.

2020-08-24 17:26:31 377

原创 你知道Object o = new Object()在内存中占多少字节吗?

如何知道一个对象在内存中的大小呢?C语言有个叫sizeOf的东西,很方便就能知道对象大小。但是Java没有这样的东西啊,不慌,Java本身有一个Agent技术。Java Agent技术Agent是个什么机制呢?有一个jvm虚拟机,还有一个class要load到内存,在load内存的过程中可以加一个Agent代理,这个代理可以截获这些class文件(001 010等二进制码),并可以对他做任意修改,当然也就可以读取到整个Object的大小。制作一个探测Object大小的Agent新建一个项目.

2020-08-24 09:17:39 786

原创 Elasticsearch Java API之增删改查

在基本了解并在Kibana Dev Tools控制台操作Elasticsearch的查询语法之后,是时候在实际应用中使用ES了。那么怎么在Java中使用ES呢?可以有下面几种方式来实现:Transport ClientJava High Level REST ClientSpring Data ElasticsearchTransportClient可用于老版本的Elasticsearch;新版本建议使用Java High Level REST Client(向下兼容);当然还可以使用Sp.

2020-08-23 10:22:59 448

原创 【设计模式】1分钟整明白什么是Builder建造者模式

建造者模式(Builder Pattern)也叫做生成器模式,其定义:Separate the construction of a complex object from its representation so that the sameconstruction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)

2020-08-21 22:20:12 549

原创 Elasticsearch初体验-创建Index,Document以及常见的ES查询

Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。

2020-08-21 08:54:07 1385

原创 使用source导入MySQL出现“ERROR: Failed to open file xx, error: 2“问题的解决

我在Linux系统里成功导入过sakila数据库,但在Windows系统使用如下方法导入数据,报ERROR: Failed to open file 'D:\works\学习\素材\MySQL\sakila-db\sakila-schema.sql', error: 2错误:mysql> source D:\works\学习\素材\MySQL\sakila-db\sakila-schema.sqlERROR:Failed to open file 'D:\works\学习\素材\MySQL

2020-08-20 15:45:39 4182 3

原创 MySQL调优之查询优化

实际工作中,有时候打开一个页面响应时间非常慢,这背后通常牵涉到SQL语句查询慢的问题。前面我们提到很多数据库结构设计,建索引等来视图提高MySQL的性能。但是如果我们实际业务场景中,SQL查询语句写的不合适,索引建的再好可能也达不到预期的高性能。因此,我们很有必要对查询进行分析,我写的查询为什么慢,该怎么样对查询进行优化。查询慢的原因一般情况下,查询可以看成按如下顺序执行任务:由客户端向服务端发起查询请求,然后在服务器端进行解析,生成执行计划,执行,最后将结果返回给客户端。在完成上述查询任务.

2020-08-19 09:51:24 488

原创 MySQL通过索引优化-这里可能有你不知道的索引优化细节(二)

MySQL索引优化细节

2020-08-18 09:04:00 304 1

原创 MySQL通过索引优化-这里可能有你不知道的索引优化细节(一)

MySQL都有哪些索引?通过索引优化有哪些细节?

2020-08-17 00:00:04 475

原创 【设计模式】Observer 观察者模式浅析

观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是一个在项目中经常使用的模式。

2020-08-16 10:53:05 185

原创 【设计模式】责任链模式-号称倒数第二难的设计模式终于搞明白了

引入汽车生产过程中,必然要对汽车的各个部件,比如发动机、变速箱、车身等等进行严格的质量检查,对不合格的部件进行过滤。过滤检查汽车部件一般情况下,我们这样写就能实现了:public class Client { public static void main(String[] args) { Client client = new Client(); Request req = new Request(); req.setReqMsg("检

2020-08-13 09:42:09 158

原创 【设计模式】慎用多层继承,不妨试试装饰器模式

引入玩过足球模拟经营类游戏的朋友,应该了解如何管理球队。其中对球队球员的转会,买入卖出尤其重要。我们来模拟一下这个场景,球队经理Manager需要对球队需要的各类球员进行管理,其中的一环是要分析球员转会市场价,假设不同类型的球员转会费是不同的。我们抽象出一个运动员出来,运动员有各自的计算转会费TransferFee的方法;其中足球运动员继承运动员。开始球队经理想要了解足球运动员的市场价格情况,这一场景我们可以通过如下类图表示:public class Player { publi

2020-08-12 12:05:49 336

原创 MySQL优化必备之执行计划explain,索引基本知识,索引数据结构推演

准备工作兵马未动粮草先行,为了解释理论,先建好数据库表,演示用的MySQL表,建表语句我导出来了。CREATE TABLE `emp` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `empno` int(11) DEFAULT NULL COMMENT '雇员工号', `ename` varchar(255) DEFAULT NULL COMMENT '雇员姓名', `job` varchar(255) DEFAULT N

2020-08-11 19:39:04 211

原创 将优化考虑在最前面-MySQL数据库设计优化:范式与反范式,主键,字符集,存储引擎

前言优化这东西,应该是在设计没有什么毛病的基础上进行的。对一个项目,如果数据库设计这一块有很大问题,这导致后面扩展需求的时候很难复用之前的数据库,而业务耦合性又很高,优化起来是一件相当痛苦的事情!如果在设计的时候就把该考虑的设计好,你可能会给后面的优化工作做了相当好的铺垫。关于数据库的设计,我来从范式、反范式、主键、字符集、存储引擎等方面总结一下。合理使用范式与反范式什么是范式?反范式?三范式第一范式 1NF每一列都是不可分割的原子数据项,确保数据表中每列(字段)的原子性。比

2020-08-09 21:20:58 98

原创 结合案例说明MySQL的数据类型如何优化

MySQL数据类型优化下面很多优化的点总结于《高性能MySQL》这本书,加上一些自己操作过的案例说明。不超过范围的情况下,数据类型越小越好应该尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期更少,但是要确保没有低估需要存储的值的范围,如果无法确认哪个数据类型,就选择你认为不会超过范围的最小类型。看一个案例,下面是两张字段相同,字段类型相同,只是id字段emp1是smallint类型,emp2的id是big

2020-08-09 11:06:52 131

原创 令人抓狂的IDEA环境下Maven编译打包问题

一般情况下,我们都会把本地maven的仓库下载镜像配置成国内的源,试图追求下载速度,然而有时候,在你的IDE里,用maven编译时,会出现这样那样的问题,比如这个:本地配置阿里云镜像,打包时出现from/to alimaven (http://maven.aliyun.com/nexus/content/groups/public/): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.

2020-08-08 23:40:42 478

ES&Kibana7.9.zip

windows下elasticsearch和kibana7.9版本的zip文件,解压开箱即用。从官网下载慢的老铁可以从这下。

2020-08-20

Bootstrap 用户界面与交互架构视频

Bootstrap学习视频之 Bootstrap 用户界面与交互架构 用户界面与交互架构

2018-03-12

空空如也

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

TA关注的人

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