自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Flink 是什么

Flink就是一个大数据处理引擎的处理框架,是针对流进行的处理.它是 Apache 旗下的一个框架和分布式的处理引擎,用于对无界和有界的数据进行状态的计算。整体框架:应用场景:Flink保证的就要有:低延迟、高吞吐、结果的准确性和良好的容错性。

2023-03-25 23:21:50 1806 1

原创 Kafka的数据消费过程以及消息不丢失机制

生产者通过分区的 leader 写入数据后,所有在 ISR 中 follower 都会从 leader 中复制数据,这样,可以确保即使 leader 崩溃了,其他的follower的数据仍然是可用的。说明:如果 broker 迟迟不给 ack,而 buffer 又满了,开发者可以设置是否直接清空 buffer 中的数据。在所有消费队列当中,在消费数据的流程分为两种:推模式(push)、拉模式(pull)在消费者消费数据的时候,只要每个消费者记录好offset值即可,就能保证数据不丢失。...

2022-08-28 23:00:30 1306

原创 Kafka 数据存储形式以及数据清理

在Kafka当中数据是以日志的形式存在的。Kafka 的存储日志日志的观察模式日志写入模式日志读写模式删除消息

2022-08-28 22:59:45 2480

原创 Kafka中 leader 的选举和负载均衡

在实际环境中,leader有可能会出现一些故障,所以 Kafka 一定会选举出新的 leader。而在Kafka中,把 follower 可以按照不同状态分为三类——AR、ISR、OSR。分区的所有副本统称为 AR(Assigned Replicas——已分配的副本)所有与 leader 副本保持一定程度同步的副本(包括 leader 副本在内)组成 ISR (In-Sync Replicas——在同步中的副本)由于follower副本同步滞后过多的副本(不包括 leader 副本)组成 OSR(O

2022-08-27 12:39:48 533

原创 Kafka的分区和副本机制

生产者写入消息到topic,Kafka将依据不同的策略将数据分配到不同的分区中。轮询分区策略随机分区策略按key分区分配策略自定义分区策略

2022-08-26 22:39:57 1935

原创 Kafka的基本结构以及幂等性和事务

Sequence Number在ACK 返回成功接收后,才会递增一下,而在broker当中若是查到当前Sequence Number的小于等于上一次,就选择不会保存。Kafka事务指的是生产者生产消息以及消费者提交 offset 的操作可以在一个原子操作中,要么都成功,要么都失败。如果,某个系统是不具备幂等性的,如果用户重复提交了某个表格,就可能会造成不良影响。拿 http 举例来说,一次或多次请求,得到地响应是一致的(网络超时等问题除外),换句话说,就是执行多次操作与执行一次操作的影响是一样的。.....

2022-08-26 20:45:44 528

原创 了解 Kafka

传统定义:Kafka是一个分布式的基于发布/订阅模式的消息队列,主要用于大数据实时处理领域。发布/订阅:消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者指接受自己感兴趣的消息。戳这里:了解消息队列现在的定义:Kafka是一个开源的分布式事件流平台(Event Streaming Platform),被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。

2022-08-24 18:38:36 346

原创 消息队列是什么

在像双11 的时候秒杀等系统的时候,用户直接访问数据库,数据库一时接受到大量的数据请求,就会压垮数据库,所以在这个时候加入消息队列,用消息队列的大吞吐量,快速处理用户的请求(哪怕是Redis还不足够应对这种大数据访问)。使用消息队列可以实现系统与系统之间的解耦,比如 买票系统中买票,用户是不直接调用数据库系统的接口,而是把订单信息放到消息队列当中,然后数据库系统从消息队列当中拿去信息,然后再去减库存信息。消息发送者生产消息发送到消息队列当中,然后消息接收者从消息队列中取出并且消费信息。

2022-08-24 16:10:06 2654

原创 单例设计模式--创建者模式

这个方式在成员位置声明Singleton类型的静态变量,并没有进行对象的赋值操作,当调用 getInstance() 方法获取 Singleton 类的对象的时候才创建Singleton 类的对象,这样就实现了懒加载的效果。双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检测锁模式看上去完美无缺,其实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问题的原因是 JVM 在实例化对象的时候会进行优化和指令重排序操作。instance对象是随着类的加载而创建的。...

2022-08-13 17:07:41 179

原创 Redis 的内存策略

内存过期:是设置一个key的过期时间,到过期时间的时候,我们就可以向办法将其删除。删除的策略是由两种的,一种是惰性删除,就是在访问的那一刻,检查一下是否过期,若是过期,就删除,若没有过期,就正常访问。另外一种是周期性删除,就是一个定期的任务,没隔一段时间,就尝试去清理一些过期的 key。这就是过期策略。...

2022-08-06 17:58:19 991

原创 Redis 通信协议 -- RESP

因此客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规范就是通信协议。而在Redis中采用的是 RESP(Redis Serialization Protocol)协议。

2022-08-04 20:07:47 453

原创 Redis是单线程吗?以及为什么使用单线程(Redis 的网络模型)

如果仅仅聊Redis的核心业务部分(命令处理),它当然是单线程的。 如果是聊整个Redis,那么答案就是多线程。

2022-08-04 18:13:24 1945 1

原创 从底层看 Redis 的五种数据类型

如果存储的字符串是整数值,并且大小在LONG_MAX范围内,则会采用INT编码:直接将数据保存在RedisObject的ptr指针位置(刚好8字节),不再需要SDS了。当存储的所有数据都是整数,并且元素数量不超过 set-max-intset-entries 时,Set 会采用 IntSet 编码,以节省内存空间。QuickList:LinkedList + ZipList,可以从双端访问,内存占用较低,包含多个ZipList,存储上限高。为了查询效率和唯一性,SET 采用 HT 编码(Dict)。...

2022-08-03 20:46:53 370

原创 Redis 底层的数据结构

Dict的结构它是类似java的HashTable,底层是数组加链表来解决哈希冲突Dict中是包含两个哈希表,ht[0]平常用,ht[1]用来rehash时使用的当LoadFactor大于5或者LoadFactor大于1并且没有子进程任务时,Dict扩容扩容大小为第一个大于等于used+1的2^n当LoadFactor小于0.1时,Dict收缩收缩大小为第一个大于等于used的2^nDict采用渐进式rehash,每次访问Dict时就执行一次rehash;......

2022-08-01 07:16:47 328

原创 力扣、752-打开转盘锁

比如,从“0000”开始,转一次,会出现“1000”、“9000”、“0100”、“0900”、“0010”、“0090”、“0001”、“0009”这样共8种情况。输入deadends=[“8887”,“8889”,“8878”,“8898”,“8788”,“8988”,“7888”,“9888”],target=“8888”可能的移动序列为“0000”->“1000”->“1100”->“1200”->“1201”->“1202”->“0202”。...

2022-07-31 13:54:11 293

原创 Java 通过回溯实现 全排列 和 N皇后问题

路径就是已经做出的选择选择列表当前还可以做的选择结束条件达到决策树的底层,也就是做完了所有的决策,没有条件了。下来就看具体的题目。

2022-07-30 10:52:49 386 1

原创 Redis 的分布式缓存

如果master继续写入新数据,其offset就会覆盖旧的数据,直到将slave现在的offset也覆盖,那么此时如果slave想要恢复,就需要同步,却发现自己的offset都没有了,无法完成增量同步了。哨兵模式就是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。主从模式很好的解决了数据备份问题,并且由于主从服务数据几乎是一致的,因而可以将写入数据的命令发送给主机执行,而读取数据的命令发送给不同的从机执行,从而达到读写分离的目的。......

2022-07-17 10:55:10 1472 1

原创 Redis 的 Java 客户端

在这我就主要介绍的是 Jedis 和 SpringDataReids 的客户端创建一个 maven 工程。首先在 maven 中引入依赖先新建一个单元的测试类:测试前的初始化:测设内容:测试内容结束后的一些操作(释放资源):执行结果就为:用 Hash 类型的数据再测试一下:也都是没有问题的。但在这里我们就要考虑一个问题了:Jedis 本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用 Jedis连接池代替 Jedis 的直连方式。创建一个 Jedis 自带的连接池,

2022-07-15 14:17:48 393

原创 初始 Redis(认识Redis以及常见命令)

Redis是一个key-value的数据库,key一般是字符串,而value包含有很多不同的数据类型数据结构基本类型StringHash{name18}ListSet{A,B,C}SortedSet{A1,B2,C3}特殊类型GEO{ABitMapHyperLogRedis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网https可以查看到不同的命令。KEYS查看符合模板的所有keyDEL删除一个指定的key。...

2022-07-14 21:34:03 516

原创 怒肝两万字 Java 中的 IO(详细篇)

I/O模型:就是用什么样的通道或者说是通信模式和架构进行数据的传输和接受,很大程度上决定了程序通信的性能,在Java 当中一种支持 3 种 IO模型。BIO、NIO、AIO在实际通信需求下,要根据不同的业务场景和性能需求决定选择不同的 IO 模型。Java BIO:同步并阻塞的(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有链接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情就会造成不必要的线程开销。BIO 方式主要适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比

2022-07-11 21:40:08 668 2

原创 操作系统的中的 IO

IO 全称为 Input/Output ,翻译过来就是 输入/输出。计算机角度的 IO我们日常所说的输入输出,比较直观的意思就是计算机的输入/输出,计算机就是主体。在计算机当中我们可以分为 5 个部分:运算器、控制器、存储器、输入十本、输出设备。输入设备是向计算机输入数据和信息的设备,键盘,鼠标都是属于输入设备;输出设备是向计算机硬件系统的终端设备,用于接收计算机数据的输出显示。像显示器、打印机就都是属于输出设备。操作系统角度的 IO我们要将内存中的数据写入到磁盘的话,那么主体就是一个程序。操作系统

2022-07-07 18:33:00 2487 1

原创 多线程的上下文切换以及线程调度问题和算法

CPU 利用时间片轮询来为每个任务都服务一定的时间,然后把当前任务的状态保存下来,继续服务下一个任务。任务的状态保存及再加载的过程叫做线程的上下文切换。进程:指一个运行中的程序的实例。在一个进程内部可以有多个线程同时运行,并与创建它的进程共享同一地址空间(一段内存区域)和其他资源。上下文:指线程切换时 CPU 寄存器和程序计数器所保存的当前线程的信息寄存器:指 CPU 内存容量较小但速度很快的内存区域(与之对应的是 CPU 外部相对较慢的 RAM 主内存)。寄存器通过对常用值(通常是运行的中间值)的快速访问

2022-06-28 19:13:01 1620

原创 线程终止的 4 种方式

这个也是最常见的,指线程体执行完成,线程自动结束。在一般情况下,在 run 方法执行完毕的时候,线程会正常结束。然而,有些线程是后台线程,需要长时间运行,只有在系统满足某些特殊条件后,才能退出这些线程。这时可以使用一个变量来控制循环,比如设置一个 Boolean 类型的标志,并通过设置这个标志为 true 或 false 来控制 while 循环是否退出。在上面的代码中定义了一个退出的表示 exit,exit 的默认值为 false。在定义 exit 时使用了一个 Java 的关键字 volatile,这

2022-06-27 21:00:56 5559

原创 线程的生命周期以及其中的方法

线程的生命周期分为新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)这 5 种状态。在系统运行过程当中不断会有新的线程被创建,旧的线程在执行完毕后被清理,线程在排队获取共享资源或者锁时将被阻塞,因此运行中线程就是在就绪、阻塞、运行状态之间来回切换。线程的具体状态转换流程如下图所示:其执行流程:新建状态 New在 Java 当中使用 new 关键字创建了一个线程,新创建的线程将处于新建状态。在创建线程的时候主要是为线程分配内存并初始化其成员变量的值。

2022-06-27 17:55:55 2634 1

原创 Java 线程池的工作原理

Java 线程池主要是用于管理线程组及其运行状态,以便 Java 虚拟机更好地利用 CPU 资源。Java 线程池的工作原理为:JVM 先根据用户的参数创建一定数量的可运行的线程任务,并将其放入队列当中,在线程创建好后启动这些任务,如果正在运行的线程数量超过了线程池的最大线程数量(线程池的数量是用户自己设置的),那么超出的数量的线程排队等待,在有任务执行完毕后,线程池调度器会发现有可用的线程,进而再次从队列中取出任务并执行。线程池的主要作用就是线程复用,线程资源管理,控制操作系统的最大并发数,以保证系统的

2022-06-22 14:25:53 5464

原创 Java并发中的CountDownLatch、CyclicBarrier以及Semaphore

CountDownLatch 类是位于 java.util.concurrent 包下的,是一个同步工具类,允许一个或多个线程一起等待其他线程的操作执行完成后再执行相关操作。CountDownLatch 是基于线程计数器来实现并发访问控制的,主要用于主线程等待其他其他子线程都执行完毕后执行相关操作。其使用过程为:在主线程中定义 CountDownLatch, 并将线程计数器的初始值设置为子线程的个数,多个子线程并发的执行,每个子线程在执行完毕后都会调用 countDown 函数将计数器的值减 1,直到线程

2022-06-15 19:44:37 477

原创 i++是安全的吗?AtomicInteger解决这个安全问题。

一个简单的 i++ 操作,看似简单,但是它的底层是由三条 CPU 指令完成的,但正是 i++ 是没有原子性确定的,在底层运行当中就可能会有 CPU 的调度产生,造成 i 的值被修改,造成脏读脏写。volatile 是不能解决这个问题的,因为 i++ 不安全是因为原子性的问题,volition 只能保证线程的可见性和有序性。在解决这个问题的时候,可以使用 synchronized 或者 ReentrantLock 都是可以解决这个问题的,在这一般使用的是 synchroni......

2022-06-13 20:07:43 327

原创 力扣 1385、两个数组间的距离值(Java二分法解决)

给你两个整数数组 arr1 , arr2 和一个整数 d ,请你返回两个数组之间的 距离值 。「距离值」 定义为符合此距离要求的元素数目:对于元素 arr1[i] ,不存在任何元素 arr2[j] 满足 |arr1[i]-arr2[j]|

2022-06-13 12:49:36 285 2

原创 万字讲清 synchronized 和 ReentrantLock 实现并发中的锁

synchronized 和 ReentrantLock 是用来实现并发操作中的锁机制。synchronized关键字用于为 Java 对象、方法、代码块提供线程安全的操作。synchronized属于独占式的悲观锁,同时属于可重入锁。在使用 synchronized修饰对象的时候,同一时刻只能有一个线程对该对象进行访问;在synchronized 修饰的方法、代码块时,同一个时刻只能有一个线程执行该方法体或方法块,其他线程只有等待当前线程执行完毕并释放资源后才能访问该对象或执行同步代码块。synchr

2022-06-12 21:49:18 514 1

原创 什么是CAS 以及 CAS 中的 ABA 问题

原子类的原子性是通过 volatile + CAS 来实现原子操作的。CAS(Compare And Swap)是指比较并交换。CAS算法 CAS(V,E,N)包含有3参数,V 表示要更新的变量,E 表示预期的值,N 表示新值。在且仅在 V 值等于 E 值时,才会将 V 值设为 N, 如果V 值和E 值不同,则说明已经有其他线程做了更新,当前线程什么都不做。最后,CAS返回当前 V 的真实值。这种做法的效率是高于加锁的,当 V 和E 判断不一样的时候,也就不更新值,也不会发送阻塞,继续获得CPU的执行权,继

2022-06-09 22:00:10 896

原创 Java中的锁详解篇

在Java中的锁主要是用于保障线程在多并发的情况下数据的一致性。就是实现并发的原子性。在多线程编程中为了保证数据的一致性,我们通常需要在使用对象或者调用方法之前加锁,这时如果有其他线程也需要使用该对象或者调用该方法,则首先要获得锁,如果某个线程发现锁正在被其他线程使用,就会进入阻塞队列等待锁的释放,直到其他线程执行完成并释放锁,该线程才有机会再次获取锁并执行操作。这样做可以保障了在同一时刻只有一个线程持有该对象的锁并修改该对象,从而保障数据的安全性。在Java当中有很多锁的名次,这些并不时全指锁,有的指所得

2022-06-08 22:17:08 5160 1

原创 Java并发中volatile关键字

在并发编程中synchronized是阻塞式同步,在线程竞争激烈的时候,它会升级为重量级锁,而volatile是Java虚拟机提供的最轻量级的同步机制。在Java内存模型当中,告诉我们,各个线程会将共享变量从主存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。那在线程的工作内存进行操作后何时会写的主存中?这个时机对普通变量是没有规定的,而针对volatile修饰的变量Java虚拟机给予了特殊的约定。因为在访问volatile 修饰的变量的时候,是不会执行加锁操作的,所以也意味着不会执行线程

2022-06-06 20:56:18 377

原创 详说Java内存模型(JMM)

Java内存模型就是(Java Memory Model),它规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机就是一个完整的计算机的模型,因此这个模型自然也包含了一个内存模型——就称为Java内存模型。通俗来说,JMM是一套多线程读写共享数据时,对数据的可见性,有序性和原子性的规则。在硬件的发展当中,一直都存在着一个矛盾,在CPU、内存、I/O设备的速度差异。默认的排序为:CPU > 内存 > I/O设备所以为了平衡这三者的速度差异,就做了一写优化:在CPU中添加寄存器,以均衡内存与CPU

2022-06-04 09:54:56 1269 1

原创 进程与线程以及Java内存模型概述

进程指程序指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU中,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的当一个程序在被运行的时候,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以试为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、浏览器、WPS等),也有的程序只能启动一个实例进程(安全卫士、QQ音乐等)线程一个进程是可以划分为一到多个线程的。一个线程就是一个指令流,将指令流中的一条条

2022-06-03 15:35:27 229

原创 Java中的多线程

多线程是指程序当中包含多个执行单元,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个线程创建多个并行执行的线程来完成各自的任务。何时需要多线程程序需要同时执行两个或多个任务。程序需要实现一些需要等待的任务时,如用户输入、文件读写操作、网络操作、搜索等。需要一些后台运行的程序时。多线程的优点提高程序的响应提高CPU的利用率改善程序的结构,将复杂的任务分为多个线程,独立运行。多线程的缺点线程也是程序,所以线程也是需要占用内存,线程越多占用内存也是越多的。多线程是需要协调和管理,所

2022-06-03 08:16:57 998 1

原创 品谈Java中的线程

程序(program)是为完成特定的任务、用某种语言编写的一组指令的集合。即指一段静态的代码进程(process)就是正在执行的程序,从Windows角度来讲,进程就是操作系统进行资源分配的最小单位。线程(thread)进程可进行进一步的细化,它是进程内部最小的执行单元,是操作系统进行任务调度的最小单位,隶属于进程。注意:很多时候说的多线程是模拟出来的,真正的多线程是指有多个CPU,即多核。如服务器。如果是模拟出来的多线程。即在一个CPU的情况下,在同一时间点,CPU只能执行一个代码。但因为切换

2022-06-02 21:10:42 127

原创 Java当中的泛型

在Java推出泛型以前,程序员是可以构建一个元素为Object的集合,该集合是能够存储任意的数据类型对象的,而在使用该集合的过程当中的时候,是需要程序员明确的指定存储每个元素的数据类型,否则是很容易出现ClassCastException异常的。而Java中的泛型(generics)是jdk5中引入的一个新特性,泛型提供了编译时类型安全监测的机制,该机制允许我们在编译时就监测到非法的类型数据结构。泛型的本质就是参数化类型,也就是所操作的数据类型被指定为一个参数。泛型的优点:它使得类型成为安全的

2022-05-29 15:23:41 592

原创 Java中的异常处理

在Java当中,所有的异常都有一个共同的祖先java.lang包中的Throwable类。Throwable:当中有两个重要的子类:Exception(异常)和Error(错误)。二者都是Java异常处理的重要子类,各自都包含有大量的子类。其中最为重要的两个子类:Exception(异常)和Error(错误),二者都是Java当中异常处理的重要子类。Error(错误)这个是程序无法处理的错误,表示运行应用程序中较为严重的问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM出现的问题。

2022-05-26 18:35:37 351 2

原创 设计模式是什么

设计模式就是在前人的总结之下形成的一种编程思想。在随着软件工程的不断演进,针对不同的需求,新的设计模式在不断的被提出,但设计模式的原则是不会改变的。所以在基于设计模式的原则,我们可以使用已有的设计模式,也可以根据当前产品或项目的开发需求在已有的设计模式上进行组合、改造或重新设计自己的设计模式。

2022-05-22 21:40:30 408 1

原创 collection和collections区别

Collection它是一个集合的接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在java类库当中有很多具体的实现。Collection接口的意义就是为各种具体的集合提供最大化的统一操作方式。主要实现的Collection接口的类有:Set、List、QueueColeections它是一个包装类。它包含了各种有关集合操作的静态多态方法。这个类是不能喝实例化的,就像Arrays类一样,是一个工具类,服务于Java当中的Collection框架

2022-05-21 21:56:05 1017

空空如也

空空如也

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

TA关注的人

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