mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2025-02-24 15:16:19 +00:00
93 lines
2.1 KiB
Markdown
93 lines
2.1 KiB
Markdown
fscache
|
|
==========
|
|
|
|
[](https://godoc.org/github.com/djherbis/fscache)
|
|
[](https://github.com/djherbis/fscache/releases/latest)
|
|
[](LICENSE.txt)
|
|
[](https://travis-ci.org/djherbis/fscache)
|
|
[](https://coveralls.io/r/djherbis/fscache?branch=master)
|
|
[](https://goreportcard.com/report/github.com/djherbis/fscache)
|
|
|
|
Usage
|
|
------------
|
|
Streaming File Cache for #golang
|
|
|
|
fscache allows multiple readers to read from a cache while its being written to. [blog post](https://djherbis.github.io/post/fscache/)
|
|
|
|
Using the Cache directly:
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"time"
|
|
|
|
"gopkg.in/djherbis/fscache.v0"
|
|
)
|
|
|
|
func main() {
|
|
|
|
// create the cache, keys expire after 1 hour.
|
|
c, err := fscache.New("./cache", 0755, time.Hour)
|
|
if err != nil {
|
|
log.Fatal(err.Error())
|
|
}
|
|
|
|
// wipe the cache when done
|
|
defer c.Clean()
|
|
|
|
// Get() and it's streams can be called concurrently but just for example:
|
|
for i := 0; i < 3; i++ {
|
|
r, w, err := c.Get("stream")
|
|
if err != nil {
|
|
log.Fatal(err.Error())
|
|
}
|
|
|
|
if w != nil { // a new stream, write to it.
|
|
go func(){
|
|
w.Write([]byte("hello world\n"))
|
|
w.Close()
|
|
}()
|
|
}
|
|
|
|
// the stream has started, read from it
|
|
io.Copy(os.Stdout, r)
|
|
r.Close()
|
|
}
|
|
}
|
|
```
|
|
|
|
A Caching Middle-ware:
|
|
|
|
```go
|
|
package main
|
|
|
|
import(
|
|
"net/http"
|
|
"time"
|
|
|
|
"gopkg.in/djherbis/fscache.v0"
|
|
)
|
|
|
|
func main(){
|
|
c, err := fscache.New("./cache", 0700, 0)
|
|
if err != nil {
|
|
log.Fatal(err.Error())
|
|
}
|
|
|
|
handler := func(w http.ResponseWriter, r *http.Request) {
|
|
fmt.Fprintf(w, "%v: %s", time.Now(), "hello world")
|
|
}
|
|
|
|
http.ListenAndServe(":8080", fscache.Handler(c, http.HandlerFunc(handler)))
|
|
}
|
|
```
|
|
|
|
Installation
|
|
------------
|
|
```sh
|
|
go get gopkg.in/djherbis/fscache.v0
|
|
```
|