小菜鸟

java菜鸟号正在起航

Redis 跳跃表(Skiplist)实现详解(基于 6.0.10 版本)

跳跃表(Skiplist)是一种高效的有序数据结构,通过在节点中维护多层指针,实现快速查找、插入和删除操作(平均时间复杂度 O (logN))。Redis 中,跳跃表是有序集合(ZSet)的底层实现之一(当 ZSet 元素数量多或元素较大时使用,替代 ziplist)。本文结合 Redis 源码中的结构体,详解跳跃表的设计与工作原理。

跳跃表的核心作用

ZSet 需要支持按分值(score)排序快速范围查询(如 ZRANGEZREVRANGE),跳跃表相比其他结构(如平衡树)的优势:

  • 实现简单:无需像红黑树那样维护复杂的旋转平衡逻辑。
  • 性能均衡:查找、插入、删除的平均时间复杂度均为 O (logN),且常数因子小。
  • 适合范围查询:通过层级指针可直接定位到范围起点,高效遍历区间元素。

跳跃表的结构体设计

Redis 中跳跃表由两个核心结构体组成:zskiplistNode(节点)和 zskiplist(表本身),定义如下(简化自源码):

跳跃表节点(zskiplistNode

typedef struct zskiplistNode {
    sds ele;                  // 存储的元素(字符串,ZSet 中的 member)
    double score;             // 分值,用于排序(ZSet 中按 score 排序)
    struct zskiplistNode *backward;  // 后退指针(仅指向当前节点的前一个节点,用于反向遍历)
    struct zskiplistLevel {   // 层级数组(每个层级包含前进指针和跨度)
        struct zskiplistNode *forward;  // 前进指针(指向同一层级的下一个节点)
        unsigned long span;             // 跨度(当前节点到 forward 指向节点的"距离",用于计算排名)
    } level[];                // 柔性数组(层级数量动态分配,每层独立维护指针)
} zskiplistNode;
关键字段解析:
  • ele:ZSet 中的成员(member),是一个字符串(sds 类型),具有唯一性(ZSet 不允许重复 member)。
  • score:成员对应的分值,ZSet 按 score 升序排序(相同 score 的节点按 ele 字典序排序)。
  • backward:后退指针,仅用于反向遍历(如 ZREVRANGE),指向当前节点的前一个节点(类似双向链表的 prev 指针),但仅在最底层有效。
  • level[]:层级数组,是跳跃表 “跳跃” 特性的核心:
    • 每个节点的层级数量是随机生成的(通常 1-64 层,Redis 中最大层级为 64)。
    • 层级越高,前进指针跨越的节点越多,查询时可快速 “跳过” 无关节点。

跳跃表本身(zskiplist

阅读全文 »

Redis intset(整数集合)实现详解(基于 6.0.10 版本)

intset(整数集合)是 Redis 中 Set 类型的底层实现之一,专门用于存储整数值元素(如 int16_t、int32_t、int64_t)。当 Set 中仅包含整数且元素数量较少时,Redis 会选择 intset 而非哈希表(hashtable),以节省内存空间。

intset 的核心设计目标

  • 内存高效:相比哈希表(需存储键值对和指针),intset 以紧凑数组形式存储整数,无冗余开销。
  • 类型灵活:支持不同长度的整数(16 位、32 位、64 位),并能自动升级编码以容纳更大的整数。
  • 有序性:元素在数组中按升序排列,支持快速查找(二分查找)。

intset 的结构体设计

intset 的结构体定义简洁高效,源码如下:

typedef struct intset {
    uint32_t encoding;  // 编码方式(决定元素的类型和长度)
    uint32_t length;    // 元素数量
    int8_t contents[];  // 柔性数组,存储整数元素(实际类型由 encoding 决定)
} intset;

各字段详解:

阅读全文 »

Shell 重定向详解:从标准流到 tee 命令的完整指南

在 Shell 中,输入输出重定向是控制命令数据流的核心机制,通过灵活处理标准输入(stdin)、标准输出(stdout)和标准错误(stderr),可以实现日志记录、错误屏蔽、批量处理等多种功能。本文将系统讲解重定向的原理、用法及 tee 命令的应用。

标准流与文件描述符

Shell 中所有命令的输入输出都基于三个标准流,每个流对应一个文件描述符(用于在系统中标识流):

标准流 功能描述 文件描述符 默认设备
stdin 标准输入(命令读取数据) 0 键盘
stdout 标准输出(命令正常输出) 1 终端屏幕
stderr 标准错误(命令错误输出) 2 终端屏幕

这些流可以被重定向到文件、设备或其他命令,改变数据的默认流向。

输入重定向(<

输入重定向用于将命令的输入来源从默认的键盘改为指定文件,语法为:
命令 < 输入文件

常用场景

  • 批量输入数据(如给 mail 命令提供邮件内容);
  • 替代管道传递文件内容(等价于 cat 输入文件 | 命令)。

示例

阅读全文 »

MySQL 忘记密码解决方案:重置密码的完整步骤

忘记 MySQL 密码是常见问题,可通过跳过权限验证的方式重置密码。以下是针对不同操作系统的详细步骤,以及密码策略的调整方法。

通用重置步骤(以 MySQL 8.0 为例)

停止 MySQL 服务

首先确保 MySQL 服务已停止,否则无法进行后续操作:

# Linux/Mac 系统
sudo systemctl stop mysql  # 或 mysql.server stop(取决于安装方式)

# Windows 系统(管理员命令提示符)
net stop mysql

跳过权限验证启动 MySQL

以跳过权限表的方式启动 MySQL,此时登录无需密码:

# Linux/Mac 系统(后台启动,日志输出到文件)
sudo mysqld --skip-grant-tables --user=mysql > /dev/null 2>&1 &

# Windows 系统(需切换到 MySQL 的 bin 目录,如 D:\mysql-8.0\bin)
mysqld --skip-grant-tables

注意

  • 执行此命令时,确保 MySQL 服务已完全停止,否则会提示 “端口被占用”。
  • 该模式下 MySQL 安全性极低,重置密码后需立即关闭并重启服务。

无密码登录 MySQL

新开一个终端 / 命令提示符窗口,直接登录 MySQL(无需输入密码):

mysql -u root  # 直接回车,无需输入密码

刷新权限并重置密码

登录后,需先刷新权限表,再修改 root 密码:

阅读全文 »

Spring Boot 扩展 Spring MVC 详解:保留自动配置与完全自定义配置指南

Spring Boot 对 Spring MVC 提供了完善的自动配置(如默认的 DispatcherServlet、视图解析器、静态资源映射),可满足大部分场景需求。但实际开发中,常需自定义 MVC 特性(如添加拦截器、调整静态资源路径、自定义消息转换器)。从 “自动配置基础→扩展配置(保留自动配置)→完全自定义(抛弃自动配置)→底层原理” 四个维度,系统讲解 Spring Boot 扩展 Spring MVC 的实现方式与底层逻辑,帮你灵活控制 MVC 配置。

Spring Boot 对 Spring MVC 的自动配置回顾

在学习 “扩展” 前,需先明确 Spring Boot 为 Spring MVC 提供的默认自动配置(核心由 WebMvcAutoConfiguration 类实现),避免重复配置或配置冲突:

自动配置项 核心作用 默认行为示例
DispatcherServlet Spring MVC 核心控制器 自动注册,映射路径为 /(所有请求)
静态资源映射 处理 CSS、JS、图片等静态资源 映射 /static/**/public/**classpath:/static/ 等目录
视图解析器 解析逻辑视图名到物理视图路径 支持 Thymeleaf(默认)、JSP 等,前缀 classpath:/templates/,后缀 .html
消息转换器 处理请求体 / 响应体与 Java 对象的转换 默认支持 JSON(MappingJackson2HttpMessageConverter)、表单格式等
拦截器自动注册 注册 Spring 内置拦截器(如路径匹配拦截器) 无自定义拦截器,需手动扩展

扩展 Spring MVC:保留自动配置(推荐)

大部分场景下,无需完全替换自动配置,只需在其基础上补充自定义逻辑(如添加拦截器、调整静态资源)。Spring Boot 提供 WebMvcConfigurer 接口实现这一需求,且 Spring Boot 2.x+ 推荐直接实现该接口(替代过时的 WebMvcConfigurerAdapter)。

1. 核心接口:WebMvcConfigurer(Spring Boot 2.x+ 推荐)

WebMvcConfigurer 是 Spring MVC 提供的 “全局配置接口”,包含一系列 default 方法(Java 8+ 特性),开发者可按需重写,无需实现所有方法。常用方法及作用如下:

阅读全文 »
0%