Skip to content

djherbis/fscache

Folders and files

NameName
Last commit message
Last commit date

Latest commit

442a07e · Nov 27, 2023
Nov 26, 2023
Nov 26, 2023
Mar 26, 2015
Feb 22, 2022
Nov 26, 2023
Nov 26, 2023
Oct 24, 2020
Nov 26, 2023
Nov 26, 2023
Nov 27, 2023
Nov 26, 2023
Apr 25, 2021
Apr 6, 2015
Oct 24, 2020
Nov 26, 2023
Feb 1, 2019
Apr 25, 2021
Jan 28, 2019
Nov 26, 2023
Mar 5, 2016

Repository files navigation

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