自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 资源 (1)
  • 收藏
  • 关注

原创 爬虫问题---ChromeDriver的安装和使用

在浏览器里面输入回车查看浏览器版本Chrome的版本要和ChromeDriver的版本对应,否则会出现版本问题。

2024-07-31 13:17:17 1469

原创 Spring Cloud 组件

Eureka Client 会通过发送rest请求的方式向eureka服务端注册自身元数据:ip地址,端口,运行状况等信息,服务端会把注册信息存储在一个双层map中。 Eureka Client 在拉取服务信息时,先从缓存层获取,如果获取不到,先把数据存储层的数据加载到缓存中,再从缓存中获取。值得注意的是,数据存储层的数据结构是服务信息,而缓存中保存的是经过处理加工过的、可以直接传输到 Eureka Client 的数据结构。 eureka客户端每30秒发送一次心跳来续约,告知此

2024-07-31 10:59:48 1299

原创 redis存储结构

例如,字符串可以是普通的编码(REDIS_ENCODING_RAW),也可以是压缩后的编码(REDIS_ENCODING_EMBSTR 或REDIS_ENCODING_LZF)。在 Redis 中,数据可以是字符串(REDIS_STRING)、列表(REDIS_LIST)、集合(REDIS_SET)、有序集合(REDIS_ZSET)、哈希表(REDIS_HASH)、流(REDIS_STREAM)等类型之一。Redis是一个高性能的键值存储系统,它支持多种类型的数据结构,如字符串、列表、集合、散列等。

2024-07-24 18:22:36 1186

原创 Spring循环依赖详解

在Spring框架中,循环依赖是指两个或更多的Bean相互间直接或间接地依赖对方的情况。这种依赖关系可能导致Bean的实例化过程中出现问题,但Spring通过其内部的处理机制能够解决某些类型的循环依赖。简单的说就是A依赖B,B依赖C,C依赖A这样就构成了循环依赖。

2024-07-22 22:39:54 1047 1

原创 JDK和CGLIB的动态代理详解

1.JDK动态代理: 代理的类必须实现一个接口,因为反射机制生成一个实现被代理接口的匿名类。2.CGLIB动态代理: 动态生成被代理类的子类.JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口,核心是InvocationHandler接口和Proxy类,反射机制生成一个实现代理接口的匿名类,被代理对象必须有其接口。

2024-07-22 17:48:34 284

原创 mysql的B+树索引结构介绍

I InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为1000。: B+树的节点可以存储更多的键值,这意味着每个节点可以包含更多的数据,从而减少了树的深度。例如,如果一个节点可以存储1000个键值,而B树的节点只能存储100个键值,那么B+树的高度将是B树的十分之一左右。

2024-07-19 23:56:55 743

转载 Java线程的6种状态及切换(透彻讲解)

Java中线程的状态分为6种。1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。

2024-07-19 14:28:29 49

原创 关于mysql碎片和数据页分裂问题

1:insert,delete、uodate都可能会产生碎片,浪费空间2:只有insert随机主键时,产生碎片会导致数据页分离。3:碎片多会导致索引数据不集中,影响索引性能。

2024-07-19 11:52:29 1680

原创 线程池---核心方法总结

Worker:内部类,继承了Runnable和AQS,定义了Thread线程对象。ctl:AtomicInteger类型对象,有两层含义:workerCount,表明当前有效的线程数;runState,表明当前线程池的状态,是否处于Running,Shutdown,Stop,Tidying,Terminate五种状态。workQueue:BlockingQueue类型,线程池的队列。mainLock:ReentrantLock类型,线程池的锁。workers。

2024-07-18 23:51:28 1062

原创 线程池 --- 基础总结

通过重用线程池中的线程,来减少每个线程创建和销毁的性能开销。对线程进行一些维护和管理,比如定时开始,周期执行,并发数控制等等。Executor是一个接口,跟线程池有关的基本都要跟他打交道。下面是常用的ThreadPoolExecutor的关系。

2024-07-18 23:22:57 810

原创 volatile关键字解析

volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩。为了能比较清晰彻底的理解volatile,我们一步一步来分析。首先来看看如下代码try {

2024-07-17 22:31:13 621

原创 mysql死锁的场景分析

col_1和col_2为联合索引,遵循最左原则col_1会走索引,但col_2会对整个索引进行扫描,此时会对整个索引加锁。① 锁住zone_id=2对应的间隙锁: zoneId in (1,2)② 锁住索引zone_id=1对应的主键索引行锁id = [1,2]② 锁住索引zone_id=2对应的主键索引行锁id = [3,4]④ 锁住uid=1对应的主键索引行锁: id = [1, 3]④ 锁住uid=2对应的主键索引行锁: id = [2, 4]场景复现操作(几率不高)

2024-07-17 17:54:41 774

原创 RocketMQ集群中的broker挂了会怎样?

Producer 同步发送的情况下会有重试机制,重试时把消息发送到其他 Broker。发送消息的逻辑其实是是一个循环,发送失败后会不断尝试重新发送,对于单边消息是不会重试的,因此对于单边消息,就只能发送失败了。而对于同步消息和异步消息,可以通过重试的方式发送到其他的 Broker 上。RocketMQ 有延迟故障隔离策略,如果发送某一个 Broker 失败了,会将其隔离,优先选择正常的 Broker 发送消息。对于。

2024-07-15 18:29:16 885

原创 搭建自己的OSS文件存储系统--MinIO

MinIO是一款高性能、可扩展的对象存储服务器,专为现代应用设计。它不仅提供了媲美Amazon S3的功能,还通过其轻量级架构和强大的安全措施,成为企业和开发者青睐的选择。

2024-07-12 15:54:38 1754

原创 RocketMQ如何保证消息不丢失+消息重复消费问题

这个问题要从Producer,Consumer和Broker三个方面来回答。1、可以,即发送一条数据等到接受者返回响应之后再发送下一个数据包。如果返回响应OK,表示消息成功发送到了broker,状态超时或者失败都会触发二次重试。2、可以采用。3、如果一条消息发送之后超时,也可以通过查询日志的API,来检查是否在Broker存储成功。总的来说,Producer还是采用同步发送来保证的。1、消息只要持久化到CommitLog(日志文件)中,即使Broker宕机,未消费的消息也能重新恢复再消费。和。

2024-07-11 11:34:16 918

原创 RocketMQ功能介绍

假设一个Topic分配了两个消息队列,生产者在发送消息的时候,可以对消息设置一个路由ID,比如想保证一个订单的相关消息有序,那么就使用订单ID当做路由ID,在发送消息的时候,通过订单ID对消息队列的个数取余,根据取余结果选择消息队列,这样同一个订单的数据就可以保证发送到一个消息队列中,消费者端使用MessageListenerOrderly处理有序消息,这就是RocketMQ的局部有序,保证消息在某个消息队列中有序。该方式的消息可靠性最高,但消息发送效率太低,因为需要同步刷盘,等待ACK的回应。

2024-07-10 17:46:25 749

原创 RocketMQ的消息堆积问题

如果当前Topic的MessageQueue的数量小于或者等于消费者数量,这种情况,再扩容消费者就没什么用,就得考虑扩容MessageQueue。可以新建一个临时的Topic,临时的Topic多设置一些MessageQueue,然后先用一些消费者把消费的数据丢到临时的Topic,因为不用业务处理,只是转发一下消息,还是很快的。:如果当前Topic的MessageQueue的数量大于消费者数量,就可以对消费者进行扩容,增加消费者,来提高消费能力,尽快把积压的消息消费玩。▪ queue扩容,消费端扩容。

2024-07-10 16:55:05 414

原创 mysql 索引下推+索引合并

当你的查询中使用了复合索引,但在过滤条件中并不是使用索引的第一个字段,或者不是一个范围查询时,MySQL优化器可以利用索引下推来进一步减少回表次数。使用了索引下推优化后,上面那个查询在联合索引里匹配到名字是 'LiLei' 开头的索引之后,同时还会在索引里过 滤age和position这两个字段,拿着过滤完剩下的索引对应的主键id再回表查整行数据。如果SQL使用了索引合并,在执行计划explain输出中,type列会显示index_merge,key列会显示所有使用的索引,

2024-07-09 13:36:58 357

原创 redis的内存碎片及优化

其中,info命令可以显示redis服务器的许多信息,包括服务器基本信息、CPU、内存、持久化、客户端连接信息等等;memory是参数,表示只显示内存相关的信息。返回结果中比较重要的几个说明如下:(1):Redis分配器分配的内存总量(单位是字节),包括使用的虚拟内存(即swap);Redis分配器后面会介绍。used_memory_human只是显示更友好。(2):Redis进程占据操作系统的内存(单位是字节),与top及ps命令看到的值是一致的;

2024-07-08 17:15:46 817

原创 redo log和事务的两次提交

当mysql进行写操作时,会优先把数据再去写change buffer,(更新的话,change buffer没有此数据时,会去硬盘里面查出来放到change buffer中,再修改),再写入redo log buffer中。然后在进行的时候,redo log buffer中的数据才会写入redo log日志文件里。注:redo的是记录由“表空间号+数据页号+偏移量+修改数据长度+具体修改的数据”组成。

2024-07-04 13:54:35 611

原创 undo log 日志详解

当事务提交的时候,innodb不会立即删除undo log,因为后续还可能会用到undo log,如隔离级别为repeatable read时,事务读取的都是开启事务时的最新提交行版本,只要该事务不结束,该行版本就不能删除,即undo log不能删除。如果被访问版本的trx_id,大于或等于readview中的max_trx_id值,表明生成该版本的事务在当前事务生成readview后才开启,此时该版本不可以被当前事务访问,需要通过隐藏的回滚指针从undo log中读取历史版本;

2024-07-04 10:47:52 1165

原创 联合索引遇到范围查询(>、<、between、like)的情况

于是,在确定需要扫描的二级索引的范围时,当二级索引记录的 a 字段值为 1 时,可以通过 b = 2 条件减少需要扫描的二级索引记录范围(b 字段可以利用联合索引进行索引查询的意思)。由于联合索引(二级索引)是先按照 name 字段的值排序的,所以前缀为 ‘j’ 的 name 字段的二级索引记录都是相邻的, 于是在进行索引扫描的时候,可以定位到符合前缀为 ‘j’ 的 name 字段的第一条记录,然后沿着记录所在的链表向后扫描,直到某条记录的 name 前缀不为 ‘j’ 为止。注意, j 是闭区间。

2023-11-27 23:16:29 3445 11

原创 Mysql结构及过程

当使用带有事务的存储引擎时(例如innodb),所有未提交事务的二进制日志记录会被记录到一个缓存中,提交事务后,直接将缓存中的日志写入二进制日志文件,此缓存默认32k.是基于会话(session)实现的,也就是说当一个线程开启一个事务,mysql会自动分配一个缓存,该值设置要小心,不能过大。咱们先从一个例子开始。同样的,如果有请求来修改数据,MySQL并不会直接去修改磁盘,而是会修改已经在缓冲池的页中的数据,然后再将数据刷回磁盘,这就是缓冲池的作用,加速读,加速写,减少与磁盘的IO交互。

2023-11-27 12:37:27 190

原创 Explain详情

只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引,一般就是在你的where语句中出现between、< 、>、in等的查询,这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。:显示可能应用在这张表中的索引,一个或多个。实际使用的索引,如果为NULL,则没有使用索引。

2023-11-26 23:10:06 90

原创 RocketMQ 详解

Producer对于消息的发送方式也有多种选择,不同的方式会产生不同的系统效果。同步发送消息同步发送消息是指,Producer发出⼀条消息后,会在收到MQ返回的ACK之后才发下⼀条消息。该方式的消息可靠性最高,但消息发送效率太低,因为需要同步刷盘,等待ACK的回应。// 设置当发送失败时重试发送的次数,默认是2次// 设置发送超时时间,默认3秒// 开启生产者// 模拟发送100条消息i < 100;i++) {// 为消息指定key// 发送消息// 关闭生产者。

2023-11-23 11:48:20 1644

原创 top 命令:CPU使用率、内存使用率、磁盘使用率

top 命令:CPU使用率、内存使用率、磁盘使用率查看

2023-10-12 11:47:46 764

原创 检验你代码基础的时候到了

执行结果:5执行结果:false执行结果:会不会有人说是4呢?其实不然,这个涉及到ascii码的转化问题,5的ascii码是53,所以a=53-1,来 看一下结果:会比最大1吗?不是的,像是一个循环,又从最小值开始了。a,b的结果是多少????大家可能都认为是500吧,那你就错了,看一下结果:为什么呢?那是因为对于Unicode 编码的存在,Unicode 编码在代码中即使被注释掉也可能会影响代码执行。看着一行, Integer b = new Integer(500); // \u0

2022-07-13 11:11:49 147 2

原创 synchronized锁详解

对象头 MarkWord对象头,8字节。包括了对象的hashCode、对象的分代年龄、锁标志位等。结构如下图所示:类指针classPointer数组长度实例数据 Instance Data对齐补充 Padding例题补充偏向锁定义偏向锁加锁过程偏向锁释放锁过程轻量级锁定义轻量级锁加锁过程轻量级锁释放锁过程轻量级锁主要有两种重量级锁定义重量级锁加锁过程重量级锁释放锁过程附加例题注:...

2022-07-13 10:11:44 1509

原创 mysql 死锁分析

二、 死锁产生的四个必要条件下列方法有助于最大限度地降低死锁:虽然不能完全避免死锁,但可以使死锁的数量减至最少。将死锁减至最少可以增加事务的吞吐量并减少系统开销,因为只有很少的事务回滚,而回滚会取消事务执行的所有工作。由于死锁时回滚而由应用程序重新提交。(1)按同一顺序访问对象。如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。例如,如果两个并发事务获得 Supplier 表上的锁,然后获得 Part 表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在 Supplier 表上。第一

2022-07-10 14:36:06 10428

后端开发+redis+详细了解

后端开发+redis+详细了解

2022-07-06

空空如也

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

TA关注的人

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