Skip to content
This repository was archived by the owner on Mar 8, 2024. It is now read-only.
/ gotcha Public archive

gotcha: inmemory-cache in Go (Golang) with customizable algorithm

License

Notifications You must be signed in to change notification settings

bxcodec/gotcha

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

1a235ef · Dec 28, 2022

History

49 Commits
Dec 27, 2022
Dec 27, 2022
Dec 28, 2022
Dec 27, 2022
Dec 27, 2022
Dec 28, 2022
Dec 27, 2022
Dec 27, 2022
Apr 14, 2019
Dec 27, 2022
Dec 27, 2022
Dec 25, 2022
Apr 12, 2019
Dec 27, 2022
Dec 28, 2022
Dec 27, 2022
Apr 13, 2019
Dec 28, 2022

Repository files navigation

gotcha

gotcha: inmemory-cache in Go (Golang) with customizable algorithm

Go Go.Dev

Index

Support

You can file an Issue. See documentation in Godoc

Getting Started

Download

go get -u github.com/bxcodec/gotcha

Example

With Cache Client

package main

import (
	"fmt"
	"log"

	"github.com/bxcodec/gotcha"
)

func main() {
	cache := gotcha.New()
	err := cache.Set("name", "John Snow")
	if err != nil {
		log.Fatal(err)
	}
	val, err := cache.Get("name")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(val)
}

Without Cache Client

package main

import (
	"fmt"
	"log"

	"github.com/bxcodec/gotcha"
)

func main() {
	err := gotcha.Set("name", "John Snow")
	if err != nil {
		log.Fatal(err)
	}
	val, err := gotcha.Get("name")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(val)
}

With Custom Cache ALgorithm

You can also custom and change the algorithm, expiry-time and also maximum memory.

gotcha.NewOption().SetAlgorithm(cache.LRUAlgorithm).
	  SetExpiryTime(time.Minute * 10).
	  SetMaxSizeItem(100).
	  SetMaxMemory(cache.MB * 10)

Warn: Even gotcha support for MaxMemory, but the current version it's still using a simple json/encoding to count the byte size. So it will be slower if you set the MaxMemory.

Benchmark for LRU with/without MaxMemory

# With MaxMemory
20000000	      7878 ns/op	    1646 B/op	      20 allocs/op

# Without MaxMemory
200000000	       776 ns/op	     150 B/op	       6 allocs/op

If you seeking for fast performances and also your memory is high, ignore the MaxMemory options. I'm still looking for the better solutions for this problem. And if you have a better solutions, please kindly open and issue or submit a PR directly for the better results.

LRU

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/bxcodec/gotcha"
	"github.com/bxcodec/gotcha/cache"
)

func main() {
	cache := gotcha.New(
		gotcha.NewOption().SetAlgorithm(cache.LRUAlgorithm).
			SetExpiryTime(time.Minute * 10).SetMaxSizeItem(100),
	)
	err := cache.Set("Kue", "Nama")
	if err != nil {
		log.Fatal(err)
	}
	val, err := cache.Get("Kue")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(val)
}

LFU

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/bxcodec/gotcha"
	"github.com/bxcodec/gotcha/cache"
)

func main() {
	cache := gotcha.New(
		gotcha.NewOption().SetAlgorithm(cache.LFUAlgorithm).
			SetExpiryTime(time.Minute * 10).SetMaxSizeItem(100),
	)
	err := cache.Set("Kue", "Nama")
	if err != nil {
		log.Fatal(err)
	}
	val, err := cache.Get("Kue")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(val)
}

Contribution

  • You can submit an issue or create a Pull Request (PR)