- 博客(50)
- 收藏
- 关注
原创 kafka如何保证消息不被重复消费
(1)kafka有个offset的概念,当每个消息被写进去后,都有一个offset,代表他的序号,然后consumer消费该数据之后,隔一段时间,会把自己消费过的消息的offset提交一下,代表我已经消费过了。下次我要是重启,就会继续从上次消费到的offset来继续消费。但是当我们直接kill进程了,再重启。这会导致consumer有些消息处理了,但是没来得及提交offset。等重启之后,少数消息就会再次消费一次。
2022-11-29 22:09:45
4043
原创 threallocal详解
一、ThreadLocal简介多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一乐ThreadLocal
2021-04-07 11:03:10
603
4
原创 volatile的作用及原理
前言voliate关键字的两个作用:1、 保证变量的可见性:当一个被volatile关键字修饰的变量被一个线程修改的时候,其他线程可以立刻得到修改之后的结果。当一个线程向被volatile关键字修饰的变量写入数据的时候,虚拟机会强制它被值刷新到主内存中。当一个线程用到被volatile关键字修饰的值的时候,虚拟机会强制要求它从主内存中读取。2、 屏蔽指令重排序:指令重排序是编译器和处理器为了高效对程序进行优化的手段,它只能保证程序执行的结果时正确的,但是无法保证程序的操作顺序与代码顺序一致。这在单线程
2021-04-06 22:17:56
3346
转载 synchronized实现同步的原理和锁状态
一、synchronized实现同步的原理我们需要了解两个重要的概念:“Java对象头”、“Monitor”。1.对象头synchronized是悲观锁,在操作同步资源之前需要给同步资源先加锁,这把锁就是存在Java对象头里。我们以Hotspot虚拟机为例,Hotspot的对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针)。Mark Word:默认存储对象的HashCode,分代年龄和锁标志位信息。这些信息都是与对象自身定义无关的数据,所以Mark W
2021-04-06 17:48:22
332
原创 线程池参数如何设置?
前言着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。线程池参数配置方案显得十分重要。一、参数设置的传统方案调研了以上业界方案后,我们并没有得出通用的线程池计算方式。并发任务的执行情况和任务类型相关,IO密集型和CPU密集型的任务运行起来的情况差异非常大,但这种占比是较难合理
2021-04-06 17:05:05
1732
原创 刨析AQS的原理
前言Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单同步框架。一、原理概述AQS核心思想是:如果被请求的共享资源空闲,那么就将当前请求资源的线程设置为有效的工作线程,将共享资源设置为锁定状态;如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。这个机制主要用的是CLH队列的变体实现的,将暂时获取不到
2021-04-06 15:24:42
258
原创 ReentrantLock与synchronized的区别(最直观)
话不多说直接上图:代码更为直观:// **************************Synchronized的使用方式**************************// 1.用于代码块synchronized(this) { for (int i = 0; i < 5; i++) { try { System.out.println(Thread.currentThread().get
2021-04-06 10:20:58
96
原创 redis cluster集群模式简述
前言redis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master;后来为了高可用提出来哨兵模式,该模式下有一个哨兵监视master和slave,若master宕机可自动将slave转为master,但它也有一个问题,就是不能动态扩充;所以在3.x提出cluster集群模式。这种集群模式属于多主多从。一、集群模式的概念Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。Redis 集群不支持那些需要同时处理多个键的 R
2021-04-04 17:35:27
351
原创 ReentrantLock的使用场景
前言这些使用场景都是围绕着ReentrantLock的特性来的,便于理解和使用。一、如果发现该任务已经获得锁并在执行中则不再执行(有状态执行)因为lock锁是可以知道锁状态的。(1)用在定时任务时,如果任务执行时间可能超过下次计划执行时间,确保该有状态任务只有一个正在执行,忽略重复触发。(2)用在界面交互时点击执行较长时间请求操作时,防止多次点击导致后台重复执行(忽略重复触发)。以上两种情况多用于进行非重要任务防止重复执行,(如:清除无用临时文件,检查某些资源的可用性,数据备份操作等)比如:
2021-04-04 16:24:36
1643
1
原创 如何解决幻读?
一.什么是幻读?幻读:一个事务按相同的查询条件重新读取以前的检索过的数据,却发现其他事务插入了满足其条件查询的新数据,这种现象被成为幻读。进行了读取,分别读取了不同的数据,重点在于新增(insert),针对多笔数据。举个例子:事务A对数据进行查询,这时事物B开启,对其中一笔数据进行了新增,然后进行了提交(这里进行了提交),然后事务A又对数据进行了查询,发现查询所得的结果集是不一样的。幻读针对的是多笔记录。读提交(Read Committed)是不足以解决的,需进行Serializable 序列化就能解
2021-04-04 15:43:36
10389
原创 MySQL锁概述
前言根据锁的特性可大致分为以下三类:表级锁:开销小,加锁快;不会产生死锁;锁定粒度大,发生锁冲突的概率最高,并发量最低。行级锁:开销大,加锁慢;会产生死锁,锁定粒度最大;发生锁冲突的概率最低,并发量最高。页级锁:开销和加锁时间介于表锁和行锁之间,会发生死锁,锁定粒度介于表锁和行锁之间,并发量一般。表级锁更适合以查询为主,只有少量按索引条件更新数据的应用。如web应用。行级锁更适合有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如在线事务处理(OLTP)系统。下面重点说一下MYsq
2021-04-04 14:24:01
162
原创 sql语句的执行过程和优化
一、执行过程二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport warningswarnings.filterwarnings('ignore')import sslssl._create_default_https_context = ssl._create_unverified_context2.读
2021-04-02 18:53:14
179
原创 MySql的存储引擎
前言先上个图:一、MySAM1.特点(1) 既不支持事务 也不支持外键(2)具有独立的索引文件,所以查询的性能比较高。(3)采用非聚簇索引,MyISAM的存储文件有三个,后缀名分别是.frm(存储表结构,每个存储引擎都有),MYD(数据文件),MYI(索引文件)数据文件和索引文件可以防止在不同的目录下,平均分布io,获得更快的速度。(4)支持全文检索,支持数据压缩(myisampack -b -f testmysam.MYI)(5)支持表锁,不支持行锁。2.存储格式(1)静态表
2021-04-02 16:41:44
138
原创 MySQL索引详解
前言我们知道,数据库查询是数据库的最主要功能之一。但每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。一、索引的定义索引(Index)是帮助MySQL高效获取数据的数据结构。
2021-04-02 11:08:08
576
原创 数据库三大范式
前言范式是具有最小冗余的表结构。一、第一范式存在非主属性对码的部分依赖关系 R(A,B,C) AB是主键 C是非主属性 B–>C B决定C C部分依赖于B概念:如果关系R 中所有属性的值域都是单纯域(列不可再分),那么关系模式R是第一范式特点:1)有主关键字2)主键不能为空,3)主键不能重复,4)字段不可以再分举例说明:主键重复,cantact可再分应改为:二、第二范式存在非主属性对码的传递性依赖 R(A,B,C) A是码 A -->B ,B–>C定义:如
2021-03-30 12:11:23
459
2
原创 Redis分布式锁和Redlock实现方式
前言随着互联网的兴起,现代软件发生了翻天覆地的变化,以前单机的程序,已经支撑不了现代的业务。无论是在抗压,还是在高可用等方面都需要多台计算机协同工作来解决问题。现代的互联网系统都是分布式部署的,分布式部署确实能带来性能和效率上的提升,但为此,我们就需要多解决一个分布式环境下,数据一致性的问题。当某个资源在多系统之间共享的时候,为了保证大家访问这个资源数据是一致的,那么就必须要求在同一时刻只能被一个客户端处理,不能并发的执行,否者就会出现同一时刻有人写有人读,大家访问到的数据就不一致了(比如:当宝贝库存接
2021-03-29 18:22:05
566
原创 Redis的主从复制和 哨兵模式
前言持久化解决了单机redis的数据保存问题,但是redis还是存在以下两个问题:(1)假如某天这台redis服务器挂了,redis服务将彻底丧失(2)redis的读和写都集中到一台机上,如果请求量比较大时,将可能被击溃解决为了解决上述两个问题,redis提供了主从架构,在主从架构中,主服务器负责写服务,多台从服务器负责读服务,缓解了单个redis服务器的压力;主服务器将所有数据源源不断的同步到从服务器上,一旦主服务器挂了,还有从服务器可以提供服务,redis服务将不会间断。一、主从复制1.概
2021-03-29 17:10:07
155
原创 IO多路复用(select,poll,epoll)详解
前言学习多路复用之前,搞清楚同步,异步,阻塞 非阻塞。点击见详情清楚一些概念:(1) fd全称是file descriptor,是进程独有的文件描述符表的索引(2)recv:int recv(int sockfd,void* buf,int len,unsigned int flags);第一个参数是要读取的套接口文件描述符。第二个参数是保存读入信息的地址。第三个参数是缓冲区的最大长度。第四个参数设置为0。系统调用recv()返回实际读取到缓冲区的字节数,如果出错则返回-1。这样使用上面
2021-03-29 11:22:31
515
原创 Redis的线程模型
前言Redis 快的原因其中有一个是因为使用了合适的线程模型:多路复用单线程一、IO多路复用多路复用是指:I/O :网络 I/O多路:多个 TCP 连接复用:共用一个线程或进程生产环境中的使用,通常是多个客户端连接 Redis,然后各自发送命令至 Redis 服务器,最后服务端处理这些请求返回结果;如图:应对大量的请求,Redis 中使用 I/O 多路复用程序同时监听多个套接字,并将这些事件推送到一个队列里,然后逐个被执行。最终将结果返回给客户端。二、单线程模型1.Redis 中使
2021-03-28 23:40:29
101
原创 综合场景搞清楚同步 异步 阻塞 非阻塞
一、同步和异步同步和异步是指访问数据的一种机制,关注点在于消息通信机制。1.同步(1)描述:发送一个请求,等待返回,再发送下一个请求,同步可以避免出现死锁,脏读的发生。(2)概念:同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。简单来说就是 想要完成B任务,必须先完成 A任务。(3)消息通知:当一个同步调用发出后,调用者要一直等待返回消息(结果)通知后,才能进行后续
2021-03-28 23:08:06
215
原创 Redis高效的数据结构及特殊性
前言一、简单动态字符串1.字符串长度处理字符串在 C 语言中的存储方式,想要获取 字符串的长度,需要从头开始遍历,直到遇到 ‘\0’ 为止redis中用一个 len 字段记录当前字符串的长度。想要获取长度只需要获取 len 字段即可。你看,差距不言自明。前者遍历的时间复杂度为 O(n),Redis 中 O(1) 就能拿到,速度明显提升。如图所示:2.内存重新分配空间预分配对 SDS 修改及空间扩充时,除了分配所必须的空间外,还会额外分配未使用的空间。具体分配规则是这样的:SDS 修改后
2021-03-28 13:12:22
215
1
原创 Java泛型
一、泛型基础说明泛型是JDK1.5的一种新特性,它的本质是参数化类型的应用,也就是说操作的数据类型被指定为一个参数,在用到的时候再指定具体的类型。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类,泛型接口和泛型方法。Java语言中的泛型,它只在程序源码中存在,在编译后的字节码文件中,就已经被替换为原来的原始类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此对于运行期的Java语言来说,ArrayList与ArrayList就是同一个类。所以说泛型技术实际上是Ja
2021-03-27 22:26:00
85
原创 Redis的过期键删除策略和内存淘汰机制
一、过期键的判定通过过期字典,程序可以用以下步骤检查一个给定键的过期时间:(1)检查给定键是否存在于过期字典;如果存在就取出来过期时间;(2)检查当前的UNIX时间戳是否大于键的过期时间,如果是的话,那么键过期,否则键未过期。伪代码过程:二、过期键删除策略1.定时删除(主动删除)需要让服务器创建大量定时器,从而达到定时删除,不现实。一般不用概念:在设计过期时间的时候,创建一个定时器,让定时器在键过期时间来临的时候,执行删除操作。优点:对内存友好,保证内存被尽快释放。缺点:1)若过期k
2021-03-27 15:00:46
292
4
原创 Redis与数据库缓存一致性问题
一、Redis 数据一致性问题产生的原因对 Redis和数据库的操作有 2 种方案:1、先操作(删除) Redis,再操作数据库2、先操作数据库,再操作(删除) Redis上述二种方案,都希望数据操作要么都成功,要么都失败,也就是最好是一个原子操作,我们不希望看到一个失败,一个成功的结果,因为这样就产生了数据不一致的问题。举例说明:假设 Redis 里缓存了一个热点商品数据,有个 key 为 1 的商品名称为“衣服”,数据库里这个 1号的商品名称也是衣服;此时商家觉得商品名称叫衣服有点宽泛,需
2021-03-26 21:40:49
599
原创 jwt实现单点登录,基础讲解加实战!!!
前言1.了解token模式:token (令牌)是一串字符串,通常因为作为鉴权凭据,最常用的使用场景是 API 鉴权。token 通过一次登录验证,得到一个鉴权字符串,然后以后带着这个鉴权字符串进行后续操作,这样就可以解决每次请求都要带账号密码的问题,而且也不需要反复使用账号和密码。一、JWT是什么?1.概念JWT 全称 JSON Web Tokens ,是一种规范化的 token2.组成一个 JWT token 是一个字符串,它由三部分组成,头部、载荷与签名,中间用 . 分隔(1)头部
2021-03-22 11:22:10
1209
6
原创 springBoot自动配置原理
一、自动装配是什么?自动装配就是spring容器启动后,一些自动配置类就自动装配的IOC容器中,不需要我们手动去注入。二、自动配置原理SPI:是server provider interface 的简写,字面意思是服务发现接口,我理解就是第三方拓展API,他是java提出的,即开箱即用的思想。在spring的生态中已经运用得非常多,比如springMVC中官方推荐的去web.xml的方式,用一个onStart的方法就将dispatcherServlet到IOC的容器中,这也是利用了tomcat的SPI
2021-03-20 11:33:41
10231
11
原创 springmvc的运行流程
流程图:整体流程:(1)客户端(浏览器)发送请求,直接请求到 DispatcherServlet(前端控制器)。(2)DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler(Controller 控制器)。(3)解析到对应的 Handler(即 Controller 控制器)后,返回给DispatcherServlet(前端控制器),开始由 HandlerAdapter(控制器适配器)处理。(4)HandlerAdapter 会根据 H
2021-03-19 23:47:11
88
原创 反向代理服务器nginx负载均衡的策略及原理
一、nginx概述1、概念Nginx是一款轻量级的网页服务器、反向代理器以及电子邮件代理服务器。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2、核心特点(1)跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有Windows的移植版本;(2)配置异常简单:非常容易上手。配置风格跟程序开发一样,神一般的配置;(3)非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能够支撑5万并发连接,在实际生
2021-03-19 12:20:09
446
原创 死锁精讲
一、死锁的定义及原因1.定义多个进程因竞争资源形成的一种僵局(互相等待),若无外力作用,这些进程将无法向前推进。2.原因不可剥夺资源的竞争通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在 运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争 才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。进程推进顺序非法进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程 P1、P2分别保持了资源R1、R2,而进程P1申请资
2021-03-18 20:16:41
98
3
原创 程序 进程 线程的区别、联系及通信方式
一、程序是什么?程序(Program)告诉计算机应如何完成一个计算任务,这里的计算可以是数学运算,比如解方程,也可以是符号运算,比如查找和替换文档中的某个单词。从根本上说,计算机是由数字电路组成的运算机器,只能对数字做运算,程序之所以能做符号运算,是因为符号在计算机内部也是用数字表示的。此外,程序还可以处理声音和图像,声音和图像在计算机内部必然也是用数字表示的,这些数字经过专门的硬件设备转换成人可以听到、看到的声音和图像。(做基本了解)二、进程1.概念进程是一个具有一定独立功能的程序在一个数据集上的
2021-03-18 12:30:11
246
原创 UDP \TCP详详详详解,你想要的全都有(呕心沥血)
前言因特网为应用层提供了两种截然不同的可用运输层协议,一个是UDP(用户数据报协议),一个是TCP(传输控制协议),这两种协议无论是在开发过程中,还是面试问答中,都相当重要!!!先了解两个定义:多路分解:将运输层报文段中的数据交付到正确的套接字。多路复用:在源主机从不同的套接字中收集数据块,并位每个数据块加上首部信息(将在以后进行分解)从而生成报文段,并将报文段传递到网络层。一、UDP1.定义UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一
2021-03-17 17:15:54
2715
1
原创 DNS详解
前言DNS:因特网的目录服务因特网的主机和人类一样都有标识信息,主机的标识信息就是主机名,比如:www.facebook.nom。这个名字比较容易记。但因为主机名可能由不定长的字母组成,路由器难以处理,主机也可以用IP地址标识。所以识别主机由两种方式;主机名和IP地址。人们喜欢记忆主机名,路由器喜欢ip地址,便于处理。为了这种不同的偏好,我们需要一种能进行主机名和IP地址转换的目录服务,这就是**域名服务(DNS)**的主要任务。一、DNS提供的服务1、主要服务DNS:(1)一个由分层的DN
2021-03-15 15:59:41
985
原创 JDK1.8的新特性详解
前言现在开发用的最多的就是jdk1.8;因为它具备很多优点:1、速度更快由于底层结构和JVM的改变,使得JDK1.8的速度提高。2、代码更少(增加了新的语法 Lambda 表达式)增加新特性Lambda表达式的内部类改造,使得代码在书写上变得更加简洁3、强大的 Stream API增加了核心功能,使得代码调用方式变得更加简洁4、便于并行5、最大化减少空指针异常 Optional下面说一下它的新特性:一、Lambda 表达式Lambda表达式是jdk1.8里面的一个重要的更新,这意味着
2021-03-13 23:27:27
3034
2
原创 面向对象的理解及相关概念(封装,继承,多态)
前言面向对象程序设计(OOP)是当今主流的程序设计范性,它取代了结构化或过程式编程技术。一、面向对象是什么?1、定义:面向对象就是:把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。对象即为人对各种具体物体抽象后的一个概念,人们每天都要接触各种各样的对象,如手机就是一个对象。java中有一个概念就是万物皆可对
2021-03-13 10:43:34
3650
2
原创 深度优先,广度优先,拓扑排序(实战题解)
前言深度遍历和广度遍历在算法占比很大,主要是解决图的问题(树也是图的一种)一、深度优先遍历1、深度遍历(DFS)解决什么问题DFS解决的是连通性的问题,即给定两⼀个起始点(或某种起始状态)和⼀个终点(或某种最终状态),判断是否有⼀条路径能从起点连接到终点。很多情况下,连通的路径有很多条,只需要找出⼀条即可,DFS 只关⼼路径存在与否,不在乎其⻓短。所以dfs一般都是找路径的2、算法思想:图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。它的思想:假设初始状态是
2021-03-12 10:20:44
3476
原创 String StringBuilder StringBuffer详解
一、String1、基础知识:String不是8种基本类型之一,String是一个对象,因为对象默认值为null,则String默认值也为空,同时也是一个特殊的对象,具备一些特性;(String s=new String()创建的是空串而不是null)。String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的(被finall修饰),所以可以共享。2
2021-03-09 17:13:56
616
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人