自定义博客皮肤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)
  • 收藏
  • 关注

原创 解决Centos中文乱码问题

一、查看字符集查看当前系统默认采用的字符集locale二、查看系统当前字符集echo $LANG三、查看系统是否安装中文字符集locale -a |grep zh出现zh开头的,即为安装了中文字符集如未安装,需执行: yum -y groupinstall chinese-support执行过程中可能会出现问题No packages in any requested group available to install or update此时就可以cd /etc/yum.

2021-11-04 14:25:35 2148 1

原创 Mysql运行原理与优化

1、数据库连接池我们的java系统,要跟mysql打交道,就必须通过mysql驱动与数据库建立网络连接,才能发送请求到数据库。然后我们的java代码才能基于建立的连接去执行SQL语句。Mysql是基于数据库连接池机制实现多线程并发的使用数据库连接去执行SQL语句的。2、Mysql架构设计Mysql通过线程监听网络连接请求,读取并解析SQL语句;工作线程接收到SQL语句后,会转交给SQL接口去执行;SQL接口接收到SQL语句之后,会通过查询解析器按照既定的SQL语法规则对语句进行解析,解析成

2021-05-13 19:56:23 324

原创 怎么做好数据库的压测和监测

当我们手头有了一个可以使用的数据库之后,比较专业的做法是,对这个数据库进行一次较为基本的基准测试,而不是马上基于它进行系统开发。那么,什么叫压测呢?一、压测1、压测的定义所谓压测,就是基于一些工具模拟一个系统每秒发出一定数量的请求到数据库上去,观察它的CPU负载、磁盘IO负载、网络IO负载和内存负载等情况,测试出这个数据库在目前的机器配置下,大致的负载压力如何,性能表现如何,每秒最多可以处理多少请求。2、压测性能指标既然要压测,那我们应该测试哪些性能指标呢?QPS(Query Per Seco

2021-01-21 11:49:07 2935

原创 ElasticSearch IK分词器基于mysql实现热更新词库

当我们要更新IK分词器词库时,都要在扩展词典中手动添加新词,添加完成后都要重启es才能生效。更致命的是,es肯定是分布式的,可能有数百个节点,我们不能每次都一个一个节点上面去修改。所以我们要实现es不停机更新新词,通过修改ik分词器源码,然后手动支持从mysql中每隔一定时间,自动加载新的词库。1、下载源码下载地址:https://github.com/medcl/elasticsearch-analysis-ik/tree/v7.2.0IK分词器版本要和ES版本一样2、修改源码添加jdbc配置

2021-01-08 20:49:21 1469

原创 Docker搭建Centos集群

1、拉取镜像docker pull centos:centos72、查看镜像docker images3、运行容器这里我们运行三个Centos容器docker run --privileged -p 60001:22 --cap-add SYS_ADMIN --name mycentos1 -e container=docker -itd --restart=always centos:centos7 /usr/sbin/initdocker run --privileged -p 60

2020-12-10 18:30:58 897 1

原创 oracle 表空间扩容

查看表空间的名字及文件所在位置select tablespace_name, file_id, file_name, round(bytes / (1024 * 1024), 0) total_space from sys.dba_data_files order by tablespace_name;查询表空间使用情况select a.tablespace_name, a.bytes / 1024 / 1024 "sum M

2020-11-11 20:37:37 1417

原创 单例模式是最简单的设计模式?

    单例,顾名思义,只有一个对象实例。通过单例模式可以保证系统中,应⽤该模式的类只有⼀个对象实例。作为一种创建型设计模式,很多人说它是最简单的设计模式,真的是这样吗?使用场景业务系统全局只需要⼀个对象实例,⽐如发号器、redis连接对象等Spring IOC容器中的bean默认就是单例spring boot 中的controller、service、dao层中通过@autowire的依赖注⼊对象默认都是单例的分类懒汉:就是所谓的懒加载,延迟创建对象饿汉:与懒汉相反,提前创建对象实

2020-11-09 17:29:13 156

原创 你会写Spring Boot Starter吗

前面写了一篇AOP自定义注解实现接口请求日志记录,可以记录接口请求日志。但是如果其他项目也要实现这个功能的话,就需要把代码原原本本的拷贝一份,这样未免有点麻烦!但我们在使用别人写的某些功能的时候,只需要引入starter依赖就可以了。那么我们可不可以也把这个写成一个starter呢?创建maven项目在使用spring-boot-starter,会发现,有的项目名称是 XX-spring-boot-starter,有的是spring-boot-starter-XX,这个项目的名称有什么讲究呢?从sp

2020-10-29 21:04:25 182

原创 分表设计与实现

在开发过程中,往往会出现数据量过大而出现慢查询的情况。这时我们会考虑做一些优化工作,如代码逻辑和sql优化等等,但这些只能解决暂时的问题(也不一定能达到预期目标)。随着数据量进一步的增加,以后还是会查询缓慢的情况。这个时候就可以考虑做分库分表。。。此次我碰到的情况是,数据库某张表数据量达到了千万级别的情况,即使做了一些优化,还是达不到理想目标。由于系统查询数据时会携带开始时间和结束时间,我就可以在这两个参数上做文章(其他系统可以根据具体情况做分表设计,如id等),根据月份进行分表。数据迁移现在由于一张

2020-10-12 18:42:50 552

原创 反射配自定义注解才更香

最近在重构系统,需要转存旧数据。这里说一个简单的场景:旧系统中某些字段用的是1和0来标记的,新系统中需要用√和×来表示,所以要把旧数据转过来。由于字段比较多,如果对每个字段做判断,那无疑是一个体力活,不符合我们偷懒的原则,代码也会看着比较臃肿。我采用的是自定义注解+反射机制来做的。自定义注解/** * 这是一个反射标记注解 */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)@Documentedpublic @int

