自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 React学习笔记(三)Hook使用

自定义 Hook 是一种代码复用的方式,可以将一些重复的逻辑或状态抽象出来,以 Hook 的形式提供给其他组件使用。自定义 Hook 的命名约定是使用 "use" 开头,这样 React 就可以自动检测到这是一个 Hook 进行相关处理。}, []);在其他组件中使用自定义 Hook 时,只需要导入并调用即可。

2023-07-09 13:50:05 782

原创 React学习笔记(二)组件详解

当 React 元素为用户自定义组件时,它会将 JSX 所接收的属性(attributes)以及子组件(children)转换为单个对象传递给组件,这个对象被称之为 “props”。例如,这段代码会在页面上渲染 “Hello, Sara”:element,该段代码执行时发生了以下四步我们调用函数,并传入作为参数。React 调用组件,并将作为 props 传入。组件将元素作为返回值。React DOM 将 DOM 高效地更新为。组件名称必须以大写字母开头。

2023-06-18 16:10:07 1486

原创 React学习笔记(一)DOM、元素

本章介绍了react的dom、元素相关概念,react中元素和组件是最容易混淆的,我们会在接下来的文章中介绍组件。组件是由元素构成的,也是react中最重要的模型/概念。

2023-06-18 14:54:28 1473

原创 Flink学习笔记(七)并行度详解

一个Flink程序由多个任务(Source、Transformation和Sink)组成。一个任务由多个并行实例(线程)来执行,一个任务的并行实例(线程)数目被称为该任务的并行度。

2023-03-27 08:30:00 2818 1

原创 Flink学习笔记(六)Time详解

虽然大部分情况下,传输到Operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络延迟等原因而导致乱序的产生,特别是使用Kafka的时候,多个分区之间的数据无法保证有序。因此,在进行Window计算的时候,不能无限期地等下去,必须要有个机制来保证在特定的时间后,必须触发Window进行计算,这个特别的机制就是Watermark。对于窗口而言它是有生命周期的,只要属于此窗口的第一个元素到达,就会创建一个窗口,当时间(事件或处理时间)超过其结束时间戳加上用户指定的允许延迟时,窗口将被完全删除。

2023-03-26 15:07:49 846

原创 Flink学习笔记(五)窗口详解

Flink中Batch是Streaming的一个特例,因此Flink底层引擎是一个流式引擎,在上面实现了流处理和批处理。而Window就是从Streaming到Batch的桥梁。

2023-03-26 14:00:33 661

原创 Flink学习笔记(四)State管理与恢复

Flink中CheckPoin(检查点)t是Flink实现容错机制的核心功能,它可以在任务执行过程中定期保存任务的状态信息,以便在任务出现故障或程序异常终止时,能够使用最近一次的检查点进行恢复,从而保证数据的一致性和可靠性。Checkpoint的实现方式可以是在内存中创建一个快照,也可以将快照保存到外部存储系统中。Checkpoint的使用可以大大减少任务执行过程中数据的丢失和重复处理,提高任务的可靠性和稳定性。

2023-03-24 09:16:59 932

原创 Flink学习笔记(三)任务之间数据共享机制

Broadcast是指将一个数据集广播到任务的所有并行实例中。在Flink中,可以使用Broadcast机制将小数据集分发到每个任务实例中,以便在任务的运行过程中能够快速访问。Broadcast数据集的大小应该小于可用内存的大小,以防止内存溢出。Flink提供了一个分布式缓存(Distributed Cache),类似于Hadoop,可以使用户在并行函数中很方便地读取本地文件。分布式缓存功能允许有效地在任务和作业运行之间共享数据,减少数据重复和提高性能。

2023-03-13 08:15:00 1383

原创 Flink学习笔记(二)Flink常用API详解

提供了对时间和状态的细粒度控制,简洁性和易用性较差,主要应用在对一些复杂事件的处理逻辑上。

2023-03-12 14:28:26 2246

原创 Flink学习笔记(一)概述

1.Flink是一个分布式流处理框架,它能够在大规模的数据流上进行实时计算和批处理。Flink支持丰富的API,包括DataStream API和DataSet API,可以在多种计算场景中使用,例如实时数据处理、批处理、图形计算和机器学习等。Flink还具有高可用性、低延迟、高吞吐量和高扩展性等特点,是近年来非常流行的数据处理框架之一。

