趣文网 > 作文大全

内存不够用还要速度快 终于找到可以基于 File 的 Cache 了

2020-12-02 03:50:01
相关推荐

一:背景

1. 讲故事

18年的时候在做纯内存项目的过程中遇到了这么一个问题,因为一些核心数据都是飘在内存中,所以内存空间对我们来说额外宝贵,但偏偏项目中有些数据需要缓存,比如说需要下钻的报表上的点,基于性能的考虑,不希望采用独立的缓存中间件,比如 redis, mongodb,毕竟再怎么滴还是要走网络io,但直接放在本机内存中也不现实,那有没有均衡于 native cache 和 cache server 之间的方案呢? 对的,就是 disk cache,毕竟 磁盘IO 的读写要远大于网络IO,更何况配的是 SSD 呢。

二: 寻找解决方案

1. 检索 github

有了 disk cache 这个大方向就可以去 github 上检索关键词,看看有没有类似的中间件,说实话,java的倒不少,比如著名的 guava,ehcache,不仅有cache的简单操作,还附带各种统计信息,刷新了对缓存认知的三观哈,尤其是 ehcache 太了,堆内,堆外,磁盘,分布式通通支持,用 C# 写得好不容易找到一个 disk cache 还不幸是收费的,气人哈,用 C# 调用 Java 肯定不现实了哈。

2. 使用sqlite作为 disk cache

既然开源社区没什么好的东西,看来只能自己封装一下了,像 ehcache 那种高阶的 diskcache 搞不定,用简单的 sqlite 作为本机的 diskcahe 还是可以的,接下来试试看。

这里有二个注意点:

因为是做缓存,所以数据库和表的创建都要通过程序自动化,数据库是否存在判断 file 文件是否存在即可。过期数据的问题,因为我有 expried 字段,这一点可以学习GC思想,使用 Timer 在后台定期清理。有了这些基础之后,原子化的缓存就实现好了,接下来试一下基本的 Get / Set方法。

这个方案很好地节省了我宝贵的内存,同时速度又是 networkio 和 native 之间的一个平衡,算是个不错的解决办法吧。

三:aspnetcore 的 EasyCaching

EasyCaching 是园子里 @Catcher Wong 的作品 ,点赞~~~ 看了下提供了很多种 provider,如下图:

我想后面肯定还会有更多的 provider 出现,如: leveldb,Cassandra,接下来看看这玩意怎么玩。

1. 安装使用

在 nuget 上 搜一下 EasyCaching.SQLite 安装即可,如下图:

文档中是采用依赖注入的方式,而我的程序是 console 模式的后端服务,并没有 ServiceCollection,先模拟着试试看。

接下来用 SQLiteStudio 打开 demo.db 看一下数据呈现,如下图:

可以看到人家的框架比我的多了一个 name 字段,看样子是给 多个 cache 做隔离用的,不过这里貌似有三个需要优化的地方。

并不是每一个程序都要使用 依赖注入 的方式 ,提供更便捷的方式初始化就更好了。看了下源码,并没有找到可以定期删除过期数据的业务逻辑。建议提供一些 cache 的统计信息,如命中次数,某一个key最后命中时间等等时分统计图。四: 总结

可能很多人说都什么年代了还用 disk cache,这偏偏这万千世界啥需求都有,这几年开源项目越来越多,社区向好,值得点赞。

想了解更多精彩内容,快来关注计算机java编程

阅读剩余内容
网友评论
相关内容
延伸阅读
小编推荐

大家都在看

责任与能力作文 爱国人士的作文 兔子玩偶作文 初中生话题作文题目 英语周活动英语作文 秋天来了作文三年级 写麻雀的作文100字 最感动的一件事作文300字 植物园作文500字 爱管闲事的爷爷作文 励志作文高中 颠倒的作文 成为志愿者英语作文 2014浙江高考语文作文 节约用水用电的作文 东钱湖作文 我读书的经历作文 疫情后作文 以荣誉为话题高中作文 理解话题作文 我的朋友圈作文 描写文物的作文 原来如此作文开头结尾 哇他这个人作文500字 亲情类作文结尾 放风筝作文250个字 春天的景色二年级作文 描写孔雀舞的作文 一年级写作文 我的乐园作文600字初一