《RabbitMQ》
消息队列 消息指的是两个应用间传递的数据。数据的类型有很多种形式,可能只包含文本字符串,也可能包含嵌入对象。 消息队列(Message Queue)是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两种角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据。 消息队列的作用 消息主要有三个作用: 解耦:如图所示。假设有系统B、C、D都需要系统A的数据,于是系统A调用三个方法发送数据到B、C、D。这时,系统D不需要了,那就需要在系统A把相关的代码删掉。假设这时有个新的系统E需要数据,这时系统A又要增加调用系统E的代码。为了降低这种强耦合,就可以使用MQ,系统A只需要把数据发送到MQ,其他系统如果需要数据,则从MQ中获取即可。 异步:如图所示。一个客户端请求发送进来,系统A会调用系统B、C、D三个系统,同步请求的话,响应时间就是系统A、B、C、D的总和,也就是800ms。如果使用 MQ,系统A发送数据到 MQ,然后就可以返回响应给客户端,不需要再等待系统B、C、D...
《Redis》
简介 Redis(Remote Dictionary Server)是一个开源的内存数据库,遵守 BSD 协议,它提供了一个高性能的键值(key-value)存储系统,常用于缓存、消息队列、会话存储等应用场景。 性能极高 :Redis 以其极高的性能而著称,能够支持每秒数十万次的读写操作24。这使得Redis成为处理高并发请求的理想选择,尤其是在需要快速响应的场景中,如缓存、会话管理、排行榜等。 丰富的数据类型:Redis 不仅支持基本的键值存储,还提供了丰富的数据类型,包括字符串、列表、集合、哈希表、有序集合等。这些数据类型为开发者提供了灵活的数据操作能力,使得Redis可以适应各种不同的应用场景。 原子性操作:Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。这种特性对于确保数据的一致性和完整性至关重要,尤其是在高并发环境下处理事务时。 持久化:Redis 支持数据的持久化,可以将内存中的数据保存到磁盘中,以便在系统重启后恢复数据。这为 Redis 提供了数据安全性,确保数据不会因为系统故障而丢失。 支持发布/订阅模式:Redis...
《MySQL》
简介 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。 RDBMS 术语 数据库: 数据库是一些关联表的集合。 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。 行:一行(元组,或记录)是一组相关的数据,例如一条用户订阅的数据。 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。 外键:外键用于关联两个表。 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。 参照完整性:...
《HashMap底层原理》
简介 (1)HashMap 是基于 Map 接口的非同步实现,线程不安全,是为了快速存取而设计的;它采用 key-value 键值对的形式存放元素(并封装成 Node 对象),允许使用 null 键和 null 值,但只允许存在一个键为 null,并且存放在 Node[0] 的位置,不过允许存在多个 value 为 null 的情况。 (2)在 JDK7 及之前的版本,HashMap 的数据结构可以看成“数组+链表”,在 JDK8 及之后的版本,数据结构可以看成"数组+链表+红黑树",也就是说 HashMap 底层采用数组实现,数组的每个位置都存储一个单向链表,当链表的长度超过一定的阈值时,就会转换成红黑树。转换的目的是当链表中元素较多时,也能保证HashMap的存取效率(备注:链表转为红黑树只有在数组的长度大于等于64才会触发) (3)HashMap 有两个影响性能的关键参数:“初始容量”和“加载因子”: 容量 capacity:就是哈希表中数组的数量,默认初始容量是16,容量必须是2的N次幂,这是为了提高计算机的执行效率。 加载因子...
《Java SE》
Java 概述 什么是java Java 是一门面向对象的高级编程语言。它吸收了 C++ 语言中的大量优点,但又抛弃了 C++ 中容易出错的地方,如垃圾回收、指针。 同时,Java 又是一门平台无关性的语言,基于对应操作系统的 JVM 实现跨平台性。 语言特点 面向对象,封装、继承、多态。 跨平台性,拥有很好的可移植性。 支持多线程以及即时编译。 JVM、JRE、JDK JVM:是 Java 虚拟机,不同的平台有不同的 JVM 实现,是 Java 跨平台性的基石。JVM 负责将字节码文件解释为该平台的机器码。 JRE:是 Java 的运行环境,包含必需的类库和 JVM。 JDK:是一套完整的 Java 程序开发环境,包括了 JRE 、JVM、编译器 javac、文档工具 javadoc、字节码工具 javap 等。 基础语法 数据类型 数值型: 整数类型:byte、short、int、long 浮点类型:float、double 字符型:char 布尔型:boolean 数据类型 默认值 大小 byte 0 1 byte short 0 2...
《LinkedList底层原理》
一、简介 LingkedList 是 Java 集合框架中一个常用的类,它实现了 List 、Queue 和 Serializable 接口。底层使用 双向链表 作为数据结构。 特点: 特性 描述 增删操作快 插入、删除节点时不需要移动元素,效率高 查询效率低 查询元素需要从头或尾部一个个遍历 线程不安全 多线程环境下需手动同步或使用 Collections.synchronizedList 包装 二、底层结构 LinkedList 的核心是一个内部静态类 Node<E> : private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev...
《ArrayList的底层原理》
一、简介 ArrayList 是 Java 集合框架中最常用的 动态数组实现类,实现了 List 接口,允许存储 有序、可重复 的元素。 支持随机访问,访问时间复杂度为 O(1) 插入/删除非尾部元素需移动数据,时间复杂度为 O(n) 非线程安全,需手动处理并发问题 二、底层结构 核心成员变量: /** * 默认初始容量大小 */ private static final int DEFAULT_CAPACITY = 10; /** * 空数组(用于空实例)。 */ private static final Object[] EMPTY_ELEMENTDATA = {}; //用于默认大小空实例的共享空数组实例。 //我们把它从EMPTY_ELEMENTDATA数组中区分出来,以知道在添加第一个元素时容量需要增加多少。 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; /** *...
《素笺初展时》
启程时刻 ✨ 2025 年 6 月 3 日,博客的第一页在此展开。 像翻开一本新日记的扉页, 干净而安静。 键盘尚未温热,页面素净如雪, 宛如新铺的小径, 等待足迹的落下,思绪的绵延。 避风角落 🏮 这里不是喧嚣之地, 而是: 记录想法的 📖 记事本 分享灵感的 💡 储藏间 偶尔碎语的 🌙 夜光灯 慢写宣言 🖋️ 在这个快转的世界里, 我们选择: 给文字以呼吸的空间 为心情保留回望的窗口 替未来的自己点亮一盏灯 “若无一丝错落, 人生怎会如诗?” 🌱 从今日起,与博客共生长。 🫂 欢迎你,愿常常相逢。 —— 记于起点