编程 Cookbook Featured 编程 Cookbook【开发面试必备】导航页 🎉🎉 欢迎各位朋友来到CodingCookbook,我是🧑🍳主厨:李歘歘。 👯 编程Cookbook,我们的初衷和这个名字一样,像传统食谱给出具体的烹饪步骤和食材用量一样,精准的打造“编程食谱”。 🔭 这里专注于分享编程知识,包括但不限于编程语言知识,数据库,中间件等,如果你正在准备面试,需要这方面的准备,那么恭喜你,来对了!
计算机网络 计算机网络之TCP/UDP篇(下) 大家好,这里是编程Cookbook。本文详细介绍计算机网络中的TCP/UDP协议相关的内容,包括单不限于基础概念、连接的建立与断开、TCP可靠传输的实现等。 @[toc] TCP 可靠传输机制 TCP 协议的可靠传输机制 TCP 通过以下机制保证可靠传输: 1. 序列号和确认机制: * 每个字节的数据都有一个唯一的序列号。 * 接收方通过发送 ACK 报文确认已收到的数据。 2. 超时重传: * 发送方在发送数据后启动定时器,如果超时未收到 ACK,则重传数据。 3. 流量控制: * 通过滑动窗口机制,接收方动态调整发送方的发送速率,避免接收方缓冲区溢出。 4. 拥塞控制: * 通过慢启动、拥塞避免、快速重传和快速恢复等算法,动态调整发送速率,避免网络拥塞。 5. 数据校验: * 使用校验和字段检测数据在传输过程中是否损坏。 6. 顺序传输: * 通过序列号保证
计算机网络 计算机网络之TCP/UDP篇(上) 大家好,这里是编程Cookbook。本文详细介绍计算机网络中的TCP/UDP协议相关的内容,包括单不限于基础概念、连接的建立与断开、TCP可靠传输的实现等。 @[toc] TCP/UDP 基础概念 什么是 TCP 连接? TCP(Transmission Control Protocol,传输控制协议)是面向连接的、可靠的、基于流的传输层协议。TCP 报文段如下所示: TCP 报文段的首部通常为 20 字节(无选项时),最大可扩展至 60 字节。具体结构如下: 字段 长度(字节) 说明 源端口(Source Port) 2 发送方的端口号(如 54321) 目的端口(Destination Port) 2 接收方的端口号(如
计算机网络 计算机网络之HTTP篇(下) 大家好,这里是编程Cookbook。本文详细介绍计算机网络中的HTTP协议相关的内容,包括单不限于HTTP各个版本及其优势、请求和响应、HTTPS等。 @[toc] HTTP 是无状态协议,如何实现有状态的会话管理? HTTP 是无状态协议,意味着服务器不会保留客户端请求之间的状态信息。为了实现有状态的会话管理(如用户登录状态、购物车信息等),通常通过 Cookie、Session、Token、URL 重写 和 隐藏表单字段 等技术实现。 1. Cookie Cookie 是由服务器在客户端(通常是浏览器)上存储的一小段数据,它可以用于记录用户信息,并在同一站点的不同页面之间或跨会话维持状态。 Cookie 的特点 * 存储位置:存储在客户端(浏览器)。 * 数据大小:通常限制为 4KB 左右。 * 数据格式:键值对(key=value)。 * 生命周期: * 会话 Cookie(Session
计算机网络 计算机网络之HTTP篇(上) 大家好,这里是编程Cookbook。本文详细介绍计算机网络中的HTTP协议相关的内容,包括单不限于HTTP各个版本及其优势、请求和响应、HTTPS等。 @[toc] HTTP协议 HTTP 1.0、1.1、2.0和3.0有什么区别? HTTP(HyperText Transfer Protocol)是用于Web通信的核心协议,历经多个版本的演进,旨在提升性能、安全性和可靠性。以下是HTTP 1.0、1.1、2.0和3.0的演变和进化过程: 1. HTTP 1.0 发布时间:1996年(RFC 1945) HTTP 1.0是第一个正式的HTTP版本,主要特点如下: 1. 无状态、无连接:每个请求-响应都需要单独建立TCP连接,请求完成后即关闭连接,导致开销较大。
设计模式 设计模式之动作型 大家好,这里是编程Cookbook。本文是对设计模式中创建模式的详细讲解,共11种,分别是观察者模式、责任链模式、策略模式、模板方法模式、状态模式、迭代器模式、备忘录模式、命令模式、中介者模式、访问者模式、解释器模式。 常用动作型模式 观察者模式(Observer Pattern) 观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。观察者模式的核心思想是解耦观察者与被观察者,使得它们可以独立变化。 组成成分 观察者模式通常包含以下角色: 1. 主题(Subject/Topic): * 维护一个观察者列表,并提供注册、删除和通知观察者的方法。 2. 具体主题(Concrete Subject): * 实现主题接口,存储具体状态,并在状态改变时通知观察者。 3. 观察者(Observer):
设计模式 设计模式之结构型 大家好,这里是编程Cookbook。本文是对设计模式中创建模式的详细讲解,共7种,分别是适配器模式、桥接模式、组合模式、装饰器模式、代理模式、外观模式、享元模式。 常用结构型模式 适配器模式(Adapter Pattern) 适配器模式是一种结构型设计模式,它允许将一个类的接口转换成另一个接口。适配器模式的核心思想是解决接口不兼容的问题,使得原本由于接口不匹配而无法一起工作的类可以协同工作。 组成成分 适配器模式通常包含以下角色: 1. 目标接口(Target): * 客户端期望的接口,定义了客户端需要使用的功能。 2. 适配者(Adaptee): * 需要被适配的类,通常是已经存在的类,但其接口与目标接口不兼容。 3. 适配器(Adapter): * 适配器的核心类,负责将适配者的接口转换成目标接口。 * 适配器可以是 类适配器(通过继承实现
设计模式 设计模式之创建型 大家好,这里是编程Cookbook。本文是对设计模式中创建模式的详细讲解,共5种,分别是单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式。 常用创建型模式 单例模式 什么是单例模式? 单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个 全局访问点来获取该实例。单例模式的核心思想是控制对象的创建过程,避免重复创建对象,从而节省资源并保证一致性。 单例模式的特点 1. 唯一性:在程序的整个生命周期里,该类只会有一个实例存在。 2. 全局可访问性:提供了一个能让所有代码都可以访问到唯一实例的全局访问点。 3. 延迟加载特性:在有需求的时候才去创建实例(比如通过懒汉式来实现这一特性)。 单例模式的使用场景 单例模式适用于以下场景: 1. 配置管理:系统中只需要一个全局配置对象,用于统一管理配置信息。 2. 日志记录:日志对象通常只需要一个实例,用于记录系统的运行状态。 3. 数据库连接池:数据库连接池通常只需要一个实例,用于管理数据库连接。 4. 缓存系统:缓存对象只
设计模式 设计模式概要介绍 大家好,这里是编程Cookbook。本文是对设计模式的概要介绍,包括 23 种设计模式和一些设计原则。 优秀代码的特点 我们所说的优秀代码通常具有以下特点: 1. 可靠性、安全性:功能正确、运行稳定、确保安全。 2. 性能优化:时间复杂度优、空间复杂度优、资源利用高效。 3. 可维护性、可拓展性:低耦合高内聚、遵循设计原则和模式、易于修改扩展。 4. 可读性:命名规范、结构清晰、注释适当。 5. 可测试性:单元测试友好、可模拟隔离。 6. 兼容性:跨平台兼容、版本兼容。 设计模式基础概念 设计模式及其作用 什么是设计模式? 设计模式是解决软件设计中常见问题的经验总结,它提供了一套经过验证的、可重用的解决方案模板。设计模式并不是具体的代码,而是一种设计思想或方法论,用于指导开发者编写高质量、可维护、可扩展的代码。 设计模式的作用
RPC RPC概要讲解 大家好,这里是编程Cookbook。本文概要介绍RPC(远程过程调用),包括其基础概念,工作原理,相关框架,并且与HTTP和MQ进行对比。 RPC基础概念 RPC 定义 RPC(Remote Procedure Call,远程过程调用)是一种 通信协议,允许程序调用另一台计算机上的函数或过程,就像调用本地函数一样,隐藏了底层网络通信细节。 主要作用 1. 简化分布式系统开发: * RPC 使得开发者可以像调用本地函数一样调用远程函数,无需关心网络通信、数据序列化、反序列化等细节。 * 开发者可以专注于业务逻辑,而不必处理底层的网络编程。 2. 提升代码复用: * 通过 RPC,不同的系统或服务可以共享相同的函数或服务,避免了重复开发。 * 例如,一个通用的用户认证服务可以被多个不同的应用调用。 3. 增强系统扩展性: * 通过增加远程服务的
Go语言 Golang——Channel 大家好,这里是编程Cookbook。本文详细介绍Golang的数据类型channel,包括基本概念,源码,常见问题及其解决并发。 基本概念 定义 * Channel 是 Go 语言中用于实现协程(goroutine)之间通信的核心机制。通过 channel,可以在协程之间通过数据传递实现同步。Go 的并发编程依赖 CSP(Communicating Sequential Processes)模型,强调“通过通信共享内存,而不是通过共享内存来通信”。 优势 Goroutine 解放了程序员,让我们更能贴近业务去思考问题。而不用考虑各种像线程库、线程开销、线程调度等等这些繁琐的底层问题,goroutine 天生替你解决好了。channel 的灵活性和扩展能力使其成为 Go 并发编程的核心工具,而非单纯的同步机制。 * Channel 的组合能力: channel 可以将多个 goroutine 的结果汇集到一个统一的 channel 中,主协程可以从这个
Go语言 Golang——rune和byte 大家好,这里是编程Cookbook。本文详细介绍Golang中的两种字符类型rune和byte,介绍他们的区别,编码方式和简单的使用。 在Go语言中,rune和byte都是表示单个字符的类型,但它们有一些关键的区别。 byte 类型 byte 是 uint8 的别名,即一个 8 位无符号整数,表示一个字节,范围是 0 到 255。 * byte 用于表示 UTF-8 编码中的 字节,适合处理字节流和 ASCII 字符。 字符占用字节数: * ASCII 字符(0-127)占用 1 字节。 * 常见的字符,如拉丁字母、标点符号,占用 1 字节。 * 中文等非 ASCII 字符会占用 3 字节。 byte 表示:
Go语言 Golang——hashmap 大家好,这里是编程Cookbook。本文详细介绍golang的哈希表的底层实现、扩容机制、插入查询过程以及并发安全性。 定义 字典(Map)类型其实是哈希表(Hash Table)的一个实现。字典用于存储键-值对的无序集合。 Key无序性 为什么 map 的 key 无序? 1. 扩容后键重新分布:键值对的存储位置随着扩容发生显著变化。 2. 随机化遍历起点:遍历时从随机 bucket 和随机 cell 开始,避免返回固定顺序。 3. 防止误解:杜绝程序员误以为 map 有固定的遍历顺序,避免潜在错误。 4. 语言特性:从 Go 1.0 起就设计为无序,以保持哈希表特性的一致性。 Key唯一性 注意: 同一个字典中的每个键都是唯一的。如果我们在向字典中放入一个键值对的时候其中已经有相同的键的话,那么与此键关联的那个值会被新值替换。 Key可比性
Go语言 Golang——切片与数组 大家好,这里是编程Cookbook。本文详细介绍Golang的切片与数组,包括他们的联系,区别,底层实现和使用注意事项等。 数组与切片的异同 相同之处 * 集合类型:数组和切片均属于集合类类型,其值均可用于存储某一种类型的元素。 * 内存布局:在内存中,数组和切片的元素存储是连续分配的。 * 访问方式:两者都可以通过下标来访问单个元素。 区别 * 数组: * 数组的长度是固定的,必须在声明时指定,且之后无法改变。 * 数组的长度是其类型的一部分,例如 [3]int 和 [4]int 是不同的类型。 * 由于长度固定,数组在实际开发中使用较少。 * 切片: * 切片更加灵活,是数组的封装和增强。 * 切片的长度可变,其类型字面量中只有元素类型,没有长度(可通过 make 函数初始化时指定长度和容量)。 * 切片的长度可随着添加元素而动态增长,但不会因移除元素而减少(直到没有引用时垃圾回收机制才会释放)。 切
Go语言 Golang——语言基础知识 大家好,这里是编程Cookbook。本文详细介绍Go语言的基础知识,包括数据类型,深浅拷贝,编程范式,Go语言是一种静态(静态类型语言 和 静态语言)强类型、编译型、并发型,并具有垃圾回收功能的编程语言。 1. Go 语言基础知识 下面将详细介绍 Go 语言的理论知识,包括数据类型、深拷贝与浅拷贝、以及如何在函数中传递数据。 数据类型 Go 语言是强类型的,意味着变量在使用时必须明确指定类型。Go 语言有很多内建的数据类型,主要可以分为以下几类: 基本数据类型 * 布尔类型(bool):表示真(true)或假(false)。 * 数字类型: * 整数:int、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64。 * 浮点数:
消息队列(MQ) 消息队列概要讲解(下) 大家好,这里是编程Cookbook。本文概要介绍消息队列的核心原理和实现,以及常见问题及其解决方案等。本文不会过多的扩展详细的消息队列系统,如RocketMQ、RabbitMQ、Kafka等,这些会在后续系列文章中详细介绍。 由于篇幅问题,本文分为上下两节,上节内容参考历史文章:《消息队列概要讲解(上)》 消息传递模式 在消息队列的运行机制中,消费者从消息队列获取数据主要有两种方式:推(Push) 模式和 拉(Pull) 模式,它们在数据传递方式、实时性和资源消耗等方面有显著差异。 首先需要明确一下,推拉模式指的是Consumer和Broker之间的交互。Producer与Broker之间就是推的方式,即Producer将消息推送给Broker,而不是Broker主动去拉取消息。 如果需要Broker去拉取消息,那么Producer就必须在本地保存消息来等待Broker的拉取,如果有很多生产者的话,那么消息的可靠性不仅仅靠Broker自身,还需要靠成千上万的Producer。 概念介绍 1. 推模式(Push) 在推模式中,消息队列
消息队列(MQ) 消息队列概要讲解(上) 大家好,这里是编程Cookbook。本文概要介绍消息队列的核心原理和实现,以及常见问题及其解决方案等。本文不会过多的扩展详细的消息队列系统,如RocketMQ、RabbitMQ、Kafka等,这些会在后续系列文章中详细介绍。 消息队列(Message Queue,MQ) 是在微服务系统和分布式架构中实现异步通信的技术。是分布式系统中重要的组件,主要解决应用耦合,异步处理,流量削锋等问题,实现系统的高性能,高可用,可伸缩,使用较多的消息队列有RocketMQ、RabbitMQ、Kafka等。 为什么需要消息队列? 随着互联网的快速发展,技术架构从单体架构向微服务和分布式架构转变,服务间相互调用和依赖增多。需要一个工具来解耦服务之间的关系、合理控制资源的使用以及缓冲流量洪峰等,消息队列应运而生。 主要功能包括: * 异步处理:例如电商订单系统中,下单后订单处理、库存扣减、支付处理等环节可异步进行,提高系统响应速度。 * 应用解耦:让不同服务专注自身业务,通过消息队列交换信息,如营销系统和支付系统分开。 * 流量削锋:避免流量过大冲垮系统,例如电商大促期间
MySQL MySQL数据库——版本号机制和CAS(Compare And Swap) 大家好,这里是编程Cookbook。本文详细介绍乐观锁的两种实现方式:版本号机制和CAS(Compare And Swap)。 MySQL 内置的并发控制机制 MySQL 内置了强大的并发控制机制,例如 MVCC(多版本并发控制) 和锁机制。这些机制在更高层次上实现了并发控制。自动处理事务隔离和并发冲突,适用于复杂数据库事务管理。 MVCC(多版本并发控制) * 核心:基于事务 ID 和 Undo Log,实现高效的读写并发。 * 特点:快照读无需加锁,写操作使用回滚日志实现隔离性。 MVCC的详细信息参考:《MySQL数据库——多版本并发控制MVCC》 锁机制 1. 按锁粒度:表锁、行锁(InnoDB 默认)。 2. 按锁类型:共享锁(S 锁)、排他锁(X 锁)。 3. 意向锁:
MySQL MySQL数据库——主从复制 大家好,这里是编程Cookbook。本文详细介绍 MySQL 的主从复制,从原理到配置再到同步过程。 简介 MySQL 主从复制(Replication)是一种数据分布式存储技术,通过将主库(Master)的数据和操作复制到一个或多个从库(Slave),实现数据的同步和备份。它常用于读写分离、数据容灾、数据分布等场景。 核心组件 1. 主库(Master): * 负责记录所有数据变更操作到 Binary Log 中。 * 通过网络将 Binary Log 提供给从库。 2. 从库(Slave): * 负责从主库获取 Binary Log,并通过中继日志(Relay Log)将其重放在本地,最终实现与主库的数据同步。 3. 二进制日志(Binary Log): * 主库记录所有数据的逻辑操作,用于主从复制和增量备份。 * 包含数据变更的具体操作(语
MySQL MySQL数据库——多版本并发控制MVCC 大家好,这里是编程Cookbook。本文详细介绍MySQL的并发控制:多版本并发控制MVCC。 背景介绍 许多人认为 MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种乐观锁的实现方式,我们先来了解一下什么是乐观锁和悲观锁。 数据库并发控制——锁机制 在数据库系统中,并发控制是保证多个事务在并发执行时数据一致性的核心技术。传统的并发控制方法是使用 锁,它是一种直接而有效的解决方案。 * 锁的分类: * DQL(Data Query Language,数据查询语言):查询数据(如 SELECT)时使用 读锁。 * DML(Data Manipulation Language,数据操作语言):对数据进行增、删、改操作(如 INSERT、DELETE、UPDATE)时使用 写锁。 * DDL(Data Definition Language,数据库定义语言)
MySQL MySQL数据库——常见慢查询优化方式 大家好,这里是编程Cookbook。本文详细介绍MySQL的慢查询相关概念,分析步骤及其优化方案等。 什么是慢查询日志? 慢查询日志是MySQL提供的一种日志记录机制,用于记录执行时间超过指定阈值(long_query_time)的SQL语句。通过慢查询日志,可以识别和优化性能较差的SQL查询,是数据库性能调优的重要工具。 * 关键点: * 默认阈值:long_query_time 默认值为 10秒,表示运行时间超过10秒的SQL会被记录。 * 默认状态:MySQL 默认未开启慢查询日志,需要手动启用。 * 日志存储方式:支持存储为文件或表。 慢查询日志的相关参数 MySQL慢查询日志的核心参数及其含义如下: 1. 启用和路径配置: * slow_query_log:是否开启慢查询日志,1 表示开启,0 表示关闭。 * slow-query-log-file:日志文件路径和名称(MySQL 5.6及以上版本)。 * log-slow-que
MySQL MySQL数据库——日志介绍 大家好,这里是编程Cookbook。本文详细介绍MySQL的日志类型及其作用,包括 Redo Log、Undo Log、Binary Log 和 Error Log 等,在事务维护,主从同步,慢查询等方面都至关重要。 日志类型 MySQL 中用于数据持久化和恢复的日志机制非常关键,常见的日志类型包括 Redo Log、Undo Log、Binary Log 和 Error Log 等。每种日志都有特定的作用,确保数据库在不同情况下的可恢复性、事务的隔离性和一致性。 这些日志在 MySQL 的数据库操作流程中相互配合,确保数据库的高可用性和高一致性: 1. Undo Log 支持事务的隔离性,并允许回滚事务。 2. Redo Log 保证数据持久性,支持事务提交后的崩溃恢复。 3. Binary
MySQL MySQL数据库——索引潜规则(最左前缀原则) 大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍MySQL索引的关键潜规则——最左前缀原则。 @[toc] 图示单值索引和联合索引 单值索引 * 单值索引(唯一索引、主键索引、全文索引等) 是指在数据库表中创建的、仅涉及单个列的索引。也就是说,单值索引是基于表中的单一列(例如,单个字段)创建的索引结构。单值索引底层的 B+ 树如下所示: 联合索引 * 与单值索引只在一个列上建立,联合索引建在多个列上的索引,通常用于优化多列查询。当查询条件中涉及多个列时,数据库引擎会使用最适合的索引来提高查询效率。 * 联合索引的列顺序非常重要,通常是根据查询中最常用的过滤列进行排序。 联合索引的结构依旧是一颗 B+ 树,只不过联合索引的键值数量不是一个,而是多个,如下图所示: 当索引为联合索引时,数据库会依据联合索引最左的字段来构建 B+ 树,也叫 最左前缀匹配原则。 在上图中,我们假如创建一个 (a, b)
MySQL MySQL数据库——索引潜规则(回表查询、索引覆盖、索引下推) 大家好,这里是编程Cookbook。本文详细介绍MySQL索引的三个潜规则——回表查询、索引覆盖、索引下推,以提升数据库的性能。 之前我们在《MySQL数据库——索引介绍》文章中介绍了按存储方式将索引划分为聚集索引和非聚集索引,由此引出了一些索引设计的潜规则(回表查询、索引覆盖、索引下推)。 * 回表查询、索引覆盖、索引下推 是 InnoDB 的核心优化特性,尤其是索引下推,这是 InnoDB 的独有能力。 * 如果使用 MyISAM 或 Memory 存储引擎,只能利用回表查询和索引覆盖,无法使用索引下推优化。 索引回顾 聚集索引(Clustered Index) InnoDB 中的主键索引就是聚簇索引。 * 叶子节点存储整行数据。 * 索引即数据,查询到索引即查询到数据。 * 表中行的物理顺序与键值的逻辑(索引)顺序相同。 * 每个表只能有一个聚集索引,因为索引只能按照一种方式排序。 非聚集索引(Secondary Index/辅助索引/
MySQL MySQL数据库——索引结构之B+树 大家好,这里是编程Cookbook。本文先介绍数据结构中树的演化过程,之后介绍为什么MySQL数据库选择了B+树作为索引结构。 树的演化 1. 树 非线性结构,每个节点有唯一的一个父结点和多个子结点(子树),为一对多的关系。 2. 二叉树 每个结点最多有两颗子树,并且子树有左右之分,不能颠倒。 3. 满二叉树 每一层的结点个数都达到了当层能达到的最大结点数。 4. 完全二叉树 除了最下面一层之外,其余层的结点个数都达到了当层能达到的最大结点数,且最下面一层只从左至右连续存在若干结点,右边的结点全部不存在。 5. 二叉查找树 (BST) 又称为二叉排序树、二叉搜索树。定义如下: * 要么二叉査找树是一棵空树。 * 要么二叉查找树由根结点、左子