# mini-redis **Repository Path**: wangkit/mini-redis ## Basic Information - **Project Name**: mini-redis - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-23 - **Last Updated**: 2026-07-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # mini-redis — 手写仿 Redis 高性能缓存(学习工程) 独立 Maven 工程,单独编译运行,不影响其他项目。 ## 核心能力 | 能力 | 实现 | |------|------| | **TCP 协议** | Netty NIO + Redis RESP,兼容 `redis-cli` | | **堆外存储** | value 分配在 Direct ByteBuf(`PooledByteBufAllocator`),显式 release | | **高并发读写** | `SegmentedMap` 分段读写锁 + Netty 多 Worker | 目标:通过实现一个可用的 Redis 子集,学透: | 主题 | 本项目对应实现 | |------|----------------| | **JVM** | Direct 堆外 vs 堆内 `byte[]`、GC 压力观察、`MemoryMonitor` / `INFO` | | **多线程** | 分段锁 `SegmentedMap`、惰性删除 + 定时清理 | | **Netty** | Reactor、Pipeline、ByteBuf 池化与引用计数、RESP 编解码 | ## 快速开始 ```bash cd mini-redis # 编译 mvn -q clean package -DskipTests # 启动服务(默认 0.0.0.0:6379) mvn -q exec:java # 或 java -jar target/mini-redis-1.0.0-SNAPSHOT.jar --port 6379 # 另开终端,用官方 redis-cli 或内置客户端 redis-cli -p 6379 # SET k v # GET k # EXPIRE k 10 # TTL k # DEL k # PING # INFO ``` 内置简易客户端: ```bash mvn -q exec:java -Dexec.mainClass=com.learn.miniredis.client.MiniRedisCli ``` ## 目录结构(按学习路径阅读) ``` com.learn.miniredis ├── MiniRedisBootstrap # 启动入口、JVM 参数建议 ├── concurrent │ └── SegmentedMap # ★ 分段锁:高并发读写 ├── offheap │ └── OffHeapAllocator # ★ Direct 池分配 / 释放统计 ├── store │ ├── CacheEntry # ★ 堆外 value + TTL │ ├── CacheStore # ★ KV 存储 + 过期策略 │ └── ExpireSweeper # 后台清理线程 ├── protocol │ ├── Resp* # ★ Redis RESP 协议编解码 ├── netty │ ├── RedisServer # ★ Boss/Worker EventLoop(TCP) │ ├── RedisInitializer │ └── CommandHandler # 业务 Handler(注意线程模型) ├── command # GET/SET/DEL/EXPIRE/TTL/PING/INFO... ├── jvm │ └── MemoryMonitor # 堆内存、GC 简单观测 └── client └── MiniRedisCli # 学习用 TCP 客户端 ``` ## 学习路线建议 1. **先跑通**:启动 → `redis-cli` 发命令 → 看日志线程名(`nioEventLoopGroup`)。 2. **读 `SegmentedMap`**:手撕分段锁,对比 `ConcurrentHashMap`,想清楚「锁粒度 vs 吞吐」。 3. **读 `OffHeapAllocator` + `CacheEntry`**:SET 时拷贝进 Direct,DEL/覆盖时 `release`;`INFO` 看 `used_memory_offheap`。 4. **读 `CacheStore` + `ExpireSweeper`**:惰性删除 vs 定期删除(Redis 经典策略)。 5. **读 RESP Decoder**:粘包半包、`ByteBuf` 引用计数、状态机解析。 6. **读 `RedisServer`**:Boss 只 accept,Worker 跑 Pipeline;Handler 里不要阻塞。 7. **调 JVM**:`-Xmx256m -XX:MaxDirectMemorySize=512m -Xlog:gc*` 压测,对比堆 used 几乎不涨、堆外上涨。 ## 支持的命令(子集) | 命令 | 说明 | |------|------| | `PING [msg]` | 心跳 | | `SET key value [EX seconds]` | 写入(value → 堆外) | | `GET key` | 读取 | | `DEL key [key ...]` | 删除并释放堆外 | | `EXISTS key` | 是否存在 | | `EXPIRE key seconds` | 设置过期 | | `TTL key` | 剩余秒数 | | `KEYS pattern` | 简易匹配(`*`) | | `DBSIZE` | key 数量 | | `FLUSHDB` | 清空并释放堆外 | | `INFO` | 堆外/堆内/线程等学习信息 | ## 推荐 JVM 启动参数(学习用) ```bash java -Xms128m -Xmx256m \ -XX:MaxDirectMemorySize=512m \ -XX:+UseG1GC \ -Xlog:gc*:file=gc.log:time,uptime,level,tags \ -jar target/mini-redis-1.0.0-SNAPSHOT.jar --port 6380 ```