MCPcopy Index your code
hub / github.com/daangn/minimemcached

github.com/daangn/minimemcached @v1.2.1

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.2.1 ↗ · + Follow
90 symbols 242 edges 9 files 40 documented · 44%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Minimemcached

Go Reference Test

Minimemcached is a Memcached server for written in Go, aimed for unittests in Go projects.


When you have to test codes that use Memcached server, running actual Memcached server instance could be quite expensive, depending on your environment.

Minimemcached aims to solve this problem by implementing Memcached's TCP interface 100% in Go, and works perfectly well with gomemcache, a memcache client for Go.

Implemented commands

  • get
  • gets
  • cas
  • set
  • touch
  • add
  • replace
  • append
  • prepend
  • delete
  • incr
  • decr
  • flush_all
  • version

Setup

  • To use Minimemcached, you can import it as below. You can also view example code.
package main

import (
    "fmt"

    "github.com/bradfitz/gomemcache/memcache"

    "github.com/daangn/minimemcached"
)

func main() {
    cfg := &minimemcached.Config{
        Port: 8080,
    }
    m, err := minimemcached.Run(cfg)
    if err != nil {
        fmt.Println("failed to start mini-memcached server.")
        return
    }

    defer m.Close()

    fmt.Println("mini-memcached started")

    mc := memcache.New(fmt.Sprintf("localhost:%d", m.Port()))
    err = mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value"), Expiration: int32(60)})
    if err != nil {
        fmt.Printf("err(set): %v\n", err)
    }

    it, err := mc.Get("foo")
    if err != nil {
        fmt.Printf("err(get): %v\n", err)
    } else {
        fmt.Printf("key: %s, value: %s\n", it.Key, it.Value)
        fmt.Printf("value: %s\n", string(it.Value))
    }
}

Benchmarks

  • Running same test cases on memcached server on a docker and minimemcached, minimemcached outperformed memcached running on docker container.
  • You can run this benchmark yourself. Check here.

Benchmark Environment

  • goos: darwin
  • goarch: arm64
  • memcached docker image: memcached:1.5.16

Results

# Memcached running on a docker container.
BenchmarkMemcached-8             610       1721643 ns/op
BenchmarkMemcached-8             729       1714716 ns/op
BenchmarkMemcached-8             717       1716914 ns/op
BenchmarkMemcached-8             698       1783312 ns/op
BenchmarkMemcached-8             693       1784781 ns/op

# Minimemcached.
BenchmarkMinimemcached-8    24710        46661 ns/op
BenchmarkMinimemcached-8    24684        47918 ns/op
BenchmarkMinimemcached-8    24866        47558 ns/op
BenchmarkMinimemcached-8    25046        46770 ns/op
BenchmarkMinimemcached-8    26085        46707 ns/op

op: set, get, delete operation

  • As shown in the result above, minimemcached took about 47122.8 ns per operation, when memcached took about 1744273.2 ns per operation.

Author

Contributions

  • If you want to contribute to Minimemcached, feel free to create an issue or pull request!

Extension points exported contracts — how you extend this code

Option (FuncType)
(no doc)
minimemcached.go

Core symbols most depended-on inside this repo

invalidate
called by 11
minimemcached.go
isLegalKey
called by 11
util.go
incrementCASToken
called by 9
minimemcached.go
handleErr
called by 7
handlers.go
isLegalValue
called by 6
util.go
Close
called by 5
minimemcached.go
Run
called by 4
minimemcached.go
Port
called by 3
minimemcached.go

Shape

Function 63
Method 22
Struct 4
FuncType 1

Languages

Go100%

Modules by API surface

minimemcached_test.go37 symbols
minimemcached.go15 symbols
handlers.go15 symbols
commands.go13 symbols
util.go4 symbols
server.go3 symbols
benchmarks/benchmark_test.go2 symbols
examples/main.go1 symbols

For agents

$ claude mcp add minimemcached \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact