自定义博客皮肤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)
  • 收藏
  • 关注

原创 BloomFilter 布隆过滤器

如图所示,当字符串存储要加入到布隆过滤器中时,该字符串首先由多个哈希函数生成不同的哈希值,然后将对应的位数组的下标设置为 1(当位数组初始化时,所有位置均为 0)。当第二次存储相同字符串时,因为先前的对应位置已设置为 1,所以很容易知道此值已经存在(去重非常方便)。如果我们需要判断某个字符串是否在布隆过滤器中时,只需要对给定字符串再次进行相同的哈希计算,得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。

2024-07-15 18:19:58 256

原创 ThreadLocal原理及注意点

中就会出现 key 为 null 的 Entry。假如我们不做任何措施的话,value 永远无法被 GC 回收,这个时候就可能会产生内存泄露。没有被外部强引用的情况下,在垃圾回收的时候,key 会被清理掉,而 value 不会被清理掉。方法的时候,会清理掉 key 为 null 的记录。的弱引用,而 value 是强引用。实现中已经考虑了这种情况,在调用。中使用的 key 为。

2024-07-15 18:15:47 332

原创 JAVA对象的创建及内存分配详解

对象头、实例数据和对齐填充。有数组情况下4字节 数组长度。

2024-07-15 18:13:11 993

原创 JDK垃圾回收机制和垃圾回收算法

查看java相关信息UseParallelGC 即 Parallel Scavenge + Parallel Old,再查看详细信息。

2024-07-15 18:10:55 1150

原创 本地缓存Caffeine

