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

原创 Mysql基于成本选择索引

在Mysql5.6及之后的版本中,我们还可以使用optimizer trace功能查看每个索引、全表扫描具体的成本是多少,从而知道mysql为什么选这个索引,或为什么走全表扫描。我们仔细看上面俩个执行计划的rows列,可以很明显的发现第二个执行计划的rows小得多,也就是说要扫描的行更小,CPU的成本也就会更小,所以mysql选择了走索引。这也是基于成本考虑的,哪个索引的成本更低,就使用哪个索引。本篇文章介绍mysql基于成本选择索引的行为,解释为什么有时候明明可以走索引,但mysql却没有走索引的原因。

2023-09-10 13:27:55 663

原创 使用Arthues分析高CPU问题

Arthas是阿里开源的 Java 诊断工具,相比 JDK 内置的诊断工具,要更人性化,并且功能强大,可以实现许多问题的一键定位,而且可以一键反编译类查看源码,甚至是直接进行生产代码热修复,实现在一个工具内快速定位和修复问题的一站式服务。今天,我们就来学习一下如何使用Arthas 定位一个 CPU 使用高的问题。

2023-08-20 07:34:43 413

原创 使用MAT分析OOM问题

通过MAT打开java_pid12300.hprof文件后,首先进入的是概览信息界面。从这个概览图中,我们可以看出整个堆的大小是437.6MB。接下来我们可以通过直方图来看这437.6MB的对象都是哪些对象。

2023-08-15 21:24:58 801

原创 CAS解决原子性问题的另一种方案

CAS是什么?如何利用CAS解决原子性问题

2022-11-03 08:52:49 327 1

原创 揭开并大三大问题之可见性问题的神秘面纱

介绍并发编程三大问题可见性、原子性、有序性起源,可见性问题究竟是什么东西,如何解决可见性问题

2022-10-30 20:11:36 441

原创 G1垃圾收集器

G1是一款适用于多处理器以及大内存的垃圾收集器G1采用了Region作为内存布局,支持指定预期停顿时间是G1最大的特点G1垃圾回收的流程a. 初始标记b. 并发标记c. 最终标记d. 筛选回收G1的垃圾收集类型有三种a. young gc:并不是年轻代放不下后立马触发,而是会先计算一下回收的时间是否与预期停顿时间相近,相近才会触发young gc,否则继续增加年轻代的Region。

2022-10-19 22:59:30 956

原创 一文带你了解ZGC

ZGC、颜色指针、对象重定位、ZGC垃圾回收流程、ZGC何时触发垃圾回收、ZGC参数设置、ZGC调优案例

2022-10-10 07:41:14 2073

原创 JVM调优、JVM内存模型

JVM内存模型、JVM性能调优

2022-10-03 21:03:38 746

原创 Spring策略工厂模式

Spring整合策略工厂模式

2022-06-04 00:00:00 976

原创 orika入门使用及组件化

本篇文章,介绍orika的简单使用。以及借助SPI或Spring对orika进行组件化,让增加类型转换规则更加简单方便。一、orika简介在工作中,我们经常涉及到对象的DTO、DO等对象的转换。对于这些对象的转换,我们除了自己写大量的get/set方法外,还可以借助orika这样的Bean映射工具来帮我们完成。二、几款Bean映射工具简单对比1. BeanUtilsapache的BeanUtils和spring的BeanUtils 底层都是基于放射实现的Bean映射。而反射的性能是比较低的,因.

2022-02-12 02:00:00 3745 3

原创 jvisualvm连接远程服务器

jvisualvm除了可以查看本地JVM进程的情况,也可以查看远程服务器的JVM进程情况。但需要注意的是,生产环境不允许这么做,因为这会占用生产服务器的资源,可能对生产环境造成破坏性的影响,但开发环境或测试环境,我们是可以这么做的。1、远程服务配置首先,我们需要的启动参数中添加jmx的相关参数java -Dcom.sun.management.jmxremote.port=8888 -Djava.rmi.server.hostname=192.168.74.132 -Dcom.sun.manageme

2022-01-24 02:00:00 5969

原创 cola4.0 扩展点使用及源码浅析

最近新项目里面用了cola框架,里面有一个扩展点,特定去撸了一下它的源码,把它整明白了Cola扩展点使用Cola中提供了一种扩展点的机制,允许我们通过bizId(组织ID)、useCase(使用案例)、scenario(业务场景)三者动态的去选择实现类。有点类似与我们的策略模式,在程序运行的过程中,动态的选择实现类去处理我们的请求。我就不多做解释了,下面的例子看了,就能明白这个扩展点怎么用了。1、定义扩展点接口,实现ExtensionPointIpublic interface Organiz.

2022-01-10 02:00:00 6725

原创 提交到线程池的异常被吃了

如果我们是使用submit提交的任务,那么就要注意异常的处理了。先来看一段代码:ExecutorService executorService = Executors.newFixedThreadPool(1);executorService.submit(() -> { System.out.println("任务开始执行..."); int a = 10 / 0; // 抛出异常});executorService.shutdown();很明显,我们提交的任务会抛.

2021-12-26 02:00:00 746

原创 Spring依赖注入引发的桥接方法思考

在Spring寻找注入点的时候,有一个findBridgedMethod,寻找桥接方法?那什么桥接方法是什么呢?先来看一个产生桥接方法的场景:一个子类在继承(或实现)一个父类(或接口)的泛型方法时,在子类中明确指定了泛型类型,那么在编译时编译器会自动生成桥接方法.代码案例:public interface IService<T> { void setHandler(T handler);}@Servicepublic class AService implements IS

2021-11-13 02:30:00 1318

原创 java ES RestHighLevelClient客户端“单机“、集群配置

本文介绍,SpringBoot整合ES时RestHighLevelClient的配置,包括单机版本,以及集群版本如何配置(不涉及如何使用RestHighLevelClient)Spring Boot版本:2.2.5 ES版本:6.8.6单机配置文件spring: elasticsearch: rest: ip: 10.218.223.73 port: 9200 scheme: http配置类@Configurati.

2021-11-05 14:48:39 4916

原创 Spring Boot Shiro 密码加密(加盐)

此篇文章是在Shiro整合Spring Boot入门的基础上写的,如果你没有shiro基础看不懂的话,可以去看看。1、给Realm添加CredentialsMatcher@Beanpublic UserRealm userRealm() { UserRealm userRealm = new UserRealm(); // 设置加密算法 HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatche

2021-10-17 15:46:36 1686

原创 Shiro整合Spring Boot入门

这是一篇Shiro入门的博文,将整合Spring Boot快速入门Shiro。实现基本的认证、授权、密码加密功能认证:也就是我们平时所说的登录,但认证不局限于账号密码登录,扫码、人脸识别、指纹等都可以算是认证授权:不同的人拥有不同的权限,比如在后台管理系统中,管理员和普通用户看到的菜单是不一样的、有些资源普通用户只有读权限没有写权限等Shiro简介Shiro简单来说就是一个安全框架,它可以帮助我们快速、容易的实现认证、授权的相关功能。我们先了解一下Shiro的架构。在Shiro中有三个重要.

2021-10-17 14:14:27 244 1

原创 Spring Security连接数据库

之前我们为了快速使用Spring Security,给Spring Security提供的数据源是基于内存的。但实际生产中,这些数据都应该来自数据库。所以接下来就链接数据库实现认证。1、首先准备数据库、表和数据CREATE DATABASE `user_db` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';use user_db;CREATE TABLE `t_user` (`id` bigint(20) NOT NULL COMMENT '用户

2021-10-16 14:45:54 645 2

原创 Spring Security整合Spring Boot快速入门

这是一篇Spring Security入门的博文,将整合Spring Boot快速入门Spring Security。实现基本的认证、授权、密码加密功能认证:也就是我们平时所说的登录,但认证不局限于账号密码登录,扫码、人脸识别、指纹等都可以算是认证授权:不同的人拥有不同的权限,比如在后台管理系统中,管理员和普通用户看到的菜单是不一样的、有些资源普通用户只有读权限没有写权限等密码加密:我们数据库中保存的密码一般都是加密后的密文,避免数据泄露造成巨大损失Spring Security简介Sprin.

2021-10-16 10:57:58 262

原创 MVCC,MySql可重复读的实现秘密

在MySQL中,为了避免在并发环境下,事务受到其他事务的干扰,MySQL提供了可重复读隔离级别。即一次事务多次查询结果相同,即使事务执行过程中数据被其他的事务修改了。为了避免事务执行期间读到其他事务修改的数据,最简单的做法是对读取的数据进行加锁,但很显然,这样会导致性能极具下降,因此不可取。为了实现可重复读的同时,拥有较高的并发性能,MySQL使用MVCC实现可重复读。undo日志由于MVCC是基于undo日志实现的,所以我们先来了解一下undo日志。undo日志主要用于日志事务回滚,MySQ

2021-05-17 10:03:28 258 1

原创 MySQL原理初探之一条SQL的执行需要经历什么

首先先来看一张MySQL的架构图大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5

2021-04-28 11:09:11 133

原创 Spring Cloud系列之Spring Cloud Config

在入职的第二天,拉取了公司的代码,讲道理,我在看配置文件的时候,我就蒙蔽了。他是这样子的:作为一名刚走出校园的实习生,说真的,脑袋嗡嗡嗡的。后面了解到项目用的是Spring Cloud Config,所以我就利用周末时间学习一波Spring Cloud Config。认识Spring Cloud ConfigSpring Cloud Config是最早的配置中心,虽然后面的之秀Nacos把它干掉了=。=, 但是Spring Cloud Config还是很多公司在用,比如我司。那为什么我们需要一个配置

2021-04-21 18:23:24 13532 7

原创 Spring Cloud系列之Eureka入门使用

实习第二天,公司用的Eureka,代码看得脑袋嗡嗡嗡,因此这篇文章就出来了Eureka的作用Eureka有什么用如果不用Eureka有什么问题使用Eureka的架构图快速入门Eureka为Eureka加上密码验证

2021-04-20 16:02:01 547

原创 redis字典

本篇文章假设读者知道HashMap的实现原理。包括HashMap的底层数据结构:数组+链表HashMap如何解决哈希冲突。往HashMap放入一个键值对的时候,如何确定这个键在数组中的位置为什么HashMap要求数组的长度为2的幂次方?HashMap如何进行rehash如果对于上面几点你都清楚的话,那么Redis的字典结构就会很好理解。Redis字典Redis中的字典其实跟Java中的HashMap实现都差不多,如果你研究过HashMap的底层实现原理,那么你将会很容易理解Redis.

2021-04-05 20:30:56 411

原创 redis底层数据结构SDS

面试中我们经常会被问到redis有哪些数据类型,大部分人包括我自己可能只回答了最核心的五种数据结构:String,List,set,zset,hash。或许你还会加上HyperLogLog,bitMap,GeoHash,BloomFilter。但这可能还不是面试官想要的回答。面试官可能想要你回答的是Redis的底层数据结构。比如:String在Redis底层是怎么存储的?这些数据类型在Redis中是怎么存放的?Redis快的原因就只有单线程和基于内存么?这篇文章就来介绍一下Redis的底层数据结构.

2021-03-31 20:02:42 209

原创 redis开发规范

在开发中一定要遵守开发规范,那都是前辈总结的经验,可以帮助我们提前避免很多问题一、键值设计1. key名设计(1)【建议】: 可读性和可管理性以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:idugc:video:1(2)【建议】:简洁性保证语义的前提下,控制key的长度,节省内存,当key较多时,内存占用也不容忽视,例如:user:{uid}:friends:messages:{mid}简化为u:{uid}:fr:m:{mid}。(3)【强制】:不要.

2021-03-30 10:50:24 200

原创 删除bigkey的正确姿势(使用jedis和redisTemplate实现)

对于bigkey来说,我们不能直接使用del删除,避免删除时间过长,导致阻塞其他客户端命令,正确的姿势应该是采用hsan、sscan、zscan渐进式删除,同时我们还要防止bigkey过期时间自动删除的问题(如一个200万的zset设置1小时过期,会触发del操作,造成阻塞,且该操作不会出现在慢查询中)基于Jedis客户端实现渐进式删除1、 Hash删除: hscan + hdelpublic static void delBigHash(String host , int port , Stri.

2021-03-29 10:34:43 864

原创 Redis缓存雪崩、缓存穿透、缓存击穿以及缓存一致性问题

今天我们来聊一聊Redis缓存雪崩、缓存穿透、缓存击穿以及缓存与数据库双写不一致问题,这应该是Redis比较常问的面试题,也是一个比较重要的知识点。缓存雪崩缓存雪崩指的是在某一个时间段,有大量的缓存同时失效,导致大量的请求同时访问了Mysql,导致Mysql不堪重负,最后挂了,Mysql挂了就会使整个服务瘫痪。导致大量缓存同时失效的情况有:redis服务器挂了缓存设置的过期时间相同,导致大量缓存同时过期知道了原因后,解决方法也就比较简单了:通过redis集群或哨兵实现redis的高可用。

2021-03-27 17:05:17 197

原创 布隆过滤器、自己实现布隆过滤器、Redisson实现布隆过滤器

基本概念布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。(摘自百度百科)布隆过滤器原理看完基本概念,你可能还有点懵,没关系,等看完布隆过滤器的原理后,你就能清楚它是一个什么东西了。我们先来看一个需求:假设给你一个10亿的黑名单email,如何来进行黑名单过滤?我们可以想到下面的几种方式拿到一个em

2021-03-27 17:03:55 723 2

原创 Redis集群水平扩展、集群中添加以及删除节点

2021-03-24 13:21:11 196 2

原创 redis集群的搭建、整合springboot以及其原理

在上一篇博客中,我们聊了主从和哨兵架构,在主从架构中,实际上只有一个master节点能对外提供写服务,且存在单点故障,不满足高可用,后来我们在主从架构的基础上,增加了哨兵,使得在master节点出现故障的时候,可以由哨兵自动选举出一个新的master,但是在主从切换的这段时间,redis是不能够向外提供服务的,此外哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,单个节点的内存也不宜设置过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。所以,今天我们将介绍redis集群。Redis集群

2021-03-23 11:36:28 441 3

原创 redis主从架构以及哨兵高可用架构

单节点的redis肯定不可靠,一旦出现单点故障就GG了,今天就介绍一下Redis主从架构以及哨兵结构。虽然实际开发中,用得更多的是集群架构,但他们是集群架构的基础,所以还是有必要了解一下。Redis主从架构什么是主从结构主从架构指的是一个master下可以有多个slave节点(master和slave都是一个redis实例)。slave更多的是对外提供读服务以及作为master的冗余备份。master和slave的职责:读操作: master和slave都可以执行写操作: 只能由master执

2021-03-21 16:17:36 165

原创 搭建redis哨兵集群时,哨兵无法感知到其他哨兵

我在搭建redis哨兵集群的时候,当我手动kill掉master,发现不能自动主从切换,后面就到哨兵节点中查看信息:~ redis-cli -p 26379127.0.0.1:26379> info Sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0mas

2021-03-21 15:28:09 2295 4

原创 redis持久化

redis持久化我们知道redis是一个基于内存的高性能数据库,他的数据都是存储在内存中的,一旦redis宕机或者重启后,数据将全部丢失,这样肯定是不行的,所以redis一定有自己的持久化机制。RDB快照RDB快照指的是将当前时刻的内存数据快照保存在一个名为dump.rdb的二进制文件中,就跟拍照一样,他只能记录按下快门这一刻的数据。通过查看redis.conf配置文件可以查看redis的默认配置# save <seconds> <changes>save 900 1s

2021-03-17 09:50:53 115

原创 redis keys和scan命令的区别

redis keys和scan的区别redis的keys命令,通常在用来删除相关key时使用,但这个命令有一个弊端,在redis拥有数百万及以上的keys时,执行速度会比较慢,更致命的是,这个命令会阻塞redis多路复用的io主线程,如果这个线程阻塞,在此期间,其他发向redis服务端的命令,都会被阻塞,从而引发一系列级联反应,导致瞬间相应卡顿,从而引发超时等问题,所以应该在生产环境禁止用使用keys和类似的命令smembers,这种时间复杂度为O(N),且会阻塞主线程的命令,是非常危险的。如果在生产环

2021-03-15 11:01:22 681

原创 线上java程序CPU飙升问题排查

最近面试的时候被问到JVM线上CPU突然飙高怎么处理,有点忘了,所以写篇博客记录一下,增加一下记忆首先,写一个程序,模拟CPU飙升场景。@RestControllerpublic class HelloController { @RequestMapping("/hello") public void hello(){ for (int i = 0; i < 10; i++) { Thread thread = new Thread(.

2021-03-11 20:37:05 652

原创 分布式事务解决方案--TCC

什么是TCCTCC是try、confirm、cancel三个单词的缩写。try:预留和锁定业务需要的资源。conirm:业务确认,当所有的分支事务都成功时执行。cancel:撤销。如果有一个分支事务执行失败,执行。把预留阶段的资源撤销,相当于事务回滚执行流程图如下:执行流程说明:全局事务发起者向申请开启一个全局事务,并生成一个代表该全局事务的全局事务ID。该全局事务ID会在整个分布式调用链中传递,用于记录事务上下文,追踪和记录状态。全局事务发起者调用其他服务的try方法,预留资源各

2021-03-10 20:53:24 695 1

原创 分布式锁的三种解决方案 数据库、redis、zookeeper

为什么要使用分布式锁加锁,我们都知道,就是为了在并发环境下,使一段代码在同一时间只能有一个线程执行。我们通常通过synchronized或ReentrantLock来实现加锁。比如:synchronized(this){ //业务逻辑代码}这样的代码在单机环境下是可行的,但是不管是synchronized还是ReentrantLock都是JVM层面的,所以在分布式环境下,就不能这么写。加锁的本质其实加锁的本质都是在某个地方打一个标志,这个标志必须所有线程可见,线程在进行一块同步代码的时候,

2021-03-02 22:43:26 281

原创 幂等性及各种解决方案

什么是幂等性幂等性简单的说就是相同条件下,一次请求和多次重复的请求接口的运行结果是相同的。那什么情况下会出现幂等性问题呢?前端重复提交表单:如用户在提交表单的时候,由于网络波动没有及时给用户做出提交成功响应,导致用户认为没有提交成功,一直点击提交按钮,此时就会发生表单重复提交。接口超时重试:很多远程接口调用为了防止由于网络抖动导致的请求失败,都会引入重试机制,如feign的重试机制,导致一个请求发出多次。消息重复消费:在使用消息中间件时,一个消息可能会被重复发送,此时就会发生重复消费。天然具

2021-02-27 14:07:39 2347

原创 分布式之session共享问题 4种解决方案及spring session的使用

session在分布式环境下存在的问题由于HTTP协议是无状态的,在开发中我们可以将用户的信息存储在服务器的session中,并生成与之相对应的JSESSIONID通过cookie返回给浏览器。浏览器下次访问,cookie会自动携带上次请求存储的数据(JSESSIONID)到服务器中,服务器根据JSESSIONID找到对应的session,从而获取用户的信息。该机制在单体应用中是没有问题的,但是如果在分布式环境下,会产生session共享问题,即session的数据在服务1中存在,但是在服务2中不存在。

2021-02-26 20:22:09 5012 4

空空如也

空空如也

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

TA关注的人

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