CacheSQL一个面向政务系统的内存缓存数据库中间件把 Oracle 的热点表装进 JVM用 B 树做微秒级查询86 项测试全通过JAR 包仅 80KB。一、它解决什么问题做过政务系统的同学都知道——数据库永远是瓶颈。一张社保参保表几百万行前端列表查询一次SELECT * FROM KCA2 WHERE AAC001 12345Oracle 硬解析 磁盘读200ms 起步。并发一上来连接池打满接口超时。CacheSQL 的思路很简单把这些读多写少的热点表整个装进 JVM 内存里。查询走 B 树索引延迟从毫秒级降到微秒级。后端 Oracle 只承担写操作和冷数据查询。┌──────────────┐ 读请求微秒级 ┌──────────────────┐ │ 应用服务 │ ──────────────────────→ │ CacheSQL (内存) │ │ │ │ B树索引查询 │ │ │ ←────────────────────── │ 320万 QPS 峰值 │ │ │ 查询结果 │ │ └──────────────┘ └──────────────────┘ │ ▲ │ 写请求直接写库 │ 启动时全量加载 ▼ │ ┌──────────────┐ ┌──────────────────┐ │ Oracle/MySQL │ │ 定时刷新 / 手动 │ │ 关系数据库 │ │ cache.refreshInterval │ └──────────────┘ └──────────────────┘本质是双写模型应用写关系数据库权威数据源CacheSQL 做读缓存加速。缓存丢了reload 即可。二、它有多快内嵌模式Java API 直调操作QPS延迟table.get()单线程36 万2.8 ustable.get()16 线程320 万0.31 usSQL 等值查询 8 线程87 万1.15 usHTTP 模式REST API推荐 Undertow NIO 引擎操作8 线程 QPSSQL 等值查询2.7 万索引等值查询3.0 万范围查询2.4 万写入insert/update2.7~2.9 万80KB 的 JAR 包JDK 引擎零外部依赖在 8 核机器上跑到这个数字性价比相当高。三、核心特性3.1 B 树索引自研 B 树阶 256支持等值/范围/前缀 LIKE 查询。非唯一索引同一 key 可对应多行。索引列类型自动推断Long/Double/StringHTTP 写入参数自动类型转换不会因为 “0500” 被转成 500 导致查不到。3.2 SQL 查询引擎不用学新 API直接写 SQLSELECT*FROMKCA2WHEREAAC00112345SELECT*FROMKCA2WHEREAAC0011000ANDAAC0012000SELECT*FROMKCA2WHEREAAC002LIKE张%底层用 jsqlparser 4.9 解析执行计划缓存复用。同模板 SQL 只解析一次后续走缓存。3.3 主从复制三种角色一个配置项搞定# Master 节点 server.rolemaster # Slave 节点 server.roleslave server.master.urlhttp://master-host:8080数据流写入请求 → Slave → HTTP 转发 → Master 执行 → OpLog 记录 → 异步广播 → Slave 回放容错设计Slave 写入时 Master 挂了操作缓存在pendingQueueFIFO 队列Master 恢复后后台线程自动重放缓冲操作数据不丢insert 的 upsert 语义保证重放不会产生重复行Master 心跳检测 Slave 存活Slave 断线重连后增量补发3.4 客户端容灾当单机内存装不下所有表时按表分组到多个 CacheSQL 集群。CacheSQLClient自动路由# cachesql.properties cachesql.connectTimeout3000 cachesql.readTimeout5000 cachesql.group.insurance.masterhttp://192.168.1.10:8080 cachesql.group.insurance.slaveshttp://192.168.1.11:8080,http://192.168.1.12:8080 cachesql.group.insurance.tablesKCA2,KCA3 cachesql.group.medical.masterhttp://192.168.1.20:8080 cachesql.group.medical.slaveshttp://192.168.1.21:8080 cachesql.group.medical.tablesYB01,YB02CacheSQLClientclientnewCacheSQLClient(cachesql.properties);// 自动路由到 insurance 组随机选 master/slaveListMapString,Objectrowsclient.get(KCA2,AAC001,12345);// 写优先发 mastermaster 挂了自动切 slaveslave 会转发给 masterclient.insert(KCA2,AAC001,99999,data);已验证的容灾行为13 项 Failover 测试全通过场景行为master 挂了读自动切到 slave无感slave 挂了读自动切到 master无感master 挂了写自动切到 slaveslave 转发给 mastermaster 恢复后pendingQueue 缓冲的操作自动重放master slave 都挂抛异常应用层兜底3.5 双引擎切换# 零依赖80KB默认 server.http.enginejdk # 高性能1.2MB8 线程 QPS 提升 49~108% server.http.engineundertow一行配置切换业务代码零改动。四、5 分钟上手第 1 步编译gitclone https://github.com/yuhou25/CacheSQL.gitcdCacheSQL mvn clean package-DskipTests第 2 步配置编辑config.properties# 连接你的数据库 db.driveroracle.jdbc.driver.OracleDriver db.urljdbc:oracle:thin:192.168.1.10:1521:orcl db.usernameyour_user db.passwordyour_pass # 定义缓存表 cache.table.KCA2.sqlSELECT * FROM KCA2 cache.table.KCA2.indexesAAC001,AAC002,AAC003 # 也支持 MySQL # db.drivercom.mysql.cj.jdbc.Driver # db.urljdbc:mysql://localhost:3306/mydb第 3 步启动java-Xmx2g-jartarget/CacheSQL-1.0-SNAPSHOT.jar第 4 步查询# SQL 查询curlhttp://localhost:8080/cache/query?sqlselect%20*%20from%20KCA2%20where%20AAC001%20%3D%20%2712345%27# 索引等值查询curlhttp://localhost:8080/cache/get?tableKCA2columnAAC001value12345# 范围查询curlhttp://localhost:8080/cache/range?tableKCA2columnAAC001from1000to2000或者用 Java 客户端CacheSQLClientclientnewCacheSQLClient(cachesql.properties);ListMapString,Objectrowsclient.get(KCA2,AAC001,12345);System.out.println(rows);也可以内嵌使用零 HTTP 开销不需要启动独立服务直接在应用里用 Java APITabletabledatabase.load(myTable,SELECT * FROM MY_TABLE,newString[]{id,name});table.indexColumnType().put(id,String.class);ListRowrows(ListRow)table.get(id,12345);// 延迟 2~3 微秒五、设计哲学做这个项目的核心原则是克制。不做理由JOINO(n²) 是数学下限Oracle 都翻车缓存层不该碰分片单机能装下就不分分片的复杂度远超收益持久化数据源在关系库缓存只做加速丢了 reload服务端路由转发多一跳延迟翻倍不如应用端直连只做好一件事单表索引查询的极致性能。六、适用场景CacheSQL 不是通用数据库它最适合政务/社保/医保系统热点表百万级读多写少对查询延迟敏感实时看板/报表把统计口径的基础表加载到内存聚合查询走索引API 缓存层替代 Redis 序列化的方案直接 SQL 查内存表省掉序列化开销数据库减压把高频查询挡在缓存层后端数据库只处理写操作不适用数据量千万级以上、写多读少、需要 JOIN 跨表查询的场景。七、测试覆盖86 项自动化测试全通过覆盖B 树索引15 项SQL 查询引擎11 项内存表 CRUD17 项客户端路由10 项读容灾/写容灾13 项— master 挂了自动切 slaveReplicationManager 缓冲重放10 项— pendingQueue master 恢复后同步主从复制端到端6 项— 两个独立 JVM 进程并发安全2 项性能基准30 项八、项目信息项目信息源码GitHub - yuhou25/CacheSQLJDK 兼容8 / 11 / 17 / 21外部依赖jsqlparser 4.9必选 JDBC 驱动 Undertow 2.2可选JAR 大小80 KBJDK 引擎/ 1.2 MB含 Undertow协议开源欢迎参与如果你在做类似的政务/企业级系统也在头疼数据库读压力的问题欢迎下载试用—git clone后mvn package5 分钟就能跑起来提 Issue— 遇到问题、有建议都欢迎到 GitHub Issues 讨论PR— 欢迎提交代码改进特别是其他数据库的适配、新查询类型的支持评价反馈— 如果觉得有用或不好用在评论区说说你的场景和感受帮助项目改进做开源最难的不是写代码是知道有没有人真的在用。你的每一条反馈都很重要。