2020-09-28 16:18:16 222

原创 nginx端口转发+域名映射

前段时间在Centos7下成功搭建了apache文件服务器 → 时光隧道如上图,我只能通过IP+端口的方式来访问,现在我想提升一下逼格,通过自定义域名就可以访问,比如my.apache.com!说干就干!!!1、端口转发I、修改配置文件目前我要访问文件服务器,需要输入IP+端口,如果不想输端口(默认80端口),就要做80端口转8000端口。首先想到的是采用nginx做端口转发,可以通过在nginx.conf中添加配置(尽量不要改动里面的配置,出现错误很难察觉)vi /usr/local/ngi

2020-09-05 21:17:19 5913

原创 AOP自定义注解实现接口请求日志记录

在项目开发过程中,难免会碰到记录接口请求日志的需求,方便问题的跟踪与排查。对此,我们可以利用AOP自定义注解来实现。

2020-08-30 17:03:03 519

原创 Centos7搭建apache文件服务器

1、安装apache服务器yum install httpd2、启动httpd服务systemctl start httpd.service3、查看版本httpd -v4、修改端口httpd默认端口为80,为避免端口冲突,建议改端口vi /etc/httpd/conf/httpd.conf5、重启服务systemctl restart httpd.service6、访问页面ip:端口7、去掉欢迎页面删掉或重命名文件 /etc/httpd/conf.d/welcome

2020-08-21 18:53:42 932

原创 基于Jenkins+Docker实现自动化部署(二)

上接基于Jenkins+Docker实现自动化部署(一)上文说到通过改配置文件来添加容器端口映射

2020-08-09 18:15:02 380

原创 基于Jenkins+Docker实现自动化部署(一)

前言传统部署方式:开发完成——>项目打包——>上传服务器——>启动项目——>访问页面目标部署方式:开发完成——>提交代码——>访问页面无疑传统部署方式过程复杂,中间容易出错。我们的目标是采用Jenkins实现自动部署,我们开发完成之后,只需要提交代码到代码库,Jenkins就可以自动帮我们自动完成部署,省时省力!(偷懒的好借口)环境Linux服务器DockerGithub安装jenkins这里我采用docker来安装jenkinsdocker ru

2020-08-08 18:44:00 595

原创 win10安装jar包到本地maven仓库

有时在pom文件添加依赖导入jar包时,私服上没有,远程仓库也没有(懒得换远仓),这个时候可以先把jar包下载下来,再安装到本地仓库,然后上传到私服。1、安装jar包以ojdbc jar包为例,在aliyun远程仓库是没有的,先把它下载到本地。cmd终端执行下面命令:mvn install:install-file -Dfile=ojdbc6-11.2.0.3.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpack

2020-07-26 16:50:36 533

转载 MyBatis的工作原理以及核心流程介绍

MyBatis的底层操作封装了JDBC的API,MyBatis的工作原理以及核心流程与JDBC的使用步骤一脉相承,MyBatis的核心对象(SqlSession,Executor)与JDBC的核心对象(Connection,Statement)相互对应。本文的核心观点是:从JDBC入手并立足于JDBC,才能深入的理解MyBatis的工作原理以及核心流程。1、如何掌握MyBatis的工作原理?关于MyBatis的工作原理,网上的文章是汗牛充栋,但是站长觉得,要结合JDBC来理解MyB...

