You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: cache.go
    path of file: ./repos/glider/dns
    
    the code of the file until where you have to start completion: package dns

import (
	"sync"
	"time"
)

// LruCache is the struct of LruCache.
type LruCache struct {
	mu    sync.Mutex
	size  int
	head  *item
	tail  *item
	cache map[string]*item
	store map[string][]byte
}

// item
    
func NewLruCache(size int) *LruCache {
	// init 2 items here, it doesn't matter cuz they will be deleted when the cache is full
	head, tail := &item{key: "head"}, &item{key: "tail"}
	head.next, tail.prev = tail, head
	c := &LruCache{
		size:  size,
		head:  head,
		tail:  tail,
		cache: make(map[string]*item, size),
		store: make(map[string][]byte),
	}
	c.cache[head.key], c.cache[tail.key] = head, tail
	return c
}