Java全栈知识
文章平均质量分 83
东莞呵呵
der
展开
-
为什么说 Redis 是单线程的?——Java全栈知识(25)
我们常说的 Redis 是单线程的,但是我前面在讲持久化机制的时候又说 RDB 的持久化是通过主进程 fork 出一个子进程来实现 RDB 持久化。那么 Redis 到底是多线程还是单线程的呢?但是在 Redis4.0 之后,Redis 引入了多线程模型,但是 IO 部分还是由单线程完成,而其他的如持久化存储模块、集群支撑模块等是多线程的。(Redis 6.0 之后将网络 IO 改为了多线程)info]前面我们讲到的 RDB 持久化,以及 Redis 集群支撑都是基于多线程完成的。原创 2024-05-20 21:32:01 · 208 阅读 · 0 评论 -
Redis如何解决缓存击穿问题——Java全栈知识(24)
我们在正常使用缓存的时候的流程大概就是这样的:请求访问缓存,缓存有数据就返回,缓存无数据就去数据库里面查数据写入到缓存中。原创 2024-05-18 22:53:12 · 163 阅读 · 0 评论 -
Redis如何应对缓存穿透问题——Java全栈知识(23)
我们在正常使用缓存的时候的流程大概就是这样的:请求访问缓存,缓存有数据就返回,缓存无数据就去数据库里面查数据写入到缓存中。原创 2024-05-18 22:19:13 · 336 阅读 · 0 评论 -
Redis 哨兵机制的工作原理——Java全栈知识(22)
接下来我们详细讲哨兵机制的作用以及实现原理以下是 Redis 哨兵的结构图。原创 2024-05-18 22:15:00 · 1141 阅读 · 0 评论 -
Redis 主从同步的原理——Java全栈知识(21)
简述全量同步和增量同步区别?全量同步:master 将完整内存数据生成 RDB,发送 RDB 到 slave。后续命令则记录在 repl_baklog,逐个发送给 slave。增量同步:slave 提交自己的 offset 到 master,master 获取 repl_baklog 中从 offset 之后的命令给 slave什么时候执行全量同步?slave 节点第一次连接 master 节点时slave 节点断开时间太久,repl_baklog 中的 offset 已经被覆盖时。原创 2024-05-18 16:51:22 · 475 阅读 · 0 评论 -
Redis的集群模式——Java全栈知识(20)
哨兵架构下 client 端第一次从哨兵找出 redis 的主节点,后续就直接访问 redis 的主节点,不会每次都通过 sentinel 代理访问 redis 的主节点,当 redis 的主节点挂掉时,哨兵会第一时间感知到。针对于分片,主节点只负责读和写,从节点只负责读操作,从节点的数据是依靠主节点同步过来,也就是和主从模式一样。Redis Cluster 能够自动检测节点的故障。当一个节点失去连接或不可达时,Redis Cluster 会尝试将该节点标记为不可用,并从可用的从节点中提升一个新的主节点。原创 2024-05-14 18:18:25 · 718 阅读 · 0 评论 -
Redis的数据淘汰策略——Java全栈知识(19)
数据过期策略是 redis 中设置了 TTL 的数据过期的时候 Redis 的处理策略。数据淘汰策略是 Redis 内存不够的时候,数据的淘汰策略:当 Redis 中的内存不够用时,此时在向 Redis 中添加新的 key, 那么 Redis 就会按照某一种规则将内存中的数据删除掉,这种数据的删除规测被称之为内存的淘汰策略。redis 的内存删除策略有:·noeviction: 不会淘汰任何键值对,而是直接返回错误信息。原创 2024-05-12 20:46:47 · 514 阅读 · 1 评论 -
Redis的数据过期策略——Java全栈知识(18)
定期删除会在 Redis 设置的过期键的过期时间达到一定阈值时进行一次扫描,将过期的键删除,但不会立即释放内存,而是把这些键标记为“已过期”,并放入一个专门的链表中。然后,在 Redis 的内存使用率达到定阈值时,Redis会对这些“已过期”的键进行一次内存回收操作,释放被这些键占用的内存空间。惰性删除是 Redis 的被动删除策略,它可以节省 CPU 资源,但是会导致过期的 key 始终保存在内存中,占用内存空间。定期删除是 Redis 的主动删除策略,它可以确保过期的 key 能够及时被删除,原创 2024-05-11 20:18:04 · 283 阅读 · 0 评论 -
Redis持久化策略——Java全栈知识(17)
1、RDB: 以快照的方式将此刻 Redis 中的数据以二进制的文件形式保存在磁盘中。RDB 的优点是:快照文件小、恢复速度快,适合做备份和灾难恢复。RDB 的缺点是:定期更新可能会丢数据(在最后一次数据快照到服务器宕机之间的数据就会丢失)2、AOF: AOF 是将 Redis 的所有写操作追加到 AOF 文件 (Append Only File)的结尾,从而记录了 Redis 服务器运行期间所有修改操作的详细记录。当 Redis 重新启动时,可以通过执行 AOF 文件中保存的写操作来恢复数据。AO原创 2024-05-09 21:53:59 · 427 阅读 · 0 评论 -
RabbitMQ是如何保证消息可靠性的?——Java全栈知识(16)
每个只能配置一个,因此我们可以在配置类中统一设置。我们在 publisher 模块定义一个配置类:log . error("触发return callback,");} });} }log . error("触发return callback,");} });} }Slf4j;import orglog . error("触发return callback,");} });} }原创 2024-05-07 19:27:33 · 973 阅读 · 0 评论 -
RabbitMQ 是如何做延迟消息的 ?——Java全栈知识(15)
当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter):架构:由于第一个队列没有消费者,所以可以在第一个队列中设置 TTL,当消息过期的时候,这个消息就变成了死信,被丢掉私信交换机中,以此实现延迟任务功能。前面两种作用场景可以看做是把死信交换机当做一种消息处理的最终兜底方案,与消费者重试时讲的作用类似。而最后一种场景,大家设想一下这样的场景: 如图,有一组绑定的交换机()和队列()。但是没有消费者监听,而是设定了死信交换机,而队列则与死信交换机绑定,RoutingKey是blue:原创 2024-05-06 22:07:50 · 1015 阅读 · 3 评论 -
RabbitMQ是怎么做消息分发的?——Java全栈知识(14)
RabbitMQ 的消息分发分为五种模式:分别是简单模式、工作队列模式、发布订阅模式、路由模式、主题模式。原创 2024-05-06 20:17:11 · 713 阅读 · 3 评论 -
分布式 ID 的实现方案——Java全栈知识(13)
数据倾斜是指在分布式计算或数据库环境中,数据分布不均匀的现象。在理想的分布式系统中,数据和计算负载应该均匀分布在所有节点上。然而,由于各种原因,某些节点可能承载比其他节点更多的数据或计算负载,这就是数据倾斜。比如一个系统中共有 500 万数据,但是属于同一个商家的数据就有 400 万,那么如果数据库按照商家做分库分表,就会导致出现严重的数据倾斜。一般来说,数据倾斜发生在分库分表的场景中比较多,因为主要是因为分表字段选择的不够合适导致的。你比如说一个定价系统,然后我们是按照付款方做的分库分表。原创 2024-05-05 21:14:59 · 1026 阅读 · 1 评论 -
什么是数据倾斜?怎么解决?——Java全栈知识(12)
数据倾斜是指在分布式计算或数据库环境中,数据分布不均匀的现象。在理想的分布式系统中,数据和计算负载应该均匀分布在所有节点上。然而,由于各种原因,某些节点可能承载比其他节点更多的数据或计算负载,这就是数据倾斜。比如一个系统中共有 500 万数据,但是属于同一个商家的数据就有 400 万,那么如果数据库按照商家做分库分表,就会导致出现严重的数据倾斜。一般来说,数据倾斜发生在分库分表的场景中比较多,因为主要是因为分表字段选择的不够合适导致的。你比如说一个定价系统,然后我们是按照付款方做的分库分表。原创 2024-05-04 20:13:16 · 751 阅读 · 0 评论 -
什么是一致性 Hash 算法?——Java全栈知识(11)
哈希算法大家都不陌生,经常被用在负载均衡、分库分表等场景中,比如说我们在做分库分表的时候,最开始我们根据业务预估,把数据库分成了 128 张表,这时候要插入或者查询一条记录的时候,我们就会先把分表键,如 buyer_id 进行 hash 运算,然后再对 128 取模,得到 0-127 之间的数字,这样就可以唯一定位到一个分表。但是随着业务得突飞猛进,128 张表,已经不够用了,这时候就需要重新分表,比如增加一张新的表。原创 2024-05-04 20:03:58 · 299 阅读 · 0 评论 -
分库分表都有哪些算法?——Java全栈知识(10)
通过分片键进行 hash 取模,取模的数量就是分表的数量。不利于扩容。原创 2024-05-04 20:02:52 · 308 阅读 · 0 评论 -
登录接口设计的优缺点——开发经验(3)
本文没有具体实现过程,只讨论各个登录方式的优缺点。原创 2024-04-11 20:53:25 · 953 阅读 · 0 评论 -
ShardingSphere水平分表——开发经验(2)
替换spring:# ShardingSphere 对 Driver 自定义,实现分库分表等隐藏逻辑# ShardingSphere 配置文件路径# 数据源集合ds_0:rules:SHARDINGtables:sys_user:# 真实数据节点,比如数据库源以及数据库在数据库中真实存在的# 分表策略# 用于单分片键的标准分片场景standard:# 分片键# 分片算法,对应 rules[0].shardingAlgorithms# 分片算法# 数据表分片算法。原创 2024-03-24 22:16:11 · 926 阅读 · 0 评论 -
HashMap源码分析——Java全栈知识(8)
因为如果我们频繁添加删除元素,使得链表的长度恰好是7左右,如果转化阈值是7则会频繁的转化位链表和红黑树,从而占用大量的CPU资源,设置为6和8就可以很好的避免此类情况。原创 2023-11-02 15:22:07 · 157 阅读 · 0 评论 -
ArrayList源码分析——Java全栈知识(7)
ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。前面已经提过,Java泛型只是编译器提供的语法糖,所以这里的数组是一个Object数组,以便能够容纳任何类型的对象。原创 2023-04-09 23:56:17 · 776 阅读 · 0 评论 -
Java集合详解(1)——Java全栈知识(6)
在java.util包下面大多都是线程不安全的集合,也有少数线程安全的集合例如:Hashtable和Vector,但是这两个集合,都是一些古老的API,从名字就可以看出来,甚至Hashtable没有符合Java的命名规范。因为可能有些HashMap在使用的过程中频繁添加删除元素,导致链表长度频繁的在7和8之间浮动,如果此时阈值是8的话,那么将会频繁的构造红黑树和链表。更适合在外存上使用,而我们引入红黑树是为了解决链表过长导致查询效率下降的问题,HashMap的一个数组空间中不可能会存储大量的元素。原创 2023-04-08 17:22:27 · 381 阅读 · 0 评论 -
Java全栈知识(5)泛型机制详解
这些也被叫做泛型类,泛型接口,泛型方法。为我们的本意是把子类中的泛型也都指定为Date类型,但是由于泛型擦除机制,此时的父类和子类中同名方法的返回类型就变得不相同了,而重写也就变成了重载,泛型擦除就和多态发生冲突。泛型机制是JDK1.5引入的新内容,所以说需要与老的代码兼容,所以说Java实现的其实是一种”伪泛型“的机制,即在编译期会把里的内容全部擦去,替换为具体的类型。我们可以看到在子类中我们覆盖了弗雷德两个方法,但是因为泛型擦除的机制,编译的时候父类方法中的泛型都被擦除为Object。原创 2023-04-05 10:16:17 · 731 阅读 · 0 评论 -
Java全栈知识(4)异常的处理的特殊情况
当Java程序执行try块、catch块时遇到了return或throw语句,这两个语句都会导致该方法立即结束,但是系统执行这两个语句并不会结束该方法,而是去寻找该异常处理流程中是否包含finally块,如果没有finally块,程序立即执行return或throw语句,方法终止;如果有finally块,系统立即开始执行finally块。只有当finally块执行完成后,系统才会再次跳回来执行try块、catch块里的return或throw语句;原创 2023-03-25 14:23:44 · 372 阅读 · 0 评论 -
Java全栈知识(2)String类String常量池
其实在字符串常量池中是,创建了“ world”对象,并且重新创建了一个新的String对象,内容是“hello world”,然后改变了str1的指向,从而改变了str1中的值,原来的“hello”还在String Pool中,此时的StringPool中一共有三个对象“hello”“ world”“hello world”。如果我们调用new String()方法是直接创建了一个新的String对象,所以两次创建的都是不同的对象,有永久代,但已经逐步“去永久代”,字符串常量池、静态变量移除,保存在堆中;原创 2023-03-19 22:01:24 · 422 阅读 · 0 评论 -
Java全栈知识(1)缓存池
当new Integer();的时候,不管参数的数字是几,都会返回一个新的对象。当调用Integer z = 123;的时候,是隐式调用的Integer.valueOf(123);当调用Integer.valueOf(i);如果-128原创 2023-03-18 23:23:55 · 486 阅读 · 0 评论