2020-07-19 19:58:20 237

转载 Spring Bean生命周期

Spring Bean的生命周期是Spring面试热点问题。这个问题即考察对Spring的微观了解,又考察对Spring的宏观认识,想要答好并不容易!本文希望能够从源码角度入手,帮助面试者彻底搞定Spring Bean的生命周期。只有四个!是的,Spring Bean的生命周期只有这四个阶段。把这四个阶段和每个阶段对应的扩展点糅合在一起虽然没有问题,但是这样非常凌乱,难以记忆。要彻底搞清楚Spring的生命周期,首先要把这四个阶段牢牢记住。实例化和属性赋值对应构造方法和setter方法的注入,初始化和销

2020-07-14 17:51:12 191

原创 Java线程的状态

java线程常见的基本状态有哪些,这些状态分别是做什么的多线程常用的方法转换流程图java线程常见的基本状态有哪些,这些状态分别是做什么的JDK的线程状态分6种,JVM里面9种,我们一般说JDK的线程状态。常见的5种状态:创建(NEW):生成线程对象,new Thread(),但是并没有调用该对象start()就绪(Runnable):当调用线程对象的start()方法,线程就进入就绪状态,但是此刻线程调度还没把该线程设置为当前线程,就是没获得CPU使用权。 如果线程运行后,从等待或.

2020-07-09 14:17:18 186

原创 ConcurrentHashMap那点事儿

这里写目录标题一、背景线程不安全的HashMap效率低下的HashTable容器锁分段技术二、应用场景三、源码解读不变(Immutable)和易变(Volatile)其它数据结构删除操作remove(key)示意图get操作put操作size一、背景线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。效率低下的HashTable容器HashTable容器使用synchronized来保证线程

2020-07-05 09:27:17 354

原创 HTTPS 的工作原理

当你打开浏览器,访问某个网站,如果网址旁有个小锁,代表访问的网址是安全的,反之不安全。当我们没有看到那个小锁的小图标的时候,需要提高警惕,不要随意输入个人重要的资料。所有的银行和支付相关的网站都是100%使用HTTPS的。我们为什么需要HTTPS?主要有三个原因:保护隐私(Privacy):所有信息都是加密传播,第三方无法窃听数据。如果使用HTTP明文传输数据的话,很可能被第三方劫持数据,那么所输入的密码或者其他个人资料都被暴露在他人面前,后果可想而知。数据完整性(Integraty):一旦第三

2020-06-27 21:21:25 182

原创 API接口设计

说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全性呢?下面我们就来讨论下常用的一些API设计的安全方法,可能不一定是最好的,有更牛逼的实现方式,但是这篇是我自己的经验分享.一:token 简介Token:访问令牌access token, 用于接口中, 用于标识接口调用者的身份、凭证,减少用户名和密码的传输次数。一般情况下客户端(接口调用方)需要先向服务器端申请一个接

2020-06-27 20:32:33 432 1

原创 MQ消息最终一致性解决方案

随着分布式服务架构的流行与普及,原来在单体应用中执行的多个逻辑操作,现在被拆分成了多个服务之间的远程调用。虽然服务化为我们的系统带来了水平伸缩的能力,然而随之而来挑战就是分布式事务问题,多个服务之间使用自己单独维护的数据库,它们彼此之间不在同一个事务中,假如A执行成功了,B执行却失败了,而A的事务此时已经提交,无法回滚,那么最终就会导致两边数据不一致性的问题;尽管很早之前就有基于两阶段提交的XA分布式事务,但是这类方案因为需要资源的全局锁定,导致性能极差;因此后面就逐渐衍生出了消息最终一致性、TCC等柔性事

2020-06-27 20:07:58 847

原创 maven快速入门

一、如何配置maven环境变量1、 下载maven由于下载地址经常变动,这里就不写地址了,自行去官网下载即可。2、配置环境变量第一步:在“系统变量”中添加“MAVEN_HOME”,变量值为maven的安装路径,如:D:\tools\maven\apache-maven-3.6.2;第二步:在“Path”中追加 ;%MAVEN_HOME%\bin(注意前面有分号);第三步:在控制台输入“...

2020-06-12 17:41:09 222

原创 Mysql索引

