- 博客(157)
- 收藏
- 关注
原创 索引下推的底层原理是什么,在什么场景下会生效?为什么建议使用自增主键
索引下推是数据库优化器的一种技术,允许在索引查找阶段(即访问非聚簇索引的 B+ 树时)直接应用部分查询条件,过滤掉不符合条件的记录,从而减少回表操作的次数。
2025-07-25 14:21:41
565
原创 什么是回表操作,其底层原理是什么?联合索引的底层存储结构是怎样的,创建时字段顺序有何影响?哪些操作会导致索引失效,从底层角度分析原因
回表操作定义: 回表是指在数据库中使用非聚簇索引查询时,索引的叶子节点只包含索引键和主键值,无法直接提供查询所需的所有列数据,因此需要通过主键值再次访问聚簇索引以获取完整数据行的操作。底层原理存储结构在 InnoDB 中,数据存储在聚簇索引(基于主键的 B+ 树)中,叶子节点包含完整行数据(所有列)。非聚簇索引(二级索引)是独立的 B+ 树,叶子节点存储 {索引键, 主键值},不包含完整行数据。回表过程查询通过非聚簇索引的 B+ 树定位到符合条件的叶子节点,获取主键值。
2025-07-24 08:39:31
504
原创 聚簇索引和非聚簇索引在底层存储上有什么不同?非聚簇索引为什么不存数据地址值而存储主键?
非聚簇索引存储主键值而非数据地址值,能降低维护成本、支持事务一致性、提高空间效率并兼容 InnoDB 的聚簇索引模型。这种设计在数据库的动态操作和并发环境中更稳定和高效。
2025-07-23 14:21:16
989
原创 简述 B + 树索引的底层结构和工作原理。为什么 InnoDB 存储引擎默认使用 B + 树作为索引结构
B+树的叶子节点通过链表连接,范围查询(如 `WHERE id BETWEEN 10 AND 20`)只需顺序遍历链表,效率极高,适合数据库常见查询场景。B+树的低树高、高效范围查询、平衡性和对磁盘存储的优化,使其成为 InnoDB 的理想索引结构,能高效支持数据库的各种查询和事务操作。- 对比 B 树:B+树将数据集中存储在叶子节点,内部节点只存键和指针,节省空间,且范围查询更高效。- 若节点溢出(键值超过节点容量),则分裂节点,调整父节点,保持平衡。
2025-07-22 08:43:20
377
原创 ElasticSearch是什么
*倒排索引**(Inverted Index)是 ElasticSearch 和 Lucene 的核心数据结构,用于高效的全文搜索。- **结构**:倒排索引将文档内容分词(tokenization),生成单词(term)与文档 ID 的映射。1. **分布式架构**:ElasticSearch 天生支持分布式部署,能够水平扩展,处理大规模数据,提供高可用性和容错能力。2. **全文搜索**:基于 Lucene,提供强大的全文搜索能力,支持复杂查询、模糊搜索和多语言处理。手机: [文档 1, 文档 2]
2025-07-21 15:13:36
385
原创 什么是看门狗机制
看门狗机制是一种用于监控系统运行状态的机制,通常用于检测和恢复系统故障(如死锁、崩溃或超时)。同时也通过定期检查系统是否正常运行(通常通过心跳信号),在检测到故障(如程序卡死、系统崩溃)时触发恢复操作。:系统运行时定期向看门狗(硬件或软件模块)发送“心跳”信号,表示系统正常。如果看门狗在规定时间内未收到心跳,会触发重启、报警或其他恢复操作。看门狗机制:用于监控和恢复系统故障,适用于嵌入式系统和关键服务的高可用场景。看门狗机制用于系统监控与自动恢复,确保稳定性。
2025-07-17 09:05:34
404
原创 什么是脑裂
脑裂是分布式系统中由于网络分区(Network Partition)导致集群节点被分割成多个独立子集,每个子集认为自己是唯一合法的集群,从而导致数据不一致或系统行为异常的现象。脑裂:是分布式系统中的一致性问题,需通过Quorum、心跳等机制解决,适用于分布式数据库或集群。
2025-07-16 14:28:53
625
原创 Redis在Linux系统中实现主从复制、哨兵模式、Cluster集群的搭建过程,具体步骤和指令
观察哨兵日志(`/var/log/redis/sentinel.log`)或重新运行`SENTINEL masters`,确认新主节点(可能是192.168.1.101或102)。- 假设有三台服务器:主节点(192.168.1.100:6379),从节点1(192.168.1.101:6379),从节点2(192.168.1.102:6379)。- 基于主从复制环境(如上:主节点192.168.1.100:6379,从节点192.168.1.101:6379、192.168.1.102:6379)。
2025-07-15 08:50:00
637
原创 什么是延迟双删
先删缓存后更新数据库:在删除缓存后、数据库更新完成前,如果有读请求,可能会从数据库读取旧数据并写入缓存,导致缓存中存储了旧数据。延迟双删是一种缓存更新策略,通常用于写操作(如更新或删除数据)时,确保缓存和数据库的数据一致性。在这种方案中,数据库操作完成后,等待一个固定的时间(通常基于业务场景和缓存过期时间设置),然后再次删除缓存。- 先更新数据库后删缓存:在数据库更新后、缓存删除前,如果有读请求,可能会读取到缓存中的旧数据。- 固定延迟删除方案:适合简单场景,延迟时间固定,易于实现,但一致性保障有限。
2025-07-12 08:41:16
476
原创 Redis 事务中如果有命令执行失败,会如何处理
Redis 的事务通过 `MULTI`、`EXEC` 和 `DISCARD` 等命令实现,提供了一种将多个命令打包执行的机制,但其事务机制与传统数据库(如 MySQL)不同,属于弱事务,不支持完全的 ACID(原子性、一致性、隔离性、持久性)。- 运行时错误:如 `orders` 键类型错误,导致 `LPUSH` 失败,但 `DECR` 已执行,库存减少但订单未记录。- 作用:`WATCH` 监控一个或多个键,如果在 `EXEC` 前这些键被其他客户端修改,事务会失败。
2025-07-11 14:20:38
964
原创 MQ的原理
Redis | 无(List实现) | 轻量级,简单,内存存储 | 简单队列,低延迟任务 || Kafka | 自定义协议 | 高吞吐量,分布式,日志存储 | 大数据,日志处理,流处理 || RocketMQ | 自定义协议 | 高性能,分布式,事务消息 | 电商,金融,分布式事务 |- 副本机制:消息多份存储,防止单点故障(如Kafka的Replication)。
2025-07-10 08:55:36
483
原创 redis的红锁在秒杀当中
红锁在秒杀场景中通过多节点共识机制提供高可靠的分布式锁,适用于库存扣减等高并发、强一致性场景。在分布式系统中,多个服务节点可能同时处理请求,单节点的锁无法满足需求。红锁通过在多个 Redis 节点上获取锁,确保分布式环境下的互斥性,适合秒杀场景。红锁是 Redis 分布式锁的一种高级实现方式,由 Redis 作者提出的,用于在分布式环境中提供更强一致性的锁机制。红锁要求客户端在多个独立的 Redis 节点上获取锁,只有当大多数节点成功加锁时,锁才算获取成功。加锁后,锁的过期时间会确保锁自动释放,防止死锁。
2025-07-09 14:29:51
363
原创 什么是bigkey
识别 BigKey 可以通过 `redis-cli --bigkeys`、`MEMORY USAGE` 或 `SCAN` 等方法,处理策略包括拆分键、优化数据结构、设置 TTL 和分布式存储等。- 设置内存上限(`maxmemory`)和淘汰策略(`maxmemory-policy`),如 `volatile-lru`。- 描述:Redis 提供的 `redis-cli` 工具支持 `--bigkeys` 参数,扫描数据库并报告占用内存较大的键。
2025-07-05 09:06:27
362
原创 Redis常见性能问题和解决方案有哪些
Redis性能问题主要包括**高延迟**、**内存过高**、**缓存穿透/雪崩**、**热点键**、**分布式锁竞争**、**连接数耗尽**和**持久化阻塞**。- **电商场景影响**:商品缓存未清理,内存耗尽导致新数据无法缓存,页面加载变慢。- **问题描述**:查询不存在的数据,导致请求直接穿透到数据库,增加数据库压力。- **问题描述**:分布式锁(如`SETNX`)竞争激烈,导致锁获取失败或延迟。- **电商场景影响**:大量查询不存在的商品ID,数据库负载激增,系统变慢。
2025-07-04 14:10:36
538
原创 Redis Cluster集群方案什么情况下会导致整个集群不可用
如果主节点故障但没有足够的从节点(或从节点也故障),集群无法重新分配槽,导致服务不可用。- 电商场景影响:在高并发场景(如双11促销),若Redis内存不足,缓存失效或锁无法分配,可能导致系统响应缓慢甚至崩溃。- 电商场景影响:在秒杀活动中,商品库存数据分布在多个主节点,若多数主节点宕机,库存查询和扣减无法进行,秒杀活动中断。- 电商场景影响:在热销商品排行榜场景,若存储排行数据的节点故障且无从节点接管,排行榜功能可能停止。- 从节点数量不足(例如每个主节点只有一个从节点,且同时故障)。
2025-07-03 08:45:06
564
原创 数据缓存和分布式锁使用电商场景
1. 使用Redis的`SETNX`(Set if Not Exists)命令获取锁,键为`lock:product:1001`,值可为时间戳或随机值,设置短过期时间(如5秒:`SET lock:product:1001 <value> NX PX 5000`)。2. 用户访问时,先查Redis,若命中直接返回;- 实现:将用户Session存储为键值对,键为`session:user_id`,值为用户数据,设置过期时间(如`SETEX session:12345 1800 <data>`)。
2025-07-02 14:27:10
478
原创 Redis 实现消息队列
Stream | 支持持久化、消费者组、消息确认、历史查询,功能接近专业消息队列 | 实现较复杂,内存占用较高 | 需要持久化和确认的复杂队列 || Pub/Sub | 实时性强,支持多消费者广播,简单易用 | 不支持消息持久化,断连后消息丢失,无回溯或重试机制| 实时通知、广播消息 || 列表 | 简单高效,支持阻塞操作,易于实现 | 无消息确认机制,Redis 故障可能丢失消息,无消费者组支持| 简单任务队列、异步处理|- 监控队列长度(`LLEN` 或 `XLEN`),避免积压。
2025-07-01 09:48:35
555
原创 Redis 和 Mysql 如何保证数据一致性
在分布式系统中,Redis 和 MySQL 常一起使用,Redis 作为缓存或快速存储层,MySQL 作为持久化数据库。- 描述:在更新 Redis 和 MySQL 时,使用 Redis 的分布式锁(`SETNX`)确保操作原子性。- Read-Through:查询时,代理先查 Redis,未命中则查 MySQL 并更新 Redis。- 实现:更新库存时加锁,更新 MySQL 和 Redis;- 强一致性:Redis 和 MySQL 数据时刻保持一致,适合对数据准确性要求高的场景(如金融系统)。
2025-06-30 14:34:25
991
原创 redis单线程为什么这么快
原理:Redis 实现了高效的内部数据结构(如 双端链表、跳跃表、整数集合等),这些数据结构针对内存操作进行了优化,减少内存分配和拷贝。事件循环监控所有客户端的 I/O 事件,优先处理就绪的事件。- 原理:Redis 的命令(如 `SET`、`GET`、`INCR`)设计简单,计算复杂度低。- 原理:Redis 支持管道和多命令事务(`MULTI`/`EXEC`),允许客户端批量发送命令,减少网络往返开销。- 避免复杂命令:避免使用高复杂度的命令(如 `KEYS`),改用 `SCAN` 等增量命令。
2025-06-28 09:37:03
791
原创 redis的持久化
Redis 的持久化机制是其重要特性之一,允许将内存中的数据保存到磁盘,以防止数据丢失或支持系统重启后数据恢复;3.RDB和AOF两种方式可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。数据安全,每一次命令操作就可以追加到后面,即使宕机,也可以通过redis-check-aof来修复。
2025-06-26 09:04:02
472
原创 什么是redis
Redis 是一个高性能、灵活的内存键值数据库,凭借其丰富的数据结构、高可用性和广泛的生态支持,成为现代应用架构中不可或缺的组件。- 主从复制:一个主节点(Master)同步数据到多个从节点(Slave),从节点可读,主节点可写。Redis是一个开源的、基于内存的高性能键值存储数据库,广泛用于缓存、消息队列、会话存储等场景。- 哨兵(Sentinel):监控主从节点,自动故障转移,选举新的主节点。- RDB(快照):定期将内存中的数据快照保存到磁盘,适合备份和恢复。
2025-06-25 16:04:07
517
原创 Ribbon负载均衡的具体实现原理
在 Spring Cloud 中,`LoadBalancerClient`(如 `SpringCloudLoadBalancerClient`)拦截 HTTP 请求(如 RestTemplate` 或 或 `Feign`),调用 `ILoadBalancer` 选择实例。- 核心负载均衡器,协调 `ServerList`、`IRule` 和 `IPing`。- `IRule` 的 `choose` 方法接收实例列表,返回选中的实例。
2025-06-24 15:42:54
647
原创 什么是Sentinel
Sentinel 是一个轻量级、高性能的流量治理工具,通过 资源定义、责任链模式和滑动窗口实现流量控制、熔断降级、热点限流和系统保护。Sentinel 是阿里巴巴开源的面向分布式服务架构中的流量治理组件,主要用于提供服务保护功能,帮助微服务系统应对高并发场景下的流量冲击、系统故障等问题。- 如果请求违反规则(如 异常率过高),Sentinel 抛出 `BlockException`。- Sentinel 使用 滑动时间窗口算法,统计指定时间窗口内的请求量(如 QPS)。
2025-06-23 16:27:24
512
原创 seata的实现原理
Seata 支持多种分布式事务模式,包括 AT(Automatic Transaction)、TCC(Try-Confirm-Cancel)、SAGA 和 XA,其中 AT 模式是最常用的模式。- 回滚:如果全局事务需要回滚,TC 通知 RM,RM 根据 `undo_log` 中的 before image 恢复数据。- Transaction Coordinator (TC):事务协调者,服务端,负责全局事务的协调和管理,维护事务状态。
2025-06-21 10:47:36
340
原创 Sentinel实现原理
Sentinel 的实现原理基于 资源保护 和 责任链模式,通过滑动窗口、限流算法、状态机等技术实现流量控制和熔断降级。Sentinel 是阿里巴巴开源的分布式系统流量控制组件,主要用于服务保护,涵盖流量控制、熔断降级、系统负载保护等功能。- 资源:Sentinel 将需要保护的代码块(如方法、接口)定义为资源,资源是流量控制的最小单位。- 槽位(Slot):Sentinel 采用责任链模式,每个槽位负责特定功能(如统计、限流、熔断)。- SystemSlot:检查系统负载(如 CPU、内存)是否超限。
2025-06-20 20:01:38
604
原创 对gateway和nocas的理解
网关用于判断请求是否匹配特定路由规则的条件。网关接收到客户端请求后,会根据断言的匹配结果决定将请求路由到哪个后端服务。网关用于处理请求的组件。过滤器可以在请求到达后端服务之前或响应返回客户端之前执行自定义操作,例如修改请求头、认证、限流、日志记录等。过滤器分为前置过滤器和后置过滤器。断言决定“路由到哪里”,过滤器决定“路由前后做什么”。提供分布式配置管理、服务注册与发现,适合动态配置和多环境管理。
2025-06-19 15:22:10
917
原创 什么是 OpenFeigin ?微服务中的具体使用方式
Feign 是一种声明式的 HTTP 客户端框架,主要用于简化微服务架构中服务之间的远程调用,也可以通过定义接口和注解的方式调用远程服务,无需手动构建 HTTP 请求或解析响应数据。Spring Cloud 对 Feign 进行了增强,集成了 负载均衡和 服务发现,并支持 Spring MVC 注解。
2025-06-18 16:13:47
815
原创 对微服务的了解
服务熔断是一种保护机制,当某个微服务调用频繁失败或响应过慢时,触发熔断器打开,暂时阻止对该服务的后续请求,直接返回预设的错误响应;服务降级是指当系统资源紧张或服务不可用时,主动降低服务质量或功能,优先保证核心功能的正常运行,牺牲非核心功能以维持系统整体稳定性;微服务中服务调用流程:包括服务注册、发现、负载均衡、请求调用、容错处理、响应返回等步骤,依赖注册中心、网关、容错组件等。场景:调用支付服务时,连续多次超时,触发熔断器打开,后续请求直接返回“服务不可用”提示,防止进一步调用导致系统过载。
2025-06-17 14:43:19
445
原创 JWT认证机制概念
**Signature(签名)**: 通过对 Header 和 Payload 进行签名生成,用于验证 token 的完整性和真实性。- **Header(头部)**: 包含 token 的类型(通常是 "JWT")和签名算法(如 HMAC SHA256 或 RSA)。- **验证**: 服务器收到 JWT 后,使用密钥验证签名的有效性,并检查 Payload 中的声明(例如是否过期)。- **Payload(负载)**: 包含声明(claims),即关于用户或其他数据的键值对。
2025-04-09 15:11:36
397
原创 mybatis是如何进行分页的?分页插件的原理是什么
调用分页插件的 `startPage` 方法时,会创建一个 `Page` 对象,将分页参数(如当前页码 `pageNum` 和每页显示条数 `pageSize`)设置到这个 `Page` 对象中。拦截器会获取到 `ThreadLocal` 中保存的分页参数,并根据这些参数和数据库类型(通过方言 `Dialect` 来适配),自动修改原始的 SQL 语句,添加分页相关的 SQL 片段(如 `LIMIT` 语句)来实现分页功能。执行完分页查询后,分页插件会将分页结果封装到 `Page` 对象中。
2025-04-08 14:18:50
407
原创 当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
**推荐方式**:如果使用 ORM 框架,优先使用注解(如 `@Column` 或 `@Result`)或配置文件(如 `resultMap`),因为这样代码更简洁且维护性好。如果你使用的是 MyBatis,可以在 XML 配置文件中通过 `<resultMap>` 来定义属性和字段的映射关系。第 1 种 : 通过在查询的 sql 语句中定义字段名的别名 , 让字段名的别名和实体类的属性。在这个例子中,实体属性 `name` 被映射到数据库中的 `user_name` 字段。
2025-04-07 20:05:41
558
原创 RBAC权限管理
4. **RBAC3(综合模型)**:结合了RBAC1和RBAC2的特性,同时包含角色继承和更严格的访问约束,适用于对安全合规性要求较高、角色关系复杂的大型企业系统。3. **RBAC2(具有约束的RBAC)**:在RBAC的基础上增加了约束条件,如角色的互斥性、基于时间或上下文的约束等,适用于对安全性有较高要求的环境。2. **RBAC1(具有角色层级的RBAC)**:角色之间可以建立层级关系,形成父子角色的结构,子角色继承父角色的所有权限,并且可以拥有特定的附加权限。
2025-04-02 15:51:56
465
原创 项目中为什么使用 spring框架
Spring 是一个模块化的框架,提供了多种功能模块(如 Spring MVC、Spring Boot、Spring Security、Spring Data 等),可以根据项目需求选择性地使用。总结来说,Spring 框架因其灵活性、可扩展性和对现代开发需求的全面支持,成为许多项目的首选。Spring 提供了面向切面编程(AOP)的支持,可以方便地实现横切关注点(如日志记录、性能监控、事务管理等),无需将这些逻辑混入业务代码中,提高了代码的复用性和清晰度。5. **强大的生态系统**
2025-04-01 13:48:00
412
原创 哪些垃圾收集算法
结合复制、标记-清除等算法。- **原理**:从根对象(如全局变量、栈上的变量)开始,标记所有可达的对象,然后清除未被标记的对象(即垃圾)。- **原理**:在标记阶段标记可达对象后,将所有存活对象移动到内存的一端,消除碎片,然后清理剩余空间。- **缺点**:无法处理循环引用(如 A 引用 B,B 引用 A),且维护计数器有额外开销。- **缺点**:会导致内存碎片,且暂停时间较长(Stop-the-World)。- **原理**:为每个对象维护一个引用计数器,当引用数变为 0 时,对象被回收。
2025-03-31 16:57:19
447
原创 什么是 Java虚拟机?为什么Java 被称作是 平台无关的编程语 言
Java虚拟机(JVM,全称Java Virtual Machine)是Java编程语言的核心组成部分之一,它是一个抽象的计算机器,负责在不同的硬件和操作系统上运行Java字节码。- **字节码的中间层**:Java代码首先被编译成与平台无关的字节码,而不是直接生成特定操作系统的机器码。- **JVM的适配性**:只要目标设备上安装了对应版本的JVM,同一个Java程序就可以在Windows、Linux、macOS等不同平台上运行,而无需修改源代码。4. **提供运行时环境**:包括类库、安全管理等支持。
2025-03-28 15:45:30
210
原创 springBoot中雪花算术法
2. **41 位时间戳**:表示毫秒级时间戳,通常是当前时间与某个起始时间(epoch)的差值,可支持约 69 年的时间范围。- **MyBatis-Plus**:如果你的项目使用 MyBatis-Plus,它也提供了雪花算法的支持。2. **机器 ID 分配**:在分布式环境中,确保每个节点的 `workerId` 唯一。4. **12 位序列号**:每毫秒内的自增序列号,支持每毫秒生成 4096 个 ID。3. **10 位机器 ID**:表示机器或进程的标识,支持 1024 个节点。
2025-03-26 18:39:51
1641
1
原创 说说堆和栈的区别
**堆**:堆是一个动态内存分配区域,不遵循严格的访问顺序。- **栈**:栈的大小通常较小,由操作系统或编译器预先设定(例如几 MB),超出限制会导致栈溢出(Stack Overflow)。- **堆**:堆的内存是非连续的,分配需要查找空闲块,访问时可能涉及指针解引用,速度稍慢。- **堆**:堆的大小受可用系统内存限制,通常远大于栈,适合存储大数据量的对象。- **栈**:栈上的变量生命周期与函数调用绑定,函数结束时自动销毁。- **栈**:由于栈的内存是连续的,且分配方式简单,访问速度更快。
2025-03-25 15:50:18
328
原创 简述一下 的内存模型
结合之前的上下文,我们一直在讨论 MySQL 主从复制的问题,我猜测你可能想问 **MySQL 的内存模型**。MySQL 的内存模型主要分为**全局内存**和**会话内存**两部分,涉及服务器级别的共享资源和每个客户端连接的私有资源。- **动态分配**:全局内存(如 Buffer Pool)在启动时分配,可动态调整;- **主库**:二进制日志缓存(`binlog_cache_size`)存储待发送的事件。#### 2. **会话内存(Thread-Specific Memory)**
2025-03-24 20:35:36
487
原创 VMware虚拟机配置Linux网络
编辑网卡配置文件:`vi ifcfg-ens33`,将`BOOTPROTO`设为`static`,设置`IPADDR`为与VMnet1相同网段的不同IP,`NETMASK`、`GATEWAY`和`DNS`与VMnet1相同。- 编辑网卡配置文件:`vi ifcfg-ens33`,将`BOOTPROTO`设为`static`,设置`IPADDR`为与NAT设置相同网段的不同IP,`NETMASK`、`GATEWAY`和`DNS`与NAT设置相同。- 修改网络配置文件后,若网络未生效,可尝试重启虚拟机。
2025-03-22 08:34:08
881
原创 乐观锁的原理
**版本号机制**:在数据库表中添加一个版本号字段,每次数据被修改时,版本号会递增。例如,TcaplusDB在内部为每条数据维护了一个版本号,用户在提交更新请求时,可以指定期望的数据版本号,只有数据的当前版本号与用户期望的版本号一致时,才会执行更新操作。- **时间戳机制**:使用时间戳来标记数据的更新时间,类似于版本号机制,通过比较时间戳来判断数据是否被其他事务修改。- **高并发性能**:乐观锁不加锁,避免了线程阻塞和死锁问题,适用于读多写少的场景,能有效提高并发性能。它的基本思路是在数据的每。
2025-03-21 15:49:24
456
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