自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java服务和Gradle禁用代理

开启了VPN的情况下,Java服务进行http请求,以及Gradle下载依赖会走代理,某些场景会导致网络问题。

2024-03-21 14:52:11 202 1

原创 HashMap源码解析

前言本篇文章来介绍我们常用的集合类 HashMap,它通过散列函数将数据映射到表中的某个位置,以提升查询速度。其底层用于存放数据的数组也叫散列表所谓散列函数,简单来说就是将一个无限大的集合(在 HashMap 中,key值是一个无限大集合),经过 hash 运算取模,均匀的分布在一个有限的集合(我们定义的哈希表容量,比如长度 16 的数组)我们知道 Java 中的 HashMap 底层是一个数组,数组的每个元素是一个链表或者红黑树。我们也知道它的一些特性,比如允许key、value 可以为

2021-01-17 14:18:16 189

原创 Redis源码解析-skiplist跳跃表

前言跳跃表是一种有序数据结构,查找和插入操作的平均时间复杂度都是O(log n)。与常用的自平衡搜索树相比,例如红黑树,跳跃表通过多层链表实现,其结构简单易于实现,其查询删除效率通常堪比红黑树。本篇文章会对跳跃表简要说明,并重点分析Redis跳跃表核心源码其他文章:Redis简单动态字符串SDS源码解析正文1. 跳跃表跳跃表是通过多层有序链表实现的。如下图的有序链表,假设需要查找等于7的元素,必须从头结点(元素为1)依次遍历链表,共经过7次查询比较,找出目标结点。也就是其查询时间复杂度为O(1

2020-12-28 23:48:21 1554

原创 ArrayList源码解析

前言在业务场景以及日常开发中,ArrayList往往是最频繁使用的List实现类,这由它的结构以及特性决定。ArrayList顾名思义,其底层是由数组实现,因此查询时间复杂度是常数级别的,再加之有一些小优化,查询速度会更快。由于其底层是数组实现,插入和删除都是O(n)级别的。业务场景往往是多读少写的,因此ArrayList就很适合。下面就来解析ArrayList的源码以及常见方法的实现本篇文章基于JDK8正文1. 成员变量首先看一下它的成员变量DEFAULT_CAPACITY = 10

2020-12-10 00:00:29 1971

原创 Visual Studio Code debug Redis

前言阅读Redis源码避免不了debug,直接使用GDB调试很不方便。本文分享使用Visual Studio Code调试Redis的方式。环境:MacOSX,Redis5.0正文1. 插件市场安装所需编译器我这里导入源码后到目录结构如下图。首次下载记得进入根目录编译cd redis-5.0.0make2. 添加debug所需配置注意 上图选中redis-server是可执行文件路径,编译后才会有贴出我的配置{ "version": "0.2.0", "co

2020-11-27 00:12:26 667 4

原创 一分钟彻底掌握Java位运算

前言在阅读源码的时候,经常会碰到位运算,例如Java8中的HashMap部分源码。不同语言有各自的位运算方式,又大同小异。本篇文章带你一分钟彻底掌握Java中的位运算 /** * 这段代码是计算hashcode的,其中的位运算和异或运算是为了降低hash碰撞概率 */ static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCod

2020-11-22 18:37:49 2043 1

原创 Redis源码解析-SDS简单动态字符串

前言SDS是Redis基础数据结构之一,不同于C字符串(以/0结尾,无法保证二进制安全),SDS为Redis定义的一种抽象类型,该类型有诸多优点如获取字符串长度时间复杂度O(1)高效的扩容机制,还能杜绝缓冲区溢出惰性释放空间,减少内存重分配次数以提高性能二进制安全兼容部分C字符串函数正文1. 获取源码自行官网获取,SDS字符串源码主要在sds.c中如下图2. SDS数据结构以下代码是数据结构的定义,可以看到字符串有五种定义。只有第一种结构不一样,下面四种结构类似//sds数

2020-11-20 22:34:02 2591

原创 mac彻底卸载IDEA等Intellij家族软件

这里我以卸载Clion为例。其他Intellij家族的软件例如idea卸载方式相同1.首先前往application把应用移动到废纸篓2.彻底删除残留文件如果是其他软件,例如idea,只需要把最后的目录CLion2019.3改为idea的以同样方式删除rm -rf ~/Library/Preferences/CLion2019.3rm -rf ~/Library/Caches/CLion2019.3rm -rf ~/Library/ApplicationSupport/CLion2019.

2020-11-19 15:34:41 2693

原创 【Docker】Tomcat镜像构建与应用集成

前言本篇文章需要了解Docker基础知识,以及Dockerfile的使用参考文章:Dockerfile构建镜像与命令详解正文1. 拉取tomcat镜像docker search tomcat //查询可用的tomcat镜像docker pull tomcat //这里我选择了star数(人气)最高的版本2. 启动容器启动后通过docker ps命令查看已启动的容器,发现容器正在运行,但是访问页面404docker run -d -p 8080:8080 tomc

2020-11-01 22:01:57 525

原创 【Docker】Docker集成Nginx部署静态网站

前言本片文章讲解如何通过nginx容器搭建一个静态网站前置条件了解nginx基础配置Docker基础,以及会使用Dockerfile构建镜像,可参考这篇文章Dockerfile构建镜像与命令详解正文我这里已经安装好Docker环境,并拉取centos基础镜像,还是基于centos基础镜像来构建,不了解相关概念参考以上文章1. 创建目录编写Dockerfile我的目录结构如下,文件位置要和Dockerfile指定位置对的上基于centos基础镜像安装nginxFROM cent

2020-11-01 21:55:28 545

原创 【Docker】Dockerfile构建镜像与命令详解

前言传统方式部署集群,你需要在每台机器搭建环境,配置各种中间件,这样不但效率低下,而且很难保证环境的一致性,而且配置如果有改动,需要挨个机器修改。有了Docker,上述问题都能解决。但是官方镜像大多时候并不能满足需求,因此需要自己构建适用于应用的镜像。构建镜像可以以交互式方式启动并进入容器,对容器修改后退出容器并通过commit命令提交一个新的镜像,但是这种方式构建的镜像不利于后期维护。我们通常是通过编辑Dockerfile,再通过build命令来构建镜像,后面只需要看Dockerfile,镜像信息便一

2020-11-01 21:51:42 7903 1

原创 【Redis运维篇】Redis高可用之哨兵模式

前言Redis主从复制模式下,一旦主节点发生故障,需要人工干预进行故障转移,故障转移的实时性与准确性都无法保障。Redis2.6版本以上提供了Redis Sentinel(哨兵)来自动发现和转移故障,实现高可用相关文章启动多个Redis实例Redis搭建主从复制Redis Sentinel配置文件包含一个主结点,两个从结点,三个Sentinel结点的配置文件,已上传至GitHub正文1.Redis Sentinel概述Redis Sentinel包含若干个Sentinel节点和Re

2020-10-16 19:41:44 1966

原创 【Redis运维篇】Redis结点间的主从复制

前置条件在生产环境,Redis结点通常是单独部署在不同的物理机器上。想要在一台机器上模拟多节点,可以参考这篇文章同一台机器上启动多个Redis实例Redis结点的主从复制Redis实例可划分为主结点(master)和从结点(slave)一个主结点可以有多个从结点,一个从结点只能有一个主结点默认1.启动redis实例这里我启动两个实例,端口分别是6379和63802.建立主从关系1.指定端口连接实例redis-cli -p 63802.在6380示例执行以下命令,代表6380

2020-10-15 16:59:31 877 1

原创 【Redis运维篇】同一台机器上启动多个Redis实例

启动多个Redis实例如果不了解redis的基本配置,可以参考这篇文章Redis的基本配置首先拷贝并修改redis配置文件找到redis.conf所在目录,可通过find命令查找find / -name redis.conf进入该目录并拷贝一份redis.conf,并编辑cp redis.conf redis2.confvim redis2.conf端口port,不要跟其他端口冲突,这里我改成6380进程文件pidfile,redis启动时会自动分配进程号并写入文件,以下配置为了指定

2020-10-14 20:46:58 3132

原创 【Redis运维篇】Redis的安装与配置

Redis的几种安装方式(Linux)yum和rpmyum本质上是下载rpm包到当前机器,并安装。因此两种安装方式有相同的特点:都会自动添加环境变量,也就是如redis-server,redis-cli之类的命令直接可以执行yum install redisrpm -ivh redis.rpm //进入到rpm包所在目录,指定包名执行源码编译安装需下载源码编译,它的特点是:不会自动添加环境变量,执行redis-server,redis-cli需要到该命令下(命令就是可执行文件呢

2020-10-14 20:40:14 797

原创 MySQL快速生成测试数据(存储过程)

Mysql快速创建测试数据(存储过程)1.创建测试数据库CREATE TABLE `test_user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(11) DEFAULT NULL, `age` int(4) DEFAULT NULL, `address` varchar(256) DEFAULT NULL, `create_time` date DEFAULT NULL, PRIMARY KE

2020-09-23 18:06:24 895

原创 抓包分析TCP的连接与断开过程(三次握手四次挥手)

首先熟悉一下TCP头部抓包分析三次握手过程wireshark如何抓取指定IP的数据包?(这里的IP为我的服务器IP)可以通过过滤框通过表达式过滤:例如ip.src47.101.210.40 抓取源主机IP的数据包,ip.dst47.101.210.40代表目标主机的数据包因此抓取一个机器三次握手的数据包,可以用表达式ip.dst47.101.210.40 or ip.src47.101.210.40本案例我使用个人电脑(客户端),请求个人服务器,来分析三次握手(下图前三个数据包)客

2020-08-23 13:48:46 978

原创 图解什么是防火墙

防火墙的作用:用来过滤一些流量(例如有害的网络数据包)过滤规则:是通过访问控制表 (Access-control list)对特定数据包进行过滤例如可以通过IP地址协议类型目标主机IP端口号防火墙的种类网络防火墙:通常用于过滤局域网的流量,一般是在代理机上配置过滤规则,再经路由器转发到局域网的机器上。有的路由器也具有防火墙功能主机防火墙:直接安装在个人电脑上或者服务器上。例如Linux服务器通过 systemctl status firewalld可以查看防火墙的状态..

2020-08-22 23:55:32 1236

原创 IDEA生成序列号插件GenerateSerialVersionUID的使用

一 到插件市场下载插件并安装,重启IDEA二 实现了Serializable接口的类可以用这个工具生成序列号三 也可以配置快捷键

2020-08-11 23:31:41 2462

原创 单例模式的Java代码实现

一 饿汉式类加载到内存后,只能在内存中有一个实例,JVM保证线程缺点:不管是否用到,类加载时就会实例化public class Singleton { private static final Singleton INSTANCE=new Singleton(); //私有构造方法 private Singleton(){ } public static Singleton getInstance(){ return INSTANCE;

2020-08-02 22:02:51 643

原创 Redis字符串SDS(simple dynamic string)

Redis字符串SDS(simple dynamic string)一 SDS结构定义struct { int len; //记录buf中已使用的字节数量 int free; //buf中未使用的字节数量 char buf[]; //字节数组}二 SDS与C字符串的区别C字符串获取字符串长度需要遍历字节数组,时间复杂度O(N)。SDS设置和更新长度在API执行时完成,获取长度时间复杂度O(1)由于C字符串扩容可能导致buffer overflow,缩减字符串会导致内存泄漏。

2020-08-01 19:36:09 745

原创 Java线程状态转换(最详细的状态转换流程图)

Java线程的状态和状态转换new,runnable,timed waiting,waiting,blocked,terminated.New 代表创建但是未启动的线程runnable又可分为ready和running两个子状态,由于单个cpu同一时间只可以执行单个线程,多线程的分配是通过cpu时间片来分配的,因此有一部分线程会在等待队列,也就是ready状态。CPU的Thread scheduling(线程调度)决定着线程什么时候可以实际运行处于runnable状态的线程在JVM层

2020-07-19 00:22:44 1029

原创 二叉树的非递归遍历(非递归先序遍历,中序遍历,后序遍历)

主要利用栈的后进先出的特性public class TraversalNonRecursive { /** * 先压头节点并弹出,然后先压右,后压左。这样弹出的顺序就是先左后右 * @param head */ public static void preOrder(TreeNode head){ System.out.println("preOrder"); if(head!=null){ Stack

2020-07-14 00:09:39 636

原创 浅谈一致性hash原理

一致性hash的作用一致性hash常用于实现负载均衡,并在增加节点的情况,极大降低数据迁移的代价hash函数的重要性质1.输入域无穷大,输出域又穷2.输入一样,输出一定一样3.输入不一样,输出也可能一样4.输出在输出域均匀分布5.输入数据差别很小,输出可能差别巨大引申特性:可以通过输出域(模)%m,可将输出域缩减到0~(m-1),当然缩减后也是均匀分布以下以通熟易懂的案例浅析一致性hash假设有三台后台机器,怎么均分接收到的请求?如果需要增加一台机器,怎么还保证负载均衡,

2020-07-13 14:50:44 210

原创 恢复二叉搜索树

恢复二叉搜索树/** * 二叉树类定义 */class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() { } TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { this.val = val;

2020-07-05 23:30:04 291

原创 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树import java.util.HashMap;public class PreInToTree { public static TreeNode preInToTree(int[] pre,int[] in){ if(pre==null||in==null){ return null; } //map存储中序遍历序列,key节点值,value:节点坐标,用于查询头节点在中

2020-06-23 09:38:36 140

原创 二叉树中的最大路径和

二叉树中的最大路径和路径和:二叉树的任意两节点经过中间若干节点(当然也可能中间没有节点,另外单个节点也可看作路径,这里理解就好)形成一条路径,路径的和就是经过节点的值(val)的和public class MaxPathSum { static int maxSum=Integer.MIN_VALUE; public static int maxPathSum(TreeNode root){ maxGain(root); return maxSu

2020-06-22 17:04:38 237

原创 Centos安装MySQL 5.7.28

MySQL 5.7.28安装教程一.官网下载rpm包https://downloads.mysql.com/archives/community/二.卸载旧的mysql组件mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar1.查看旧版,看到如下mysql组件,不同版本会有差异rpm -qa | grep mysql2.卸载组件rpm -e --nodeps mysql-community-libs-5.7.30-1.el7.x86_64三.

2020-06-18 19:34:55 1434

原创 探秘Git对象,commit,tree,blob

探秘Git对象,commit,tree,blob要想真正理解Git对象,首先要知道暂存区(.git/index)实际上是一个包含文件索引的目录树,而真正存储数据的地方是(.git/object),而比如HEAD->master分支,简单来说就是一系列指针,指向objects的数据或者叫对象,而objects是一个简单的key-value数据库[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9pB8GALL-1591987220195)(https://raw.git

2020-06-13 02:59:47 389

原创 划分子网的方式

如何划分子网以C类私有IP网段192.168.0.0~192.168.0.255为例说明1.首先引入三个专有词汇(重要概念),并将两个IP转换为二进制便于理解Network:192.168.0.0:11000000.10101000.00000000.00000000Broadcast:192.168.0.255:11000000.10101000.00000000.11111111NetMask:255.255.255.0 11111111.11111111.11111111.0000000

2020-06-04 22:25:54 788

原创 Java获取任意一天当前时间

/** * 获取某一天时间,传+1是明天,-1昨天,-2前天**/public static String getYesterday(int relativelyTime){ SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date=new Date(); Calendar ...

2020-05-04 01:24:43 294

原创 使用Docker创建nexus并deploy jar包

1.安装docker(使用环境为Centos7)sudo yum updatesudo yum install dockerdocker -v2.启动docker并设置为开机启动systemctl start dockersystemctl enable docker3.查找nexus镜像docker search nexus4.拉取nexus3镜像,并查看镜像d...

2020-04-19 00:03:07 238

原创 list转tree,用于展示层级结构

list转tree,用于展示层级结构部门类定义import java.util.List;/*** 部门类(省略get set方法)**/public class DepartmentVO { /** * 当前部门id */ private String deptId; /** * 父部门id */ private Stri...

2020-04-18 22:56:13 578

原创 coursera-dl批量下载,小白都能学会的教程

1.安装python3以上版本,pip尽量较新版本。本人用的版本Python 3.8.2 pip 20.0.2。配置环境变量2.安装:pip3 install coursera-dl3.coursera-dl -u username -p pwd course_name -ca cookie_value说明:username pwd为登录账号密码-ca为名为CAUTH的co...

2020-04-13 00:57:51 1483 3

原创 org.springframework.cloud:spring-cloud-starter-feign:jar is missing

2020-02-01 17:25:25 1384

原创 寻找两个有序数组的中位数Java实现

/** * 寻找两个有序数组的中位数 */public class FindMedianSortedArrays { public static void main(String[] args) { int[] arr1={1,3,4,5}; int[] arr2={1,2,3,6,9}; System.out.println(fin...

2019-12-12 23:42:43 338

原创 无重复字符的最长子串Java实现

题目:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度import java.util.HashSet;import java.util.Set;/** * 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度 */public class Solution { public static void main(String[] args) { ...

2019-12-12 19:28:22 171

原创 Java遍历map的几种方式

import java.util.*;import java.util.function.BiConsumer;public class Test1 { public static void main(String[] args) { HashMap<Integer, String> map = new HashMap<>(); ...

2019-12-03 15:30:08 126

原创 Vue域名访问Invalid Host header错误

原因是webpack默认检查域名是否符合如下文件配置:解决方案:

2019-11-30 23:10:04 537

原创 配置jdk环境变量

win10版:JAVA_HOME 变量值(jdk路径)C:\Program Files\Java\jdk1.8.0_231CLASSPATH 变量值 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jarPath变量添加%JAVA_HOME%\bin %JAVA_HOME%\jre\bin...

2019-11-13 12:44:26 96

空空如也

空空如也

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

TA关注的人

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