憋了大半年,开源了。

一、背景
背景是用 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 采集指标。
我们默认实现了通过日志打印统计指标,如下所示:
实现stats.Handler
接口并将指标采集到 Prometheus

统计维度为 Cache 实例对应的名称,建议参考上文的
graph
、part
设置不同的缓存实例,就会有不同的缓存统计指标。
三、总结
没错,jetcache-go 其实是实现了能跟阿里巴巴开源的 JetCache 缓存框架对齐核心功能,最初在团队内部推广,随后扩展到全公司,经过生产环境的高流量考验,效果显著。开源后,越来越多的用户开始使用这个工具。
感谢大家的认可与支持,期待更多的开发者加入我们,共同维护和贡献这个项目!
感兴趣的帮忙点个 star 不迷路~ Github: https://github.com/mgtv-tech/jetcache-go
评论