java 内存文件 加速_内存不够用还要速度快,终于找到可以基于 File 的 Cache 了...

一:背景

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 还是可以的,接下来试试看。

3d1150891093ef64503f29fb6502c98c.png

bc3f878e7e63bac1b32071cdf434d72e.png

这里有二个注意点:

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

d9ce2f0fd03a1c18aa80c758c57b58e7.png

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

三:aspnetcore 的 EasyCaching

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

63f436913f7932cbc8d0506b55179d55.png

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

1. 安装使用

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

c180aa694990b9b1bc12afdf09549b93.png

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

99e0ea45c5d5e50c8f31d15679892b6b.png

4f2559555cd6d0b5a7001fb06d203fa2.png

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

50d10df1c49e8c968b958e2e8c2422e6.png

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值