写点什么

憋了大半年,开源了。

作者:daoshenzzg
  • 2025-06-09
    湖南
  • 本文字数:1277 字

    阅读完需:约 4 分钟

憋了大半年,开源了。

一、背景

背景是用 golang 开发一个并发量要求比较高的项目。提到高并发系统设计,就离不开三大利器:缓存、限流、降级。然而,在 golang 的开源世界,居然没找到一个趁手的工具:


要支持:

  • 多级缓存

  • 批量查询

  • 泛型

  • 自动刷新缓存

  • 缓存一致性机制

  • 指标采集

  • 自动降级

要解决

  • 缓存穿透

  • 缓存击穿

  • 大 Key

  • 热 Key

  • 雪崩

要好用

  • 透明代理

  • 灵活拓展


因此,我们决定开源一个 golang 的通用缓存框架解决方案。


二、Jetcache-go 的魅力

2.1 功能概览

2.2 缓存旁路模式(Cache-Aside Pattern)

左边:cache 部分的 graph 是一个 cache 实例

  • cacheType = both # 可选 both、remote、local 三种模式

  • localType = tinyLFU # 可选 tinyLFU、freeCache 两种本地缓存类型

  • codec = msgpack # 可选 json、sonic、msgpack 三种序列化方式

  • redisName = graph # 即 上面的 redis 实例

  • refreshDuration = 1m # 自动刷新缓存周期

  • stopRefreshAfterLastAccess = 5m # 缓存 key 多久没有访问后停止自动刷新

  • localExpire = 1m # 本地缓存过期时长

  • remoteExpire: 1h # 默认的远程缓存过期时长


右边:例举了两种常用的接口使用方式

  • Once 接口查询,并开启缓存自动刷新

  • MGet(稀疏列表缓存)泛型接口查询

我们内部脚手架封装好了通过配置即可初始化缓存实例。红线部分就是被代理的接口,哪怕是遇到了类似 gorm.RecordNotFound 也能被缓存并透明代理,有没有感觉使用非常简单?


2.3 配置项说明

可以看到,我们内置了很多例如 分布式缓存、本地缓存、序列化方式、命中率统计、日志等多种接口实现,用户也可以自己去实现相关接口做拓展。


2.4 缓存指标统计

支持实现stats.Handler接口并注册到 Cache 组件来自定义收集指标,例如使用Prometheus 采集指标。

我们默认实现了通过日志打印统计指标,如下所示:

2023/09/11 16:42:30.695294 statslogger.go:178: [INFO] jetcache-go stats last 1m0s.cache       |         qpm|   hit_ratio|         hit|        miss|       query|  query_fail------------+------------+------------+------------+------------+------------+------------bench       |   216440123|     100.00%|   216439867|         256|         256|           0|bench_local |   216440123|     100.00%|   216434970|        5153|           -|           -|bench_remote|        5153|      95.03%|        4897|         256|           -|           -|------------+------------+------------+------------+------------+------------+------------
复制代码

实现stats.Handler接口并将指标采集到 Prometheus

统计维度为 Cache 实例对应的名称,建议参考上文的 graphpart 设置不同的缓存实例,就会有不同的缓存统计指标。


三、总结

没错,jetcache-go 其实是实现了能跟阿里巴巴开源的 JetCache 缓存框架对齐核心功能,最初在团队内部推广,随后扩展到全公司,经过生产环境的高流量考验,效果显著。开源后,越来越多的用户开始使用这个工具。

感谢大家的认可与支持,期待更多的开发者加入我们,共同维护和贡献这个项目!


感兴趣的帮忙点个 star 不迷路~ Github: https://github.com/mgtv-tech/jetcache-go

用户头像

daoshenzzg

关注

还未添加个人签名 2024-09-18 加入

还未添加个人简介

评论

发布
暂无评论
憋了大半年,开源了。_Go_daoshenzzg_InfoQ写作社区