还要速度快,终于找到可以基于Fil

一:背景

1.讲故事

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

二:寻找解决方案

1.检索github

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

2.使用sqlite作为diskcache

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

这里有二个注意点:

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

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

三:aspnetcore的EasyCaching

EasyCaching是园子里

CatcherWong的作品,点赞~~~看了下提供了很多种provider,如下图:

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

1.安装使用

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

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

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

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

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

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




转载请注明:http://www.jiaju1314.com/lsqy/lsqy/18327.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了