# cachefs **Repository Path**: qiulaidongfeng/cachefs ## Basic Information - **Project Name**: cachefs - **Description**: 本包实现缓存文件系统 - **Primary Language**: Go - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-02-26 - **Last Updated**: 2025-03-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # cachefs [English](./README.en.md) #### 介绍 > 通过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](https://pkg.go.dev/net/http#FileSystem) 接口 内部有一个哈希表 key是path value的类型是*CacheFs,用作缓存 如果path已经被哈希表缓存,直接返回缓存,从而避免os.Open ##### CacheFs 实现了[http.File](https://pkg.go.dev/net/http#File)接口 内部用Buf保存文件数据,保留文件的(*os.File)句柄 当Read或Seek方法被调用时,先通过比较修改时间判断文件有没有修改 - 如果没有修改,调用Buf的Read或Seek方法,避免(*os.File).Read或(*os.File).Seek - 如果有修改,重新读取文件数据,并更新HttpCacheFs的缓存,再调用Read或Seek方法 Close方法为了配合[http.FileServer](https://pkg.go.dev/net/http#FileServer),永远返回nil,并且不关闭文件句柄 当Readdir或Stat方法被调用时,先通过比较修改时间判断文件有没有修改 - 如果没有修改,调用os.File的Readdir或Stat - 如果有修改,重新读取文件数据,并更新HttpCacheFs的缓存,再调用Readdir或Stat方法 ##### Buf 实现了[io.Reader](https://pkg.go.dev/io#Reader)接口 实现了[io.Seeker](https://pkg.go.dev/io#Seeker)接口 Buf将[]byte封装成数据流,读取到末尾返回 [io.EOF](https://pkg.go.dev/io#EOF) 后下次读取会从头开始 #### 参与贡献 1. 创建一个issue 2. Fork 本仓库 3. 新建 Fork_xxx 分支 4. 提交代码 5. 新建 Pull Request