Skip to content

qiulaidongfeng/cachefs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cachefs

English

介绍

通过go的http.FileServer(http.Dir(path))可以很方便的创建文件服务器 go的http.Dir如果没有错误每次Open调用都会进行一次os.Open调用,os.Stat调用,至少一次的(*os.File).Read调用,这些最终会调用syscall包的函数进行系统调用,即使文件没有修改,这可以优化。 本包提供 HttpCacheFs ,可以将 http.Dir(path) 替换为 cachefs.HttpCacheFs(path) ,在被读取文件没有修改(当前通过比较修改时间判断),可以减少系统调用(具体是避免os.Open,(*os.File).Read),提高性能。

实现原理

HttpCacheFs

实现了http.FileSystem 接口 内部有一个哈希表 key是path value的类型是*CacheFs,用作缓存 如果path已经被哈希表缓存,直接返回缓存,从而避免os.Open

CacheFs

实现了http.File接口 内部用Buf保存文件数据,保留文件的(*os.File)句柄 当Read或Seek方法被调用时,先通过比较修改时间判断文件有没有修改

  • 如果没有修改,调用Buf的Read或Seek方法,避免(*os.File).Read或(*os.File).Seek
  • 如果有修改,重新读取文件数据,并更新HttpCacheFs的缓存,再调用Read或Seek方法

Close方法为了配合http.FileServer,永远返回nil,并且不关闭文件句柄

当Readdir或Stat方法被调用时,先通过比较修改时间判断文件有没有修改

  • 如果没有修改,调用os.File的Readdir或Stat
  • 如果有修改,重新读取文件数据,并更新HttpCacheFs的缓存,再调用Readdir或Stat方法
Buf

实现了io.Reader接口 实现了io.Seeker接口 Buf将[]byte封装成数据流,读取到末尾返回 io.EOF 后下次读取会从头开始

参与贡献

  1. 创建一个issue
  2. Fork 本仓库
  3. 新建 Fork_xxx 分支
  4. 提交代码
  5. 新建 Pull Request

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages