自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 GoF23——工厂模式

工厂模式(Factory Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。➳作用:实现了创建者和调用者的分离;主要解决接口选择的问题。▎工厂模式核心本质:实例化对象不使用new,而是用工厂方法代替将选择实现类型,创建对象统一管理和控制。从而将掉哟哦你跟着跟我们实现类解藕▎三种模式:简单工厂模式:用来生产同一等级结构中的任意产品(支持增加新产品,需覆盖已有代码)

2022-12-30 15:15:47 704 1

原创 MySQL索引结构(1):搞懂二叉树(遍历方式)

二叉树的由来在 jdk1.8 之前,HashMap 的数据结构由「数组+链表」组成,数组是 HashMap 的主体,链表是为了解决 Hash 冲突引入的,正常的数据存放是直接存在数组中,但如果发生 Hash 冲突就会以链表的形式进行存储,而在 jdk1.8之后,当链表的长度超过 8 之后,将会转换成红黑树存储。清楚HashMap八股文的小伙伴应该知道,为何随着版本的迭代会引入不同的数据结构呢?数组 > 链表 > 树✧ 数组优点 缺点 简单易用,随机访问性强

2022-05-17 14:53:38 1801

原创 心灵拷问:MySQL 到底是怎么加行级锁、间隙锁、临键锁的?

Next-Key Lock 是一张间隙锁,相较于行锁只锁定一行,它会锁定一个区间范围,加锁的范围区间内的索引键值会被锁定MySQL InnoDB支持三种行锁定方式InnoDB的默认加锁方式是next-key。如某个加锁操作未使用到索引,则该锁会退化为表锁。行锁 (Record Lock):存在唯一索引中 (包含主键索引),锁定单条索引记录,即key。 间隙锁 (Gap Lock):存在非唯一索引中,锁定索引记录间隙,确保索引记录的间隙不变。 临键锁 (Next-Key Lo.

2022-04-13 09:42:50 4312 26

原创 mysql四大事务特性原理拆解——MVCC版本控制..

Mysql事务四大特性◈原子性 (Atomicity) 一个事务中的所有操作,要么全部完成,要么全部不完成!如果事务中某条语句执行失败了,前面已经执行了的语句,会回滚到未执行前的状态,就像这个事务从来没有执行过一样。◈ 一致性 (Consistency)从一个正确状态切换到另一个正确状态,数据库的完整性约束未被破坏事务执行前后都必须处于一致性状态,数据库的完整性约束包括但不限于:实体完整性(如行的主键存在且唯一)、列完整性(如字段的类型、大小、长度要符合要求...

2022-02-21 09:24:05 586

原创 图解Redis持久化底层实现原理——RDB/AOF

一、背景Redis作为一个内存数据库,数据是以内存为载体存储的,即所有数据都保存在内存中。一旦Redis服务器进程退出或宕机,即便重启redis服务,数据也会全部丢失。为了解决这个问题,Redis提供了持久化机制,说白了就是把数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据!★ Redis提供2种持久化方案:RDB 将在内存中的数据库记录定期生成快照存入磁盘中 AOF 将Reids的操作日志以追加的方式写入文件,一个是快照的方式,一个是类似日志追加的方式二、...

2021-12-15 16:11:16 3338 2

原创 击穿线程池面试题:3大方法,7大参数,4种拒绝策略

前言:多线程知识是Java面试中必考的点。本文详细介绍——线程池。在实际开发过程里,很多IT从业者使用率不高,也只是了解个理论知识,和背诵各种八股文,没有深入理解到脑海里,导致面试完就忘。——码农 = 敲代码;程序员= 理解线程池面试必考点:3大方法,7大参数,4种拒绝策略!▶ 介绍一 . 线程池(Thread Pool)程序运行的本质就是:占用系统资源! 资源的竞争就会影响程序的运行,势必要优化资源的利用。例如:池化技术的诞生!常见的有:Java中的对象池、内存池、jdbc连接池、.

2021-11-25 09:21:11 2397 3

原创 代理模式:JDK动态代理和静态代理回顾

好处就是比较灵活,可以在运行的时候才切入改变类的方法,而不需要预先定义它。动态代理一般我们比较少去手写,但我们用得其实非常多。在Spring项目中用的注解,例如依赖注入的@Bean、@Autowired,事务注解@Transactional等都有用到,换言之就是Srping的AOP(切面编程)。这种场景的使用是动态代理最佳的落地点,可以非常灵活地在某个类,某个方法,某个代码点上切入我们想要的内容,就是动态代理其中的内容。

2023-04-04 18:18:29 845 1

原创 Spring切面编程AOP详解

一个系统当中会存在一些系统服务,如:日志、事务管理、安全等。这些服务被称为:交叉业务这些交叉业务几乎是通用的。如果在每一个业务处理过程中,都掺杂着写交叉业务代码进去,存在两方面问题:交叉业务代码在多个业务流程中反复出现,没有得到复用,难维护程序员无法专注核心业务代码的编写,在写业务代码同时还需要处理这些交叉业务▎代码复用性强代码易维护使开发者更关注业务逻辑AOP的七大术语初看这么多术语,一下子都不好接受,慢慢来,很快就会搞懂。① 连接点JoinPoint在程序的整个执行流程中,可以织入。

2023-03-16 18:06:57 962

原创 MacOS Docker 安装和运行原理

本文讲述主要是基于Mac电脑安装教程,使用的是homebrew安装,未安装homebrew的请先自行安装下。

2023-01-18 15:22:37 2648 1

原创 为什么要使用消息队列?

针对于同步的通信方式来说,异步的方式,可以让上游快速成功,极大提高了系统的吞吐量。而且在分布式系统中,通过下游多个服务的分布式事务的保障,也能保障业务执行之后的最终一致性。同步的通信方式会存在性能和稳定性的问题。......

2022-08-03 22:04:37 1484

原创 SpringBoot整合Druid数据源

Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。

2022-07-24 21:10:37 588 2

原创 SpringBoot整合JDBC使用

对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。

2022-07-24 20:29:57 2989

原创 Java8新特性——Stream流式计算

一、Java 8 StreamStream流,可以让你以一种声明的方式处理数据。大致运用于集合类的操作,极大的提高了编程效率和程序可读性。Stream流是一个来自数据源的元素队列并支持聚合操作,元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。数据源流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等.

2022-05-17 15:00:50 1436

原创 【Java8】函数式接口

一、前言早期的程序员在JDK1.5时期,掌握泛型、枚举、反射 基本上就可以了,随着JDK不断迭代升级,到相对于稳定的JDK1.8版本,扩展了大量的知识点,例如:lambda表达式,链式编程,函数式接口,Stream流式计算 这些新知识点的出现大大的简化了编程模型,减少了很多冗余代码,代码简洁,清晰明了,并且在迭代出来的底层架构大量得到了应用,所以,我们必须随着主流进行学习,避免阅读源码时都不知道其意。二、函数式接口(Functional Interface)函数式接口:只有一个方法的接口.

2022-05-17 15:00:30 2975

原创 MySQL存储引擎:InnoDB与MyISAM的区别

存储引擎是数据库的核心,DBMS(数据库管理系统)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。MySQL在5.1之后将InnoDB设为了默认的存储引擎,在5.6支持了全文索引功能。一、查看存储引擎▎查看当前库show engines;✦ 说明:使用上述命令可查看当前数据库支持的存储引擎类型,当前数据库总共支持9种!Support 列的值表示某种引擎是否能使用YES:可以使用 NO:不能使用 DEF.

2022-05-17 14:51:53 378

原创 MySQL进阶 (3):索引的结构优化

什么是索引?在关系数据库中,索引是一种单独的,物理的对数据库表中一列或多列的值进行排序的一种存储结构。用大白话来讲,就是为了加速对表中的数据行的检索,而创建的一种分散的存储结构。索引的目的索引就相当于图书的目录,让你查找书中的某篇文章,不用一页一页的去翻找,而是先从目录大纲中寻找关键字标题,快速定位其文章所在的页码比如,可以把数据库中的 表(table) 当作是一本书,table中一行一行的数据就是书里每篇文章的内容,即row,文章标题可看作是 table 中的 column字段,.

2022-05-17 14:51:30 305

原创 ThreadLocal 简单理解

▎结构理解每个Thread线程内部都只有一个ThreadLocalMap。 Map里面存储线程本地对象ThreadLocal(key)和线程的变量副本(value)。 Thread内部的Map是由ThreadLocal维护,ThreadLocal负责向map获取和设置线程的变量值 一个Thread可以有多个ThreadLocal▎ThreadLocal场景每个线程需要有自己单独的实例 (也可线程内部构建单独的实例,但ThreadLocal更方便) 实例不被多线程共享,但需在多个方法

2022-05-17 09:52:28 872 1

原创 BlockingQueue阻塞队列获取元素4种处理方案

什么情况下我们会使用阻塞队列:多线程并发处理,线程池!阻塞队列 4种解决方案方式 抛出异常 不抛异常,有返回值 阻塞等待 超时等待 添加 add offer put() offer (Timeout) 移除 remove poll take() poll (Timeout) 检测队首元素 element() peek() / / ▶ 1. 抛出异常/** 抛出异..

2022-05-16 17:25:59 2541

原创 CopyOnWriteArrayList了解

前言:CopyOnWriteArrayList是ArrayList的线程安全版本,在写入时会copy一份数据,然后写完再设置成新的数据。适用于读多写少的并发场景▎COWCopyOnWrite 简称COW,写入时复制,是计算机程序设计领域的一种优化策略。核心思想:多个调用者共同去访问一个资源(指向同一个读指针),如果有人试图修改资源的内容,系统会复制一份专用副本给该调用者,去修改这个副本,而对于其他人来说访问的资源还是原来的,不会发生变化。原理:COW的处理过程中需维持一个.

2022-05-16 16:44:42 189

原创 初始redis基础了解

一、了解RedisRedis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询. Redis 内置了 复制(replication), LUA脚本(Lua scripting), LRU驱动事件(

2022-04-21 09:30:15 231

原创 redis启动服务和连接客户端

注意1:不要使用brew service start redis开启服务,会无法关闭!!需要打开“活动监视器” 找到redis服务的进程,用kill -9 [pid名称] 杀死进程!!!注意2:本演示采用的是Mac电脑终端操作,非windows和Linux系统常见命令一、启动服务-- 1.启动服务(此种方式可以不用服务端和客户端开2个窗口)redis-server /usr/local/etc/redis.conf-- 2.启动服务(cd进入 /usr/local/bi...

2022-04-21 09:29:35 1694

原创 Redis三种特殊数据类型——Geospatial地理空间

Redis三种特殊数据类型:bitmaps位图、hyperloglogs基数统计 和 geospatial 地理空间一、介绍Redis GEO 用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。主要应用于:附近的人、定位二、数据结构底层是使用zset进行实现的,zset的命令也可以直接使用。Redis GEO 使用 geohash 来保存地理位置的坐标。三、操作命令命令 功能 描述 geoadd 添加地理位置 ..

2022-04-21 09:27:05 872

原创 Redis三种特殊数据类型——Hyperloglog基数统计

Redis三种特殊数据类型:bitmaps位图、hyperloglog基数统计 和 geospatial 地理空间一、介绍Redis HyperLogLog 是用来做基数统计的,即计算在一批数据中,不重复元素有多少个!应用场景:网站页面用户访问量、日活跃数等优点:极少的内存来统计巨量的数据,12K就能统计 2^64 的数据 缺点:存在一定的误差,误差率为 0.81%;二、操作命令命令 功能 描述 pfadd 添加 往HLL ...

2022-04-21 09:24:55 244

原创 Redis三种特殊数据类型——bitmap位图计算

​Redis三种特殊数据类型:bitmaps位图、hyperloglog基数统计 和 geospatial 地理空间一、介绍位图计算。Redis提供的Bitmaps可以实现对位的操作。Bitmaps本身不是一种数据结构,实际上就是字符串,可以对字符串的位进行操作。可以把Bitmaps想象成一个以位为单位数组,数组中的每个单元只能存0或者1,数组的下标在bitmaps中叫做偏移量。单个bitmaps的最大长度是512MB,即2^32个比特位。优点省空间:基于最小的单位bit进.

2022-04-21 09:23:20 939

原创 Redis-benchmark性能测试工具使用详解

一、说明Redis客户端源码包含一个名为redis-benchmark的性能测试工具,它可以模拟N个客户端同时向Redis发送M条查询命令的应用场景。下载并安装了redis的安装目录就默认有:二、如何使用准备工作:首先依次使用如下命令,分别开启redis服务,和连接客户端(可不连接,主要是确认服务是否能够被连接)-- 1. 开启服务redis-server /usr/local/etc/redis.conf-- 2. 客户端连接服务redis-cli -p 6379.

2022-04-21 09:21:15 7071

原创 redis.conf 配置文件详解——附中文说明

附上redis.conf 文件详解:# Redis配置文件样例# 单位注意事项:当需要内存大小时,可以指定,它以通常的形式 1k 5GB 4M 等等:## 1k => 1000 bytes# 1kb => 1024 bytes# 1m => 1000000 bytes# 1mb => 1024*1024 bytes# 1g => 1000000000 bytes# 1gb => 1024*1024*1024 bytes## 单位不区分大小写,.

2022-04-18 18:32:26 13396 1

原创 Redis进阶——哨兵模式 :命令演示详解

前言主从复制模式虽然能够负载均衡,减轻主机压力,但配置过程中需要注意:一旦主机挂载过多的从节点,当主机故障重启后,多个从节点同时发起复制,导致复制风暴全量复制会触发bgsave,主节点首先需要fork子进程将当前数据保存到RDB文件中,然后再将RDB文件通过网络传输到从节点,那么就会产生2个问题:fork的过程主节点是阻塞的 如果主节点在fork子进程+保存RDB文件时耗时过多,可能会导致从节点长时间收不到数据而触发超时;此时从节点会重连主节点,然后再次全量复制,再次超时.. 造成循.

2022-04-18 18:31:30 4543 1

原创 Redis进阶——发布订阅详解

什么是发布订阅?Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 的 subscribe 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。☛ 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:☛ 当有新消息通过 publish命令发送给频道.

2022-04-18 18:29:01 20834 2

原创 Redis五大数据类型——Zet有序集合

Redis五大数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sorted set:有序集合)。一、介绍Zset 是Set的一个升级版本,他在set的基础上增加了一个顺序属性,每个member成员都带有一个score分数( redis通过分数进行集合内成员的排序)。有序集合的成员是唯一的,但分数(score)却可以重复场景:很适合在打赏日榜、近一周收益这类场景中运用。应用排名模块比较多。二、数据结构底层使用两...

2022-04-15 09:58:53 1678

原创 Redis基本的事务操作

Redis事务的本质:将多个命令打包,然后一次性,按顺序的执行!保证一个队列中,一次性、顺序性、排他性的执行一串命令(作用是防止别的命令插队)一、Mysql事务四大特性理解Redis事务之前,先来复习传统关系性数据库Mysql 中具有事务的四大特性:ACID◈原子性 (Atomicity) 一个事务中的所有操作,要么全部完成,要么全部不完成!如果事务中某条语句执行失败了,前面已经执行了的语句,会回滚到未执行前的状态,就像这个事务从来没有执行过一样。◈ 一...

2022-04-15 09:31:57 408

原创 Redis五大数据类型——Set集合

Redis五大数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sorted set:有序集合)。一、介绍Set 集合用于存储无序且不重复的元素。列表可以存储重复元素,而集合只会存储非重复元素。如添加已存在的元素将被忽略Set 重要的特性:即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。...

2022-04-15 09:22:47 981

原创 Redis五大数据类型——Hash哈希

Redis五大数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sorted set:有序集合)。一、介绍Redis 中的(Hash)类型是一个 String 类型与 field 和 field-value 的映射表,适用于存储对象,将一个对象类型存储在Hash类型中要比存在 String 类型中占用要更小,更加节省内存空间以下是 String 类型和 Hash 类型的结构比较:二、数据结构底层使用两种数据结构存...

2022-04-15 09:22:15 2682

原创 SpringBoot 日志配置使用

目录SpringBoot中的日志使用SpringBoot中的日志设计▎测试Springboot底层日志实现SpringBoot 日志配置文件▎默认配置文件application.properties▎指定配置文件使用SpringBoot解析日志配置☛ 举例说明:SpringBoot 切换日志实现▎切换为log4j2日志▎配置log4j2配置文件SpringBoot中的日志使用SpringBoot框架在企业中的使用越来越普遍,SpringBoot日

2022-04-06 09:25:34 1485

原创 日志实现框架(6):log4j2

日志框架出现的历史顺序:Log4j → JUL → JCL → slf4j → logback → log4j2

2022-04-06 09:25:14 574

原创 日志实现框架(5):logback

是目前比较受欢迎的日志实现框架,很多项目中都在使用,包括SpringBoot,它默认的日志实现就是logback就造成了log4j很少人再使用了,因此apache组织又站出来了,推出了log4j2,功能上它与logback很相似,性能上有很大的提升...

2022-04-06 09:24:58 1272 1

原创 日志门面技术(4):slf4j

前言:JCL淘汰史常见的日志实现:JUL、log4j、logback、log4j2 常见的日志门面:JCL、slf4j为啥日志门面已经有JCL了,还要推出slf4j??JCL设计缺陷当时只考虑了主流的日志框架JUL、Log4j,随着技术的发展,后面会出现很多优秀的日志,这些技术我们要使用的话,它默认是不支持的,就表示我们需要在开发时修改源代码进行扩展,一般在企业开发时我们是不会这么做的,因此JCL就被淘汰了☁ JCL被淘汰了,那么还有谁能站出来帮我们统一管理和维护所有...

2022-04-06 09:24:42 1704

原创 日志门面技术(3):JCL(Jakarta Commons Logging)

目录背景▎ JCL的诞生JCL 是什么?▎快速入门案例JCL原理✈ 源码断点查看执行流程JCL日志门面总结☁ 每日一题:为什么要学习日志门面JCL?背景在前面博文中,我们分别讲述了常用的2个日志框架:JUL(Java Util Logging)、Log4J。那么如何选择使用哪一个呢?根据项目需求而定,在项目设计之初,功能比较单一简单,那么我们可以使用JUL日志框架,使用起来非常灵活,也不需要引入第三方依赖,随着我们项目升级,迭代维护,功能会越来越完善.

2022-04-06 09:24:25 904

原创 JUL日志实现框架:执行原理和流程

▎日志原理解析JUL的执行流程如下:① 初始化LogManagerLogManager加载logging.properties配置 添加Logger到LogManager② 从单例LogManager获取Logger③ 设置级别Level,并制定日志记录LogRecord④ Filter提供了日志级别之外更细粒度的控制⑤ Handler是用来处理日志输出位置⑥ Formatter是用来格式LogRecord的...

2022-04-06 09:24:11 464

原创 JUL日志实现框架:配置文件

目录前言顶级父元素RootLogger 默认设置▎debug断点测试自定义logging.properties文件▎ConsoleHandler 配置★SimpleFormatter数据转换 ▎FileHandler 配置✷ 存在问题:日志内容覆盖前言我们知道自己创建的logger对象,没有继承父元素的话,那其顶级父元素默认就是RootLogger ,它默认日志级别是info,使用的是ConsoleHandler处理器,数据转换用的是SimpleFormatt..

2022-04-06 09:23:54 464

原创 日志实现框架(2):JUL(Java Util Logging)

什么是日志文件日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志,具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用调试日志软件开发中,我们经常需要去调试程序,做一些信息,状态的输出便于我们查询程序的运行状况,为了让我们能够更加灵活和方便的控制这些调试的信息,我们需要专业的日志技术。Java中寻找bug会需要重现。调试也就是debug可以在程序运行中暂停程序运行,可以查看程序在运行中的情况。日志主要是为了更方便的去重现问题。系统日志系统日志是记录系统中硬

2022-04-06 09:23:39 454

空空如也

空空如也

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

TA关注的人

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