1、什么是索引索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据2、索引采用的哪种数据结构常见的MySQL主要有两种结构:Hash索引和B+ Tree索引3、Hash索引和B+ Tree索引有什么区别  不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。  Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位;  B+树索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问;  为

2020-06-12 17:16:37 153

转载 Java类加载机制

JVM类加载机制  虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型, 这就是虚拟机的类加载机制。  类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading) 7个阶段。其中验证、准备、解析3个部分统称为连接(

2020-06-11 11:36:10 201

转载 分布式事务

不知道你是否遇到过这样的情况,去小卖铺买东西,付了钱,但是店主因为处理了一些其他事,居然忘记你付了钱,又叫你重新付。

2020-06-10 17:32:05 270

转载 JVM调优

1、JVM调优目标:使用较小的内存占用来获得较高的吞吐量或者较低的延迟。程序在上线前的测试或运行中有时会出现一些大大小小的JVM问题,比如cpu load过高、请求延迟、tps降低等,甚至出现内存泄漏(每次垃圾收集使用的时间越来越长,垃圾收集频率越来越高,每次垃圾收集清理掉的垃圾数据越来越少)、内存溢...

2020-06-09 23:49:46 198

原创 JVM垃圾收集器

1、Serial收集器收集算法是内存收到的方法论,垃圾回收器是内存回收的具体实现。Serial是一个单线程的垃圾收集器serial垃圾收集器的特点a、“Stop The World”,它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。在用户不可见的情况下把用户正常工作的线程全部停掉b、使用场景:多用于桌面应用,Client端的垃圾回收器c、桌面应用内存小,进行垃圾回收的时间比较短,只要不频繁发生停顿就可以接受2、ParNew收集器ParNew 收集器其实就是 Seria

2020-06-09 23:05:32 187

原创 JVM那点事儿

1、JVM运行时数据区线程共享数据区:方法区、堆线程隔离数据区:虚拟机栈、本地方法栈、堆、程序计数器JVM内存模型之程序计算器a、程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器b、线程是一个独立的执行单元,是由CPU控制执行的c、字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成d、为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序

2020-06-09 22:35:10 186

原创 HashMap的那点事儿

1、HashMap的数据结构哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过 8 时,链表转换为红黑树2、HashMap的工作原理HashMap 底层是 hash 数组和单向链表实现,数组中的每个元素都是链表,由 Node 内部类(实现 Map.Entry接口)实现,HashMap 通过 put & get 方法存储和获取。存储对象时,将 K/V 键值传给 put() 方法:①、调用 hash(K) 方法计算 K 的 hash 值,然后结合数组长度,计算得数组下

2020-06-09 18:42:54 238

原创 基于zookeeper实现分布式锁

基于zookeeper原生api实现分布式锁

2020-05-30 11:20:57 183

原创 Docker搭建Zookeeper集群

创建网络并配置ip众所周知bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。docker network create --driver bridge --subnet 120.25.0.0/16 zookeeper_net查看网卡信息docker network inspect zookeeper_net搭建zookeeper集群这里使用docker-compose搭建

2020-05-30 09:52:22 278

原创 基于Docker搭建Mysql主从复制

拉取docker镜像docker pull mysql:5.7查看镜像docker images使用拉取下来的镜像启动主从两个容器Master(主):docker run -p 3307:3306 --name master-mysql -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:5.7Slave(从):docker run -p 3308:3306 --name slave-mysql -e MYSQL_ROOT_PASSWORD=abc1234

2020-05-17 21:25:05 221

原创 什么是缓存穿透,缓存雪崩?二者如何解决?

1、缓存雪崩1.1 什么是缓存雪崩如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。 由于原有缓存失效,新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU 和内存造成巨大压力,严重的会造成数据库宕机1.2 解决方案1.2.1 加锁排队key: whiltList value:1000w个uid 指定setNx whiltL...

2019-12-23 16:06:15 246

转载 Java中抽象类和接口存在的意义与价值

首先简单的介绍一下抽象类:定义是很简单的,我们这里不写官方的语言,我自己看着都烦,我们就用白话介绍,抽象类本质是一个类,没问题,那么类里面一般都是有方法的,方法包括方法名和方法体,这是常识对不对,那么什么是抽象类呢?如果一个类里面有一种方法只有方法名却没有方法体,这样的类就是抽象类!举个例子:public abstract class TestAbstract { //这是一个抽象方法,...

2019-06-04 20:34:04 1082

空空如也

空空如也

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

TA关注的人

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