# NcmCache **Repository Path**: dbin0123/NcmCache ## Basic Information - **Project Name**: NcmCache - **Description**: NcmCache - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-01 - **Last Updated**: 2025-10-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # NCM Cache 基于Netty + RESP协议 + Chronicle Map实现的Redis功能缓存系统 ## 项目结构 ``` NcmCache/ ├── pom.xml # 父级POM文件 ├── ncm-cache-core/ # 核心模块 │ ├── pom.xml │ └── src/main/java/com/aiwiown/ncm/cache/core/ │ ├── NcmCache.java # 缓存接口 │ ├── NcmCacheEntry.java # 缓存条目 │ ├── NcmCacheConfig.java # 缓存配置 │ └── exception/NcmCacheException.java # 缓存异常 ├── ncm-cache-storage/ # 存储模块 │ ├── pom.xml │ └── src/main/java/com/aiwiown/ncm/cache/storage/ │ ├── CompositeChronicleNcmCache.java # 复合缓存实现 │ ├── ChronicleNcmCache.java # 向后兼容的缓存实现 │ └── impl/ # 各种数据类型的具体实现 │ ├── StringChronicleCache.java │ ├── HashChronicleCache.java │ ├── ListChronicleCache.java │ ├── SetChronicleCache.java │ └── SortedSetChronicleCache.java ├── ncm-cache-protocol/ # 协议模块 │ ├── pom.xml │ └── src/main/java/com/aiwiown/ncm/cache/protocol/ │ └── handler/RespCommandHandler.java # RESP协议处理器 ├── ncm-cache-server/ # 服务器模块 │ ├── pom.xml │ └── src/main/java/com/aiwiown/ncm/cache/server/ │ ├── NcmCacheServer.java # Netty服务器 │ ├── RespEncoder.java # RESP编码器 │ └── RespDecoder.java # RESP解码器 ├── ncm-cache-client/ # 客户端模块 │ ├── pom.xml │ └── src/main/java/com/aiwiown/ncm/cache/client/ │ ├── NcmCacheClient.java # Redis客户端 │ ├── ClientRespEncoder.java # 客户端编码器 │ ├── ClientRespDecoder.java # 客户端解码器 │ └── ClientHandler.java # 客户端处理器 └── ncm-cache-test/ # 测试模块 ├── pom.xml └── src/test/java/com/aiwiown/ncm/cache/test/ ├── NcmCacheIntegrationTest.java # 集成测试 └── ChronicleCacheTest.java # 单元测试 ``` ## 功能特性 ### 支持的数据类型 - **String**: 字符串操作 (GET, SET, EXISTS, DEL, EXPIRE, TTL, INCR, DECR, MGET, MSET, APPEND, STRLEN, SETNX, GETRANGE, SETRANGE, GETSET, INCRBY, DECRBY, INCRBYFLOAT, GETBIT, SETBIT, BITCOUNT, BITOP, BITPOS, MSETNX, SETEX, PSETEX) - **Hash**: 哈希表操作 (HGET, HSET, HGETALL, HDEL, HEXISTS, HKEYS, HVALS, HINCRBY, HMGET, HMSET, HSETNX, HSTRLEN, HINCRBYFLOAT) - **List**: 列表操作 (LPUSH, RPUSH, LPOP, RPOP, LRANGE, LLEN, LINDEX, LSET, LTRIM, LREM, RPOPLPUSH, BRPOPLPUSH, BLPOP, BRPOP, LINSERT) - **Set**: 集合操作 (SADD, SISMEMBER, SMEMBERS, SREM, SCARD, SPOP, SRANDMEMBER, SDIFF, SINTER, SUNION, SSCAN) - **Sorted Set**: 有序集合操作 (ZADD, ZRANGE, ZREVRANGE, ZSCORE, ZREM, ZCARD, ZCOUNT, ZINCRBY, ZREVRANGEBYSCORE, ZLEXCOUNT, ZRANGEBYLEX, ZRANK, ZREVRANK, ZPOPMIN, ZPOPMAX, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZINTERSTORE, ZUNIONSTORE, ZSCAN) ### 通用命令支持 - **KEYS**: 查找所有符合给定模式的键 - **SCAN**: 增量迭代键空间,避免阻塞服务器 - **HSCAN**: 增量迭代哈希字段 - **SSCAN**: 增量迭代集合元素 - **ZSCAN**: 增量迭代有序集合元素 - **FLUSHDB**: 清空当前数据库 - **FLUSHALL**: 清空所有数据库 - **INFO**: 获取服务器信息 - **PING**: 测试连接是否正常 - **RANDOMKEY**: 返回随机键 - **TYPE**: 返回键的数据类型 - **QUIT**: 关闭当前连接 - **AUTH**: 认证命令 - **ECHO**: 回显命令 - **SELECT**: 选择数据库 - **PERSIST**: 移除键的过期时间 - **MOVE**: 移动键到另一个数据库 - **OBJECT**: 检查键的内部对象信息 - **RENAME**: 重命名键 - **CLIENT**: 客户端相关命令 - **CONFIG**: 配置相关命令 - **EXISTS**: 检查给定key是否存在 - **EXPIREAT**: 以秒为单位设置key的过期时间戳 - **PEXPIRE**: 设置key的毫秒过期时间 - **PEXPIREAT**: 以毫秒为单位设置key的过期时间戳 - **PTTL**: 获取key的剩余过期时间(以毫秒为单位) - **TTL**: 获取key的剩余过期时间(以秒为单位) ### 核心特性 - **持久化存储**: 使用Chronicle Map实现高效的磁盘持久化存储 - **RESP协议**: 完全兼容Redis RESP协议 - **高性能**: 基于Netty的异步网络通信 - **过期机制**: 支持键值过期和TTL查询 - **多模块架构**: 清晰的模块分离,便于维护和扩展 - **自动目录创建**: 启动时自动创建数据存储目录,确保系统可靠性 ## 技术栈 - **Java 17**: 现代Java特性 - **Netty 4.2.6.Final**: 高性能网络框架 - **Chronicle Map 3.27ea1**: 高性能持久化Map,提供内存效率和磁盘持久化 - **resp-server 0.25.0**: RESP协议支持 - **JUnit 5.10.1**: 单元测试框架 - **SLF4J 2.0.9 + Logback 1.4.14**: 日志框架 ## 快速开始 ### 1. 编译项目 ```bash mvn clean compile ``` ### 2. 运行测试 ```bash mvn test ``` ### 3. 启动服务器 **注意:在Java 11及以上版本运行时,需要添加特定的JVM参数以确保Chronicle Map正常工作。** #### Java 8 ```bash mvn -pl ncm-cache-server "exec:java" "-Dexec.mainClass=com.aiwiown.ncm.cache.server.NcmCacheServer" ``` #### Java 11及以上版本 ```bash mvn -pl ncm-cache-server "exec:java" "-Dexec.mainClass=com.aiwiown.ncm.cache.server.NcmCacheServer" "-Dexec.args=--illegal-access=permit --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-exports java.base/jdk.internal.util=ALL-UNNAMED --add-opens java.lang=ALL-UNNAMED" ``` 或者使用java命令直接运行编译后的jar文件: ```bash # Java 8 java -jar ncm-cache-server/target/ncm-cache-server-1.0-SNAPSHOT.jar # Java 11及以上版本 java --illegal-access=permit --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-exports java.base/jdk.internal.util=ALL-UNNAMED --add-opens java.lang=ALL-UNNAMED -jar ncm-cache-server/target/ncm-cache-server-1.0-SNAPSHOT.jar ``` ### 4. 使用Redis客户端连接 ```bash redis-cli -p 6379 ``` ## 使用示例 ### 服务器端配置 ```java NcmCacheConfig config = NcmCacheConfig.builder() .host("localhost") .port(6379) .maxConnections(1000) .dataPath("./data") .maxMemory(100 * 1024 * 1024) .build(); NcmCacheServer server = new NcmCacheServer(config); server.start(); ``` ### 客户端使用 ```java NcmCacheClient client = new NcmCacheClient("localhost", 6379); client.connect(); // String操作 client.set("key", "value").get(); String value = client.get("key").get(); // Hash操作 client.hset("hash", "field", "value").get(); String hashValue = client.hget("hash", "field").get(); // List操作 client.lpush("list", "item1", "item2").get(); List items = client.lrange("list", 0, -1).get(); client.disconnect(); ``` ## 性能特点 - **内存效率**: Chronicle Map提供高效的内存使用 - **持久化**: 数据自动持久化到磁盘 - **并发安全**: 支持高并发读写操作 - **低延迟**: Netty提供低延迟网络通信 ## 开发计划 - [ ] 集群支持 - [ ] 主从复制 - [ ] 事务支持 - [ ] 发布订阅 - [x] 基本Redis命令支持 (SETNX, HSETNX, PERSIST, ZREVRANGEBYSCORE等) - [x] 更多高级Redis命令支持 (INCRBY, DECRBY, INCRBYFLOAT, HSTRLEN, HINCRBYFLOAT, BRPOPLPUSH, ZLEXCOUNT, ZRANGEBYLEX等) - [ ] 性能优化 - [ ] 监控指标 ## 贡献 欢迎提交Issue和Pull Request来改进项目。 ## 许可证 MIT License