2023-03-12 12:13:51 1674

原创 java 记一次Comparator的踩坑经历

Comparison method violates its general contract!报错问题排查

2022-10-15 15:05:29 1076

原创 记一次频繁fullgc排查到解决全流程复盘

阿里云oss文件上传导致的频繁fullgc问题排查到解决全流程复盘

2022-08-07 18:06:51 4214 8

原创 最新版苹果电脑解决无法根目录创建目录

1.背景:EROFS:read-onlu file system想在苹果电脑上跑一个前端项目报了以下错误定位问题是由于mac系统保护不允许在根目录创建目录2.解决方案:1.低版本的mac可以使用关闭SIP的方法https://jingyan.baidu.com/article/17bd8e52e9cfc5c4aa2bb806.html22.如果上述方法无效的话就需要使用软连接# 创建可用目录(不在根目录下),如mkdir -p ~/test #我本地目录为/Us.

2021-12-15 17:14:21 1501 1

原创 2021年秋招面试真题以及面试技巧分享

一、前言先介绍下自己吧,20届二本院校毕业,java岗,大四上开始实习,毕业一年,两年工作经验,今年秋招也是因为一些原因打算换份工作,我是10月初投的简历,boss投了60多家,面试7家,五家谈offer,一家因为不合适直接放弃了,最终选择是阿里,趁工作交接的空档期总结下整个面试经历吧,方便以后自己看,也是希望帮助到其他人二、面试时间选择面试时间选择真的很重要,金三银四,金九银十真的不是没有道理的,可以在三月份和九月份早一些开始投,如果是社招工作一段时间了在年前一个月也是可以的,竞争会小一些,作

2021-11-10 14:55:44 1499

原创 数据库与缓存数据一致性方法总结

一、背景工作中我们经常会有以下的场景(1)先查缓存,缓存有数据就直接返回(2)缓存没数据就查数据库,数据库有数据返回,并且将数据写入缓存(3)数据库也没有数据就返回空如果只是简单的查询和新增但是这个流程存在几个问题(1)如果需要更新缓存中的数据,更新失败,...

2021-11-08 17:18:20 198

原创 双非秋招四面阿里真实经历分享(已上岸)

一、前言第一次写个人感悟及面试类的文章文采有限多多包涵,不知不觉从大四实习开始已经工作两年,也是因为一些原因打算尝试换一份工作,为了这次秋招面试也是准备的蛮久的,基本上半年前就开始准备了,开始面试的时间选的并不好十一假期结束后才开始面试,基本上就是秋招的尾巴,大概面了六七家吧最终也算是蛮坎坷的上岸阿里,本文主要就分享阿里所有面的经历其他家的面试经历过几天有空时会分享出来,本人目前是实习一年+工作一年二、一面(高p同事面30分钟)一面时说实话当时确实准备还没那么充分,最主要是面试经验十分稀缺,直接

2021-10-30 20:03:11 520

原创 Spring el表达式应用

一、简介Spring的表达式语言,简称SpELl,是一个支持运行时检查和操作对象图的强大的表达式语言,和我们之前学习过的JSP中的EL表达式类似,SPEL使用的是#{}作为定界符,所有在大括号中的字符都被认为的SPEL,SPEL为bean的属性进行动态赋值提供了非常大的便利二、SpringEL的使用(1)通过bean的ID对bean进行引用,类似于 ref标签,比ref更强大(2)可以调用方法以及引用对象的属性// 方法parser.parseExpression("#person.

2021-10-20 11:24:13 735

原创 mysql--乐观锁与悲观锁

先看下之前关于mysql锁的介绍https://blog.csdn.net/zhang09090606/article/details/117105987一、简介:从之前的文章中我们了解到mysql锁按使用方式可以分为乐观锁和悲观锁,也不仅仅是mysql几乎所有涉及锁的地方都分为乐观锁和悲观锁,比如java的lock和cas、synchronized的锁升级、redis的watch乐观锁和Lua脚本实现悲观锁等等,下面将会详细介绍下mysql的乐观锁与悲观锁二、悲观锁悲观锁(Pessimis

2021-10-17 14:24:13 224

原创 equals和==和hashcode的恩怨情仇