入参为一个函数式接口,用于指定每条存入的缓存数据的权重占比情况。设定开启此容器的数据加载与缓存命中情况统计。指定此缓存容器的最大容量(最大缓存记录。待创建的缓存容器的初始容量大小(记录。的逻辑来实现过期处理(可以定制基于。指定此缓存容器的最大容量(最大。等场景的过期策略,甚至支持为。设定过期策略,按照数据最后。不同记录指定不同过期时间。设定过期策略,按照数据。

2024-07-15 17:48:46 293

原创 GC Roots 是什么?

GC Roots 到底是什么东西呢,哪些对象可以作为 GC Root 呢?

2024-07-15 17:45:35 99

原创 JVM参数调优经验

首先既然需要调优那么我们的系统肯定是出现了一些问题。可能会有现象:Tp99分钟响应时间超过300ms,Tp999的毛刺很多,系统率可用率下降。先排除应用代码导致,上游接口的问题,中间件的问题目前各大互联网公司的系统基本都更追求低延时,避免一次 GC 停顿的时间过长对用户体验造成损失,衡量指标需要结合一下应用服务的 SLA,主要如下两点来判断:CMS。

2024-07-15 17:41:26 922

原创 Java垃圾收集器

Java 7 Update 4之后JVM参数:-XX:+UseG1GC也是属于分代垃圾收集。不过不再是之前物理隔阂的分代。之前:现在:G1收集器一次GC(主要值Mixed GC)的运作过程大致分为以下几个步骤:初始标记(initial mark,STW):暂停所有的其他线程,并记录下gc roots直接能引用的对象,速度很快;并发标记(Concurrent Marking):同CMS的并发标记最终标记(Remark,STW):同CMS的重新标记。

2024-07-15 17:37:49 752

原创 Java AQS 核心数据结构

CLH 锁是对自旋锁的一种改进,是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系),暂时获取不到锁的线程将被加入到该队列中。在 CLH 队列锁中,一个节点表示一个线程,它保存着线程的引用(thread)、 当前节点在队列中的状态(waitStatus)、前驱节点(prev)、后继节点(next)。AQS 核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。修饰,用于展示当前临界资源的获锁情况。

2024-07-15 17:33:10 333

原创 线程池参数设置

内部是通过队列+线程实现的,当我们利用线程池执行任务时,如果此时线程池中的线程数量小于corePoolSize(核心线程数),即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务,如果此时线程池中的线程数量等于corePoolSize,但是阻塞队列(LinkedBlockingQueue)未满,那么任务被放入阻塞队列。如果此时线程池中的线程数量大于等于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolize,建新的线程来处理被添加的任务。

2024-07-15 17:29:12 372

原创 redis实现可重入锁

原理:1、原理。

2024-07-15 17:24:31 264

原创 Redis的热key解决

当某一热点 Key 的请求在某一主机上超过该主机网卡上限时,由于流量的过度集中,会导致服务器中其它服务无法进行。

2024-07-15 17:17:07 1272

原创 如何保证数据库和redis的数据一致性

1、简介在客户端请求数据时,如果能在缓存中命中数据,那就查询缓存,不用在去查询数据库,从而减轻数据库的压力,提高服务器的性能。

2024-07-15 17:15:25 451

原创 Redis中lua脚本和pipeline的区别

一、lua脚本一般我会用lua脚本来代替。官方默认lua脚本是原子性的,应该是和MySQL的原子行差不多的。lua脚本的所有命令要么全部执行成功要么全部执行失败。一般是做一些逻辑比较严密的处理。阻塞其他redis操作,直到lua脚本完全执行完毕才会执行其他命令。我认为lua可以执行批量处理如果lua脚本执行的时间太长,那么要优化下lua脚本,因为lua会阻塞其他操作,所以说lua脚本不适合执行太长时间。三、pipeline1、批量处理数据,一次性返回所有结果集。

2024-07-15 17:04:26 449

原创 Redis的中BitMap的应用

通常用于构建布隆过滤器业务场景需要频繁的查询数据库里的数据,但是这些数据又不一定都存在,一些大量无效的数据库请求,占用了数据库的链接。解决:1、把查询的数据key放入redis Set中,只有存在才会去查询,问题就是set过于大,检查是否存在也会变慢2、当库中不存在该值时,依然创建一个value设置为空值,等过期时间后,自行删除。有可能上一秒库中不存在,下一秒有了,拿走依然是空值,也不行。3、布隆过滤器布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。

2024-07-15 16:32:56 646

原创 软件模型分类及特点

在软件开发的世界里,我们经常会遇到业务模型、系统模型和软件模型这三个层次。这些模型各有特点,相互之间也有着紧密的联系。通过理解这三个层次之间的映射关系,我们能更好地理解和掌握软件开发的全过程。

2024-07-03 17:49:04 332

原创 redis缓存 雪崩、击穿、穿透

缓存异常会面临的三个问题:缓存雪崩、击穿和穿透。其中,缓存雪崩和缓存击穿主要原因是数据不在缓存中,而导致大量请求访问了数据库,数据库压力骤增,容易引发一系列连锁反应,导致系统奔溃。不过,一旦数据被重新加载回缓存,应用又可以从缓存快速读取数据,不再继续访问数据库,数据库的压力也会瞬间降下来。因此,缓存雪崩和缓存击穿应对的方案比较类似。而缓存穿透主要原因是数据既不在缓存也不在数据库中。因此,缓存穿透与缓存雪崩、击穿应对的方案不太一样。

2024-06-25 18:43:17 988

原创 Redis的持久化方式和注意点

两种持久化技术:AOF日志和RDB快照Redis默认会开启RBD快照。是一种日志,写入到文件,有相应的格式文本就是 Redis 里的持久化功能,,因为没意义。Redis 是先执行写操作命令后,才将该命令记录到 AOF 日志里的,这么做其实有两个好处。当然,AOF 持久化功能也不是没有潜在风险。第一个风险,执行写操作命令和记录日志是两个过程,那当 Redis 在还没来得及将命令写入到硬盘时,服务器发生宕机了,这个数据就会有。

2024-06-25 18:36:24 760

原创 redis和zookeeper分布式锁的区别(优点、缺点)

基于ZooKeeper 的分布式锁,适用于高可靠(高可用)而并发量不是太大的场景;基于Redis 的分布式锁,适用于并发量很大、性能要求很高的、而可靠性问题可以通过其他方案去弥补的场景。

2024-06-25 18:29:31 1049

原创 消息队列原理和选型:Kafka、RocketMQ、RabbitMQ 和 ActiveMQ

https://juejin.cn/post/7096095180536676365

2024-06-25 18:15:24 120

原创 Kafka基本架构

Kafka的Broker端支持消息分区,Producer可以决定把消息发到哪个Partition,在一个Partition中消息的顺序就是Producer发送消息的顺序,一个Topic中的Partition数是可配置的,Partition是Kafka高吞吐量的重要保证。Kafka中的Producer和Consumer采用的是Push-and-Pull模式,即Producer向Broker Push消息,Consumer从Broker Pull消息。:消费者,负责从kafka中拉取消息进行消费。

2024-06-25 18:11:03 419

原创 如何处理消息积压问题

最后,如果是消费端的处理能力不足,可以通过水平扩容来提供消费端的并发处理能力,但这里有一个考点需要特别注意, 那就是在扩容消费者的实例数的同时,必须同步扩容主题 Topic 的分区数量,确保消费者的实例数和分区数相等。比如在 Kafka 中,一个 Topic 可以配置多个 Partition(分区),数据会被写入到多个分区中,但在消费的时候,Kafka 约定一个分区只能被一个消费者消费,Topic 的分区数量决定了消费的能力,所以,可以通过增加分区来提高消费者的处理能力。怎么解决消息被重复消费的问题?

2024-06-25 12:01:32 742

原创 如何保证消费顺序消费

要消息的顺序性消费:需要保持先后顺序的消息放到同一个消息队列中(kafka中就是partition,rabbitMq中就是queue),然后使用线程池消费的时候使用分布式锁和本地锁保证同时只有一条线程去消费一个队列(Queue)上的数据。MQ中怎样去实现消息的顺序消费_c# mq 顺序消费-CSDN博客。

2024-06-25 11:52:41 972

原创 如何确保消息不被重复消费

我提醒你注意,无论哪种方法,如果你想同时满足简单、高可用和高性能,就要有取舍,所以你要站在实际的业务中,说明你的选型所考虑的平衡点是什么。我个人在业务中比较倾向于选择 Snowflake 算法,在项目中也进行了一定的改造,主要是让算法中的 ID 生成规则更加符合业务特点,以及优化诸如时钟回拨等问题。在分布式系统中,全局唯一 ID 生成的实现方法有数据库自增主键、UUID、Redis,Twitter-Snowflake 算法,我总结了几种方案的特点,你可以参考下。这也是面试官喜欢考察的问题,你也要掌握。

2024-06-25 11:45:23 420

原创 MQ:如何确保消息不会丢失

1、生产者消息丢失可以使用mq提供的事务功能,就是在生产者发送数据之前开启事务,然后发送消息,如果消息没有成功被rabbitmq接收到,那么生产者会受到异常报错,这时就可以回滚事物,然后尝试重新发送;如果收到了消息,那么就可以提交事物。rabbitmq事物已开启,就会变为同步阻塞操作,生产者会阻塞等待是否发送成功,太耗性能会造成吞吐量的下降。2、可以开启confirm模式。

2024-06-25 11:43:29 1584

原创 Spring对象的初始化流程

3、BeanPostProcessor的postProcessBeforeInitialization方法;6、BeanPostProcessor的postProcessAfterInitialization方法;5、InitializingBean的afterPropertiesSet方法;6、bean的指定初始化方法:init-method;4、注解了@PostConstruct的方法;2、populateBean填充属性;初始化Bean的先后顺序。1、bean实例化;

2024-06-24 14:23:11 372

原创 SpringBoot和SpringClound什么关系

综上所述,Spring Boot和Spring Cloud分别适用于不同的场景和应用程序构建需求。开发者需要根据实际需求来选择使用。

2024-06-24 14:22:01 623

原创 Spring中事务的传播机制

首先事务传播机制解决了什么问题Spring 事务传播机制是包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。事务的传播级别有 7 个,支持当前事务的:REQUIRED、SUPPORTS、MANDATORY;不支持当前事务的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事务 NESTED,其中 REQUIRED 是默认的事务传播级别。

2024-06-24 11:09:17 968

原创 事务的实现机制

原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做;如果事务中一个sql语句执行失败,则已执行的语句也必须回滚,数据库退回到事务前的状态。持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。与原子性、持久性侧重于研究事务本身不同,隔离性研究的是不同事务之间的相互影响。隔离性是指,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

2024-06-20 11:38:06 895

原创 Rpc与Http的区别

1 RPC要求服务提供方和服务调用方都需要使用相同的技术,要么都hessian,要么都dubbo 而http无需关注语言的实现,只需要遵循rest规范 2 RPC的开发要求较多,像Hessian框架还需要服务器提供完整的接口代码(包名.类名.方法名必须完全一致),否则客户端无法运行 3 Hessian只支持POST请求 4 Hessian只支持JAVA语言Netty 是一个基于 NIO 的。

2024-06-19 15:26:18 562

原创 一颗B+树可以存储多少数据?

InnoDB 的数据是按「数据页」为单位来读写的,默认数据页大小为 16 KB。每个数据页之间通过双向链表的形式组织起来,物理上不连续,但是逻辑上连续。数据页内包含用户记录,每个记录之间用单向链表的方式组织起来,为了加快在数据页内高效查询记录,设计了一个页目录,页目录存储各个槽(分组),且主键值是有序的,于是可以通过二分查找法的方式进行检索从而提高效率。为了高效查询记录所在的数据页,InnoDB 采用 b+ 树作为索引,每个节点都是一个数据页。

2024-06-18 16:39:34 1670

原创 Mysql的联合索引

Mysql从物理存储上将索引上分为:分为聚簇索引和非聚簇索引主键索引也被称为聚簇索引(clustered index),也叫作聚集索引。其余都称呼为非主键索引也被称为二级索引(secondary index),也叫作辅助索引。聚簇索引的叶子节点存放的是实际数据,所有完整的用户记录都存放在聚簇索引的叶子节点;二级索引的叶子节点存放的是主键值,而不是实际数据。2.1、

2024-06-16 00:29:40 2771

原创 B+索引的分裂及选择率和索引基数

B+树索引页的分裂并不总是从页的中间记录开始,这样可能会导致页空间的浪费。例子比如下面这个记录:由于插入是以自增的顺序进行的,若这时插入第10条记录然后进行页的分裂操作,那么根据上一节的方法,会将5作为分割点,得到下面两个页:然而由于插入是顺序的,P1这个页中将不会再有记录插入,从而导致空间浪费。而P2又会再次进行分裂。通过这几个信息,InnoDB可以决定是向左还是向右进行分裂,同时决定将哪个作为分裂点。若插入是随机的,则取页的中间记录作为分裂点,这和之前介绍的是相同的。

2024-06-14 17:55:18 925

原创 字符编码笔记:ASCII,Unicode 和 UTF-8

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:九、延伸阅读(关于字符集的最基本知识)谈谈Unicode编码(如果实现UTF-8的规定)

2024-06-14 16:26:15 863

原创 Mysql数据类型解析

MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

2024-06-13 18:52:44 1017

原创 Mysql中索引详解

明确一点:MySQL跟B+树没有直接的关系,真正与B+树有关系的是MySQL的默认存储引擎InnoDB,MySQL中存储引擎的主要作用是负责数据的存储和提取,除了InnoDB之外,MySQL中也支持比如MyISAM等其他存储引擎。

2024-06-12 18:10:46 935 2

原创 Mysql查询分析工具Explain的使用

作为一名合格的开发人员,与数据库打交道是必不可少的,尤其是在业务规模和数据体量大规模增长的条件下,应用系统大部分请求读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。Explain则是mysql提供给开发人员用于对Select语句进行分析的命令,可以对查询语句进行分析,并输出Select执行的详细信息,以供开发人员进行针对性的优化。Expalain的核心指标是rows,绝大部分rows小的语句执行一

2024-06-11 19:20:38 1813 2

原创 MySQL数据记录如何存储?

MySQL 的 NULL 值是怎么存放的?MySQL 的 Compact 行格式中会用「NULL值列表」来标记值为 NULL 的列,NULL 值并不会存储在行格式中的真实数据部分。NULL值列表会占用 1 字节空间,当表中所有字段都定义成 NOT NULL,行格式中就不会有 NULL值列表,这样可节省 1 字节的空间。MySQL 怎么知道 varchar(n) 实际占用数据的大小?MySQL 的 Compact 行格式中会用「变长字段长度列表」存储变长字段实际占用的数据大小。

2024-06-07 15:38:50 1078

原创 Mysql执行一条语句都有哪些操作

执行一条 SQL 查询语句,期间发生了什么?连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;执行 SQL:执行 SQL 共有三个阶段:预处理阶段:检查表或字段是否存在;将select *中的符号扩展为表上的所有列。优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;

2024-06-06 17:10:33 997

原创 java的UUID使用

System.out.println("格式前的UUID : " + UUID.randomUUID().toString());System.out.println("格式化后的UUID :" + getUUID());生成出来的结果是:ae3c33ad-1f28-4a93-9320-c912f46171fc。鉴于我们一般用作ID的话,不带中间的"-",所以我们将中间的"-"去除。最后生成出来的是长度为32的16进制无序唯一字符序列。进一步封装成UUID工具类UUIDUtil。

2024-01-15 16:00:01 640

空空如也

空空如也

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

TA关注的人

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