djherbis / fscache

Streaming File Cache for #golang
MIT License
127 stars 34 forks source link

fscache

GoDoc Release Software License go test Coverage Status Go Report Card

Usage

Streaming File Cache for #golang

fscache allows multiple readers to read from a cache while its being written to. blog post

Using the Cache directly:

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:

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

go get gopkg.in/djherbis/fscache.v0