一、前言:equals和==和hashcode是java中的基础中的基础,但是确实容易被问到,而且因为工作中经常用所以很容易在复习时遗漏掉,这几天面了个大厂就在这个问题上翻车了,不仅记混了,而且很坚信自己记混的答案,好在其他问题答的不错,加上面试官容忍度高放过一马,所以今天也就详细整理了下它们三个的恩怨情仇二、【==】双等号【==】其实没那么复杂,它的功能就只是比较两边的值是否相等。只是如果变量是引用类型(Integer、String、Object)的话,比较的就是内存地址,因为引用类型变量存.

2021-10-14 14:31:27 150

原创 mysql--执行计划及sql优化

一、如何查看执行计划MySQL 使用explain + sql 语句查看 执行计划,该执行计划不一定完全正确但是可以参考。以这条sql为例SELECT * FROM `dy_push_source` where hotel_id = '60255778'执行计划:二、执行计划字段说明1.select_type查询数据的操作类型SIMPLE 简单查询 PRIMARY 最外层查询 SUBQUERY 映射为子查询 DERIVED 子查询..

2021-10-12 11:19:57 486 1

转载 I/O 多路复用之select、poll、epoll详解

一、简介:select,poll,epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。二、selectint select (int n, fd_set *

2021-10-09 11:47:46 154

原创 五种IO模型详解

一、用户空间和内核空间先介绍一些前提知识点现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称

2021-10-09 09:53:40 591

转载 Java 6种延时队列的实现方法

一、延时队列的应用什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。延时队列在项目中的应用还是比较多的,尤其像电商类平台:1、订单成功后,在30分钟内没有支付,自动取消订单2、外卖平台发送订餐通知,下单成功后60s给用户推送短信。3、如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存4、淘宝新建商户一个月内还没上传商品信息,将冻结商铺等。。。。上边的这些场景都可以应用延时队列解决。

2021-10-06 13:58:49 4870

原创 java标准注解及元注解详解

一、注解定义注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。注解的语法比较简单,除了@符号的使用之外,它基本与Java固有的语法一致。二、标准注解@Override,表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。@Deprecated,如果程序员使用了注解为它的元素,那么编译器会发出警告信息。@SuppressWarnings,关闭不当的编译器警告信息

2021-10-06 13:00:36 227

原创 一致性哈希算法详解

一、什么是哈希散列表,是根据键直接访问在指定储存位置数据的数据结构。通过计算一个关于键的函数也称为哈希函数,将所需查询的数据映射到表中一个位置来访问记录,加快查找速度。这个映射函数称做「散列函数」,存放记录的数组称做散列表。散列函数能使对一个数据序列的访问过程更加迅速有效,是一种空间换时间的算法,通过散列函数数据元素将被更快定位。二、常见的hash算法MD5算法MD5消息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个

2021-10-06 12:28:26 678

原创 spring源码笔记--三级缓存及循环依赖

一、什么是循环依赖?1.场景循环依赖产生的场景平时工作中还是蛮常见,但是因为强大的spring已经帮我们解决了所以我们工作中无感知,如下代码,A类中注入了B类,而B类中注入了A类,这就产生了互相依赖,A类需要B类构建完才能构建,同程B类也依赖于A类构建完@Servicepublic class AServiceImpl implements AService { @Autowired private BService bService; ...}@Service

2021-09-28 17:46:53 276 1

原创 spring源码笔记--bean加载(一)

一、代码入口3.1版本之前获取bean的方式:BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));bf.getBean("testBean");3.1版本之后XmlBeanFactory废弃所以推荐采用ApplicationContext获取bean:本章主要介绍此种获取bean的方式 ApplicationContext applicationContext = new

2021-09-28 17:46:18 163

原创 spring配置bean的三种方式

一、传统的XML配置方式<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.

2021-09-28 17:45:45 522

原创 并发编程--Semaphore信号量

一、简介:Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以 保证合理的使用公共资源。实现其实就是一个共享锁,是基于AQS实现的,通过state变量来实现共享。通过调用acquire方法,对state值减去一,当调用release的时候,对state值加一。当state变量小于0的时候,在AQS队列中阻塞等待二、使用场景:当我们需要对某个任务限制资源使用时,比如我们这个系统 有多个接口,其中一个接口不重要其他接口特别重...

2021-09-27 11:22:59 200

原创 并发编程--CyclicBarrier(线程屏障)详解

一、简介CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一 组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会 开门,所有被屏障拦截的线程才会继续运行。下图演示了这一过程。二、与countdownlatch的区别它的主要作用其实和CountDownLanch差不多,都是让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障会被打开,所有被屏障阻...

2021-09-26 11:33:10 792

原创 并发编程--并发工具类

一、CountDownLatch1.概述CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景。2.常用方法Coun

2021-09-25 12:20:42 226

原创 并发编程--Fork/Join框架

一、简介Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干 个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过Fork和Join这两个单词来理解一下Fork/Join框架。Fork就是把一个大任务切分 为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结 果。比如计算1+2+…+10000,可以分割成10个子任务,每个子任务分别对1000个数进行求和, 最终汇...

2021-09-23 15:21:41 171

原创 并发编程--堵塞队列

一、简介阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞 的插入和移除方法。 1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不 满。 2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是 从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。 二、BlockingQ

2021-09-22 18:45:43 423

原创 并发编程--ConcurrentLinkedQueue详解

一、简介: 工作中有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁 (入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。非阻塞的实现方式则可以使用循环CAS的方式来实现。而ConcurrentLinkedQueue 就是juc包中自带的经典非堵塞方式实现的工具类二、结构ConcurrentLinkedQueue由head节点和tail节点组成,每个...

2021-09-20 15:15:55 9265

原创 并发编程--ConcurrentHashMap的底层实现

一、简介Map 这样的Key Value在软件开发中是非常经典的结构,常用于在内存中存放数据。我们常使用HashMap来实现这种数据结构,但是HashMap是线程不安全的,而使用线程安全的HashTable效率又非常低下,基于以上两个原因,便有了ConcurrentHashMap,它是线程安全且高效的HashMap。二、HashMap 与HashTable简介1.HashMap 在多线程环境下存在的问题1.8之前HashMap 底层是基于数组 + 链表,1.8之后HashMap 数...

2021-09-17 15:32:41 387

原创 并发编程--Java中的锁(二)ReentrantReadWriteLock 源码分析

一、性质:(1)公平性选择:支持非公平性(默认)和公平的锁获取方式,吞吐量还是非公平优于公平;(2)重入性:支持重入,读锁获取后能再次获取,写锁获取之后能够再次获取写锁,同时也能够获取读锁;(3)锁降级:遵循获取写锁,获取读锁再释放写锁的次序,写锁能够降级成为读锁二、继承关系:3....

2021-09-08 08:54:53 83

原创 并发编程--Java中的锁(二)ReentrantLock源码分析

读本文之前需要先了解:1.jdk中锁基础应用https://blog.csdn.net/zhang09090606/article/details/119923448?spm=1001.2014.3001.55012.AQShttps://blog.csdn.net/zhang09090606/article/details/120009379一、ReentrantLock底层实现

2021-09-06 14:18:46 66

原创 并发编程--AQS源码分析

一、简介AQS全称AbstractQueuedSynchronizer,它是为实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量,事件等)提供的一个框架。AQS继承了AbstractOwnableSynchronizer类,这个类为创建锁和相关同步器提供了基础。AQS是Concurrent包的核心,lock就是在AQS的基础上实现的,阻塞队列,线程池,信号量等都离不开AQS的支持。二、Node节点AQS主要是维护了一个队列同步器,而队列中主要是存储Node节...

2021-09-01 10:15:28 141

原创 并发编程--Java中的锁(一)应用

一、Lock接口1.简介 与synchronized类似都是用来控制多个线程访问共享资源的方式,但是它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。 所以在一些需要灵活操作锁的场景时例如先获得锁A,然后再获取锁B,当锁B获得后,释放锁A同时获取锁C,当锁C获得后,再释放B同时获取锁D场景下使用Lock接口就比较合适...

2021-08-30 09:30:41 134

原创 并发编程--线程池

一、为什么要使用线程池?在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念二、线程池参数1、corePoolSize(核心线程数)当向线程池提交一个任务时,若线程池已创建的线程数小于corePoolSize,即便此时存在空闲线程,也会通过创建一个新线程来执行该任务,直到已创建的线程数大于或等于corePoolSize,corePoolSize中的线程即使处于

2021-08-25 09:22:20 454

空空如也

空空如也

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

TA关注的人

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