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

原创 平安7年软件测试经理现38K*15薪,总结一下成功的经历(附全套涨薪资料)

从15年毕业到现在也从业7年了,普通本科毕业,现在一家互联网公司担任测试部门总监(下面管着40多号人吧),摸爬打滚,坑坑洼洼也经历了不少。思绪很久决定还是写下这篇,希望对后进的小伙子少走一点弯路。

2022-10-21 15:43:56 360 1

原创 java基础语法以及进制的转换

关键字关键字: 被Java语言赋予特定含义的单词关键字特点 组成关键字的字母全部小写关键字注意事项 goto和const作为保留字存在,目前并不使用 类似IDEA这样的集成工具,针对关键字有特殊的颜色标记,非常直观。标识符标识符 就是给类,接口,方法,变量等起名字时使用的字符序列组成规则 英文大小写字母 数字字符 $和_ 注意事项不能以数字开头 不能是Java中的关键字 区分大小写标识符(常见命名规则)注释注释用于解释说明程序的文字Java中注释分类格式单行注释格式: //注释文字

2021-10-17 22:58:29 157

原创 Java进阶之深入理解JVM类加载机制

前言了解类加载的过程,有利于在类初始化时进行一些功能操作;本文全面讲解类加载过程;一、类加载介绍1、类加载生命周期从类被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期分为7个阶段,加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading);其中验证、准备、解析三个部分统称为连接;2、类加载的过程类加载的过程包括了加载、验证、准备、解

2021-10-17 22:55:00 142

原创 Java 垃圾回收机制,你知多少??

摘要: 垃圾回收机制是守护线程的最佳示例,因为它始终在后台运行。本文分享自华为云社区《 一文带你了解Java 中的垃圾回收机制 》,作者:海拥。介绍在 C/C++ 中,程序员负责对象的创建和销毁。通常程序员会忽略无用对象的销毁。由于这种疏忽,在某些时候,为了创建新对象,可能没有足够的内存可用,整个程序将异常终止,导致 OutOfMemoryErrors 。但是在 Java 中,程序员不需要关心所有不再使用的对象。垃圾回收机制自动销毁这些对象。垃圾回收机制是守护线程的最佳示例,因为它始终在后台运行。

2021-10-17 22:48:59 129

原创 Java 11都有哪些新特性?

Java 11是自Java 8以来的又一个LTS版本,是目前全球使用最多的LTS版本之一。今天我们接着在Java 9 到 Java 17系列文章中来认识针对普通开发者的Java 11。字符串API增强在Java 11中,针对 String 的操作进一步得到加强。避免我们在很常见的场景中引入额外的、复杂的API。isBlank()用来判断字符串是不是空字符 “” 或者 trim() 之后( " " )为空字符:String blankStr = " ";// trueboolean tru

2021-10-17 22:38:56 111

原创 这几种Java异常处理方法,你会吗?

我们在软件开发的过程中,任何语言的开发过程中都离不开异常处理。如果不处理异常,将会导致软件异常中断,崩溃,退出,严重影响用户的使用和体验。如果合理的应用异常处理那将会减少软件出现的错误,可以友好的提示用户,提升用户的体验。异常是什么异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。如:用户输入非法数据,做除法运算的时候除数为0,语句少写分号,打开的文件不存在,内存溢出,网络中断等。异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序

2021-10-17 22:28:23 62

原创 Java集合:HashMap

Java集合:HashMapHashmap是一个存储key-value的映射表。优点:索引数据快,查找一个数据对的时间复杂度是O(1)增加、删除一个数据的时间复杂度是O(1)key不能重复,可以存储一个null值存储:通过key的hashcode值存储在指定数组下标中用链表存储hashcode值一样,都是key不一样的数据,链表长度大于8时转换为红黑树(为了提高查询效率)HashMap的内部结构Hashmap封装了一个Node数组进行存储key-value的键值对,常用的get和put等

2021-09-26 18:31:12 70

原创 Elasticsearch 性能调优指南——推荐实战 DSL

Elasticsearch 性能调优指南——推荐实战 DSL1、未分配分片查看GET _cat/shards?v&h=index,shard,prirep,state,unassigned.reason&s=state:asc2、动态调整副本数PUT my-index-2021.05.30-000002/_settings{"number_of_replicas": 0}ps:主分片不可以修改(除非shrink),但:副本可以动态调整大小。3、重新打开分片分配策略PUT

2021-09-26 18:28:32 261

原创 Redis分布式锁,你用对了吗?

Redis分布式锁,你用对了吗?废话不多说,直接上硬核。今天我们就来聊聊分布式锁。PART1.分布式锁是什么?我们的手机有锁、车有锁、家门有锁、贵重物品会锁进保险箱。可以说,锁在我们生活中无处不在,时刻保护着我们的人身财产安全。在计算机领域也一样,锁可以理解为针对某项资源使用权限的管理,它通常用来控制共享资源,比如一个进程内有多个线程竞争一个数据的使用权限,解决方式之一就是加锁。那分布式锁是什么呢?顾名思义,分布式锁就是分布式场景下的锁,比如多台不同机器上的进程,去竞争同一项资源,就是分布式

2021-09-26 18:18:31 268

原创 Spring Security 玩出花!两种方式 DIY 登录

Spring Security 玩出花!两种方式 DIY 登录一般情况下,我们在使用 Spring Security 的时候,用的是 Spring Security 自带的登录方案,配置一下登录接口,配置一下登录参数,再配置一下登录回调就能用了,这种用法可以算是最佳实践了!但是!总会有一些奇奇怪怪得需求,例如想自定义登录,像 Shiro 那样自己写登录逻辑,如果要实现这一点,该怎么做?今天松哥就来和大家分享一下。Remi琢磨了一下,想在 Spring Security 中自定义登录逻辑,我们有两种思

2021-09-26 18:02:23 115

原创 怎么通俗的理解Netty呢?

Netty(3.X)有了Netty,你可以实现自己的HTTP服务器,FTP服务器,UDP服务器,RPC服务器,WebSocket服务器,Redis的Proxy服务器,MySQL的Proxy服务器等等。如果你想知道Nginx是怎么写出来的,如果你想知道Tomcat和Jetty是如何实现的,如果你也想实现一个简单的Redis服务器,那都应该好好理解一下Netty,它们高性能的原理都是类似的。看一下传统的HTTP服务器的原理:创建一个ServerSocket,监听并绑定一个端口一系列客户端来请求这个端口

2021-09-26 17:57:39 82

原创 聊聊分布式锁——Redis和Redisson的方式

聊聊分布式锁——Redis和Redisson的方式一、什么是分布式锁分布式~~锁,要这么念,首先得是『分布式』,然后才是『锁』分布式:这里的分布式指的是分布式系统,涉及到好多技术和理论,包括CAP 理论、分布式存储、分布式事务、分布式锁…分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。锁:对对,就是你想的那个,Javer 学的第一个锁应

2021-09-17 15:38:24 3093

原创 一文带你深入理解JVM内存模型

一文带你深入理解JVM内存模型一、JAVA的并发模型共享内存模型在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信该内存指的是主内存,实际上是物理内存的一小部分二、JAVA 内存模型的抽象1、java内存中哪些数据是线程安全的,哪些是非安全的非线程安全:在java中所有的实例域、静态域、和数组元素都存放在堆内存中,并且这些数据是线程共享的,所以会存在内存可见性问题线程安全局部变量、方法定义的参数、异常处理器参数是当前线程的虚拟机栈中的数据,

2021-09-17 15:29:27 79

原创 【Java虚拟机规范】JVM类加载机制

【Java虚拟机规范】JVM类加载机制理论知识一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。《Java虚拟机规范》严格规定了有且只有六种情况必须立即对类进行“初始化”(而加载、验证、准备自然需要在此

2021-09-17 15:23:01 154

原创 ElasticSearch集成SpringData史上最全查询教程

ElasticSearch集成SpringData史上最全查询教程1、简单介绍springboot 使用springdata操作es,ElasticsearchRepository使用QueryBuilder构造查询条件2、集成es//maven集成 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-b

2021-09-17 15:18:08 314

原创 【手撸RPC框架】SpringBoot+Netty4实现RPC框架

【手撸RPC框架】SpringBoot+Netty4实现RPC框架线程模型1:传统阻塞 I/O 服务模型模型特点:采用阻塞IO模式获取输入的数据每个链接都需要独立的线程完成数据的输入,业务处理、数据返回。问题分析:当并发数很大,就会创建大量的线程,占用很大系统资源连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read操作,造成线程资源浪费。线程模型2:Reactor 模式针对传统阻塞I/O服务模型的2个缺点,解决方案如下:基于 I/O 复用模型:多个连接共用一个阻塞对象,应用

2021-09-16 18:02:09 440

原创 如何理解 JAVA 中的 volatile 关键字

如何理解 JAVA 中的 volatile 关键字最近在重新梳理多线程,同步相关的知识点。关于 volatile 关键字阅读了好多博客文章,发现质量高适合小白的不多,最终找到一篇英文的非常通俗易懂。所以学习过程中顺手翻译下来,一方面巩固知识,一方面希望能帮到有需要的伙伴。该文章并非完全逐字翻译,英文不错的可以选择阅读原文:Java Volatile Keyword基本用法JAVA 语言里的 volatile 关键字是用来修饰变量的,方式如下入所示。表示:该变量需要直接存储到主内存中。public c

2021-09-16 17:46:01 101

原创 Redis 的缓存异常处理 —— 缓存雪崩、缓存击穿、缓存穿透

Redis 的缓存异常处理 —— 缓存雪崩、缓存击穿、缓存穿透在实际应用 Redis 过程中,如果将 Redis 作为数据库的缓存,经常会遇到这几个问题:缓存雪崩、缓存击穿、缓存穿透等。缓存雪崩缓存雪崩指的是,大量的应用无法在 Redis 缓存中处理,然后大量请求发送到了数据库,导致数据库的压力激增,甚至可能导致数据库崩溃,从而导致整个系统崩溃,引发雪崩一样的连锁效应。而引起缓存雪崩的原因,一般如下:1、缓存中大量 key 同时过期2、Redis 实例挂掉了,无法处理请求对于原因 1,在实际应

2021-09-16 17:07:28 83

原创 SpringBoot的全局异常处理的优雅吃法!要进来学习下吗

SpringBoot的全局异常处理的优雅吃法!要进来学习下吗SpringBoot全局异常准备开发准备环境要求 JDK :1.8 SpringBoot :1.5.17.RELEASE首先还是Maven的相关依赖:<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java

2021-09-16 17:05:02 75

原创 在K8S上的Web服务该怎么做域名解析呢?

在K8S上的Web服务该怎么做域名解析呢?我们这个系列的文章一直都在学习和掌握K8S各种组成部分在集群里的角色、作用和使用场景,那么针对今天这个主题任务「给K8S上的Web服务做域名解析」你觉得应该使用什么组件来完成呢?之前使用 Ingress ,那么有人会问为啥不能用 NodePort 这种方式呢?今天的文章我们就来详细探讨一下这些相关的问题:为什么 NodePort 这种暴露服务的方式不适合用来给服务做域名解析。怎么使用 Ingress 暴露Web服务(会给大家做一个Demo进行演示)。生产集

2021-09-15 15:58:39 579

原创 除了 MySQL 数据库,你还要了解的一些数据库

除了 MySQL 数据库,你还要了解的一些数据库数据库是我们在项目开发过程中必不可少的一项服务。 相信技术大大也都接触过各种类型的数据库,例如Oracle、MySQL、MongoDB、Redis等大众熟知的数据库。数据库的选型,在我架构过程中也是重中之重。什么场景适合合适什么数据库,每种数据库的特点是什么,在架构中起到什么样的作用,承担的重点业务是什么?我们在 DB-ENGINES (https://db-engines.com/en/ranking)看到,参与排名的数据库就多达354种。如下图,这里

2021-09-15 15:51:25 2051

原创 如何用 Redis 实现延迟队列?

如何用 Redis 实现延迟队列?- 前言 -我们都知道Redis是一种基于内存的单进程单线程数据库(Redis6.0开始之后支持多线程啦! ),处理速度都非常快。 那么为何Redis又能慢呢? 原来,这里说的慢是指Redis可以设置一些参数达到慢处理的结果。那接下来开始讲讲我们的Redis在队列中如何实现延时的情况:在我们日常生活中,我们可以发现:在淘宝、京东等购物平台上下单,超过一定时间未付款,订单会自动取消。打车的时候,在规定时间没有车主接单,平台会取消你的单并提醒你暂时

2021-09-15 15:44:32 1033

原创 你真的弄明白了吗?Java并发之AQS详解

你真的弄明白了吗?Java并发之AQS详解带着问题阅读1、什么是AQS,它有什么作用,核心思想是什么2、AQS中的独占锁和共享锁原理是什么,AQS提供的锁机制是公平锁还是非公平锁3、AQS在Java中有哪些实现,如何基于AQS实现自己的锁控制4、AQS除了提供锁框架以外还提供了什么能力AQS介绍AbstractQueuedSynchronizer(AQS) 提供了一套可用于实现锁同步机制的框架,不夸张地说, AQS 是 JUC 同步框架的基石。 AQS 通过一个 FIFO 队列维护线程同步状态

2021-09-15 15:38:59 100

原创 Java的多线程和线程池的使用,你真的清楚了吗?

Java的多线程和线程池的使用多线程大大提高程序运行效率,我们在开发过程中经常会开启一个线程来执行一些费时的任务。开启一个线程有4种方式,在下面的文章我将详细的去讲解。继承Thread继承Thread去执行任务,确实可以开启一个线程去执行任务,如果经常的去开启一些线程,也会导致系统资源的浪费。public static class Mythread extends Thread{ @Override public void run() {

2021-09-15 15:30:09 101

原创 Java后端架构开荒实战(二)——单机到集群

Java后端架构开荒实战(二)——单机到集群一、前言上一篇文章做了一些准备工作,这边文章正式开始写代码。在做好单实例架构之后,升级到集群是一件很容易的事情,所以把单机和集群放在这一篇一起说。二、单体项目架构在开始前先说一下本文一些名词的定义吧。组织(org):这个就是公司的意思,一个公司组织下面可能会有多个项目。项目(project):项目在内部是要自洽的,项目和项目的调用之间就属于第三方调用了。比如本文提到的电商后端就是一个项目,组织公共类库就属于另外一个项目,每个项目有自己的生命周期。应

2021-09-14 19:54:39 642

原创 Java后端架构开荒实战(一)——基础设施

Java后端架构开荒实战(一)——基础设施一、前言之前的文章有讲过后端架构演进系列,这个系列文章还是以一个经典的电商系统为例子,来讲讲Robben是如何在实际开发中一步一步打造出一个大型的后端架构的。本系列文章更多的一些实践操作方面的操作和选型。工欲善其事,必先利其器。在业务代码开发前,让我们先做好相关的基础设置建设。二、云平台云服务的选择有阿里云、腾讯云、华为云等等。阿里云是老牌云服务商了,产品配套齐全,文档丰富,价格也是相应的贵一点。腾讯云算是后起之秀,有腾讯背书,价格比阿里云便宜点。华为云没

2021-09-14 19:23:36 312

原创 带你读懂Spring Bean 的生命周期,嘿,就是玩儿~

带你读懂Spring Bean 的生命周期,嘿,就是玩儿~一、前言今天我们来说一说 Spring Bean 的生命周期,小伙伴们应该在面试中经常遇到,这是正常现象。因为 Spring Bean 的生命周期是除了 IoC、AOP 几个核心概念之外最重要概念,大家务必拿下。可 Spring 源代码又比较复杂,跟着跟着就不知道跟到哪里去了,不太好拿下呀。这倒是真的,而且网上一上来就各种贴流程源码,对初学者来说是真的一脸懵逼,就像字都看的懂,但连在一块就不知道意思了,太绕了。本文Remi酱试着讲的通俗易懂些,

2021-09-14 16:17:59 207

原创 深度解析HashMap高频面试及底层实现架构!

深度解析HashMap高频面试及底层实现架构!HashMap高频面试题1,Map接口和List接口是什么关系?2、Map有哪些常用的实现类?3、请阐述HashMap的put过程?4、链表中是按照怎样的顺序存放数据的?5、Hash(key)方法是如何实现的?6、为什么HashMap的容量一直是2的倍数?8、HashMap是如何扩容的?9、扩容后元素怎么存放的?10、JDK1.7和JDK1.8对HashMap的实现比较Map接口大家应该都听说过吧?它是在Java中对键值对进行存储的一种常用

2021-09-14 15:20:22 82

原创 设计模式-软件架构设计七大原则及开闭原则详解

前言在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题。为了解决、克服这个难题,Remi酱特别开了这个博客来记录自己学习的笔记和自己的理解,也欢迎对此有兴趣的朋友一起来和博主探讨,共同学习。一、软件架构设计模式的七大原则1、开闭原则对扩展开放,对修改关闭。在程序需要扩展的时候,不能去修改原有的代码实现一个热插拔的效果。简而言之,就是用抽象构建架构,用实现扩展细节。2、单一职责原则不要存在多于一个导致类变更的原因。简

2021-09-14 15:08:52 312

原创 Redis集群的搭建及与SpringBoot的整合

Redis集群的搭建及与SpringBoot的整合1、概述之前聊了Redis的哨兵模式,哨兵模式解决了读的并发问题,也解决了Master节点单点的问题。但随着系统越来越庞大,缓存的数据越来越多,服务器的内存容量又成了问题,需要水平扩容,此时哨兵模式就无法支持了,需要使用Redis的集群模式(Redis Cluster)。Redis的集群模式(Redis Cluster),支持扩容、负载均衡、主从高可用,最经典的集群配置方案是三主三从,也就是三台Master服务节点,三台Slave服务节点。接下来我

2021-09-13 17:02:13 118

原创 Spring系列之集成MongoDB的2种方法,你知道嘛?

Spring系列之集成MongoDB的2种方法,你知道嘛?MongoDB是最流行的NoSQL数据库,SpringBoot是使用Spring的最佳实践。今天带大家讲一讲SpringBoot集成MongoDB的两种方式,MongoDB的安装自行去官网查询,本地开发最方便的做法是使用Docker方式。一、准备工作1、工程生成老规矩,使用https://start.spring.io/ 选择我们要依赖的jar包,生成一个demo,然后导入到Idea中2、配置项在application.properti

2021-09-13 16:56:36 223

原创 Java并发知识总结,超详细!(下)

接着来~原子类基本类型原子类使用原子的方式更新基本类型AtomicInteger:整型原子类AtomicLong:长整型原子类AtomicBoolean :布尔型原子类AtomicInteger 类常用的方法:public final int get() //获取当前的值public final int getAndSet(int newValue)//获取当前的值,并设置新的值public final int getAndIncrement()//获取当前的值,并自增public fina

2021-09-13 16:44:13 52

原创 Java并发知识总结,超详细!(上)

Java并发知识总结,超详细!首先给大家分享一个github仓库,上面放了 200多本经典的计算机书籍 ,包括C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,可以star一下,下次找书直接在上面搜索,仓库持续更新中~github地址: https://github.com/Tyson0314/java-books如果github访问不了,可以访问gitee仓库。gitee地址: https://gitee.com/tysondai/j

2021-09-13 16:32:11 114

原创 JDK/Dubbo/Spring 三种 SPI 机制,谁更好呢?

JDK/Dubbo/Spring 三种 SPI 机制,谁更好?SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。本文主要是特性 & 用法介绍,不涉及源码解析(源码都很简单,相信你一定一看就懂)SPI 有什么用?举个栗子,现在我们设计了一款全新的日志框架

2021-09-13 15:56:03 109

原创 JVM运行时数据区

JVM运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在, 有些区域则是依赖用户线程的启动和结束而建立和销毁。1、程序计数器:程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行

2021-09-13 15:38:47 40

原创 iOS线程锁中你还不知道的内容

iOS线程锁一:十种线程锁我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生。这里顺便提一下,上锁的两种方式trylock和lock使用场景:当前线程锁失败,也可以继续其它任务,用 trylock 合适当前线程只有锁成功后,才会做一些有意义的工作,那就 lock,没必要轮询 trylock以下是十种线程锁所用时间:1、OSSpinLock (自旋锁)测试中效率最高的锁, 不过经YYK

2021-09-13 15:31:04 257

空空如也

空空如也

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

TA关注的人

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