diff --git a/README.md b/README.md index d67be10..7dcaf95 100644 --- a/README.md +++ b/README.md @@ -29,63 +29,26 @@ type User struct { func main() { //Start mcache instance - MCache = mcache.StartInstance() + MCache = mcache.New() //Create custom key key := "custom_key1" - //Create example struct user := &User{ Name: "John", Age: 20, Bio: "gopher 80 lvl", } - - //args - key, &value, ttl - err := MCache.SetPointer(key, user, time.Minute*20) - if err != nil { - log.Fatal(err) - } - if pointer, ok := MCache.GetPointer(key); ok { - objUser:= pointer.(*User) - fmt.Printf("User name: %s, Age: %d, Bio: %s\n", objUser.Name, objUser.Age, objUser.Bio) - } -} -``` - - - -**Example serialize and deserialize value** (slow method) - -```go -type User struct { - Name string - Age uint - Bio string -} - -func main() { - //Start mcache instance - MCache = mcache.StartInstance() - - //Create custom key - key := "custom_key2" - - userSet := &User{ - Name: "Bob", - Age: 33, - Bio: "gopher 80 lvl", - } - //args - key, &value, ttl - err := MCache.Set(key, userSet, time.Minute*20) + //args - key, &value, ttl (or you need never delete, set ttl is mcache.TTL_FOREVER) + err := MCache.Set(key, user, time.Minute*20) if err != nil { log.Fatal(err) } - var userGet User - if ok := MCache.Get(key, &userGet); ok { - fmt.Printf("User name: %s, Age: %d, Bio: %s\n", userGet.Name, userGet.Age, userGet.Bio) + if data, ok := MCache.Get(key); ok { + objUser:= data.(*User) + fmt.Printf("User name: %s, Age: %d, Bio: %s\n", objUser.Name, objUser.Age, objUser.Bio) } } ``` @@ -98,9 +61,7 @@ func main() { BenchmarkWrite-4 200000 7991 ns/op BenchmarkRead-4 1000000 1716 ns/op BenchmarkRW-4 300000 9894 ns/op - -*dependency use*: [msgpack](https://github.com/vmihailenco/msgpack) - + ### What should be done - [x] the possibility of closing diff --git a/bench_test.go b/bench_test.go index 6e4de5c..5fbd81c 100644 --- a/bench_test.go +++ b/bench_test.go @@ -3,29 +3,28 @@ package mcache import ( "fmt" "testing" - "time" ) //BenchmarkWrite func BenchmarkWrite(b *testing.B) { - mcache = StartInstance() + mcache = New() for i := 0; i < b.N; i++ { - mcache.SetPointer(fmt.Sprintf("%d", i), i, time.Second*60) + mcache.Set(fmt.Sprintf("%d", i), i, TTL_FOREVER) } } //BenchmarkRead func BenchmarkRead(b *testing.B) { for i := 0; i < b.N; i++ { - mcache.GetPointer(fmt.Sprintf("%d", i)) + mcache.Get(fmt.Sprintf("%d", i)) } } //BenchmarkRW func BenchmarkRW(b *testing.B) { for i := 0; i < b.N; i++ { - mcache.SetPointer(fmt.Sprintf("%d", i), i, time.Second*60) - mcache.GetPointer(fmt.Sprintf("%d", i)) + mcache.Set(fmt.Sprintf("%d", i), i, TTL_FOREVER) + mcache.Get(fmt.Sprintf("%d", i)) } } diff --git a/go.mod b/go.mod index b2eb996..176653f 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1 @@ module github.com/OrlovEvgeny/go-mcache - -require github.com/vmihailenco/msgpack v4.0.1+incompatible diff --git a/go.sum b/go.sum deleted file mode 100644 index f16d7c7..0000000 --- a/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/vmihailenco/msgpack v4.0.1+incompatible h1:RMF1enSPeKTlXrXdOcqjFUElywVZjjC6pqse21bKbEU= -github.com/vmihailenco/msgpack v4.0.1+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= diff --git a/mcache.go b/mcache.go index 269f446..848f716 100644 --- a/mcache.go +++ b/mcache.go @@ -5,11 +5,11 @@ import ( "github.com/OrlovEvgeny/go-mcache/gcmap" "github.com/OrlovEvgeny/go-mcache/item" "github.com/OrlovEvgeny/go-mcache/safeMap" - "github.com/vmihailenco/msgpack" - "log" "time" ) +const TTL_FOREVER = time.Hour * 87660 + // var ( storage safeMap.SafeMap @@ -32,7 +32,7 @@ type CacheDriver struct { closeCtx context.CancelFunc } -//StartInstance - singleton func, returns CacheDriver struct +//Deprecated: use New instead. func StartInstance() *CacheDriver { if loadInstance { return instance @@ -48,25 +48,20 @@ func StartInstance() *CacheDriver { return instance } -//Get - returns serialize data -func (mc *CacheDriver) Get(key string, struc interface{}) bool { - data, ok := storage.Find(key) - if !ok { - return false - } - item := data.(item.Item) - if item.IsExpire() { - return false - } - err := decodeBytes(item.Data, struc) - if err != nil { - log.Fatal("error Decoding bytes cache data: ", err) - } - return true +//New - returns CacheDriver struct +func New() *CacheDriver { + ctx, finish := initStore() + + instance = new(CacheDriver) + instance.ctx = ctx + instance.closeCtx = finish + + loadInstance = true + return instance } -//GetPointer - returns &pointer -func (mc *CacheDriver) GetPointer(key string) (interface{}, bool) { +//Get - returns serialize data +func (mc *CacheDriver) Get(key string) (interface{}, bool) { data, ok := storage.Find(key) if !ok { return item.Item{}.DataLink, false @@ -78,23 +73,12 @@ func (mc *CacheDriver) GetPointer(key string) (interface{}, bool) { return entity.DataLink, true } -//Set - add cache data and serialize/deserialize value +//Set - add cache data value func (mc *CacheDriver) Set(key string, value interface{}, ttl time.Duration) error { expire := time.Now().Local().Add(ttl) - go gc.Expired(mc.ctx, key, ttl) - v, err := encodeBytes(value) - if err != nil { - log.Println("MCACHE SET ERROR: ", err) - return err + if ttl != TTL_FOREVER { + go gc.Expired(mc.ctx, key, ttl) } - storage.Insert(key, item.Item{Key: key, Expire: expire, Data: v}) - return nil -} - -//SetPointer - add cache &pointer data (more and example info README.md) -func (mc *CacheDriver) SetPointer(key string, value interface{}, ttl time.Duration) error { - expire := time.Now().Local().Add(ttl) - go gc.Expired(mc.ctx, key, ttl) storage.Insert(key, item.Item{Key: key, Expire: expire, DataLink: value}) return nil } @@ -126,12 +110,13 @@ func (mc *CacheDriver) Close() map[string]interface{} { return storage.Close() } -//deserialize value -func encodeBytes(value interface{}) ([]byte, error) { - return msgpack.Marshal(value) -} -//serialize value -func decodeBytes(buf []byte, value interface{}) error { - return msgpack.Unmarshal(buf, value) +//Deprecated: use Set instead +func (mc *CacheDriver) SetPointer(key string, value interface{}, ttl time.Duration) error { + return mc.Set(key, value, ttl) } + +//Deprecated: use Get instead +func (mc *CacheDriver) GetPointer(key string) (interface{}, bool) { + return mc.Get(key) +} \ No newline at end of file diff --git a/mcache_test.go b/mcache_test.go index 3331a75..db1eddd 100644 --- a/mcache_test.go +++ b/mcache_test.go @@ -3,7 +3,6 @@ package mcache import ( "log" "testing" - "time" ) var ( @@ -20,38 +19,9 @@ type TestData struct { Age int } -//Set cache -func TestSet(t *testing.T) { - mcache = StartInstance() - - dataSet.Name = "John" - dataSet.ID = 11 - dataSet.Age = 24 - - err := mcache.Set(key1, dataSet, time.Second*3) - if err != nil { - t.Errorf("Error %s cache data: %v, ERROR_MSG: %v", t.Name(), dataSet, err) - } - log.Printf("%s : OK\n", t.Name()) -} - -//Get cache -func TestGet(t *testing.T) { - var dataGet TestData - if ok := mcache.Get(key1, &dataGet); ok { - if dataGet.Name != dataSet.Name { - t.Errorf("Cache data incorrect by key: %s", key1) - } - } else { - t.Errorf("Cache not found by key: %s", key1) - } - log.Printf("%s : OK\n", t.Name()) - -} - //Set cache Pointer data -func TestSetPointer(t *testing.T) { - err := mcache.SetPointer(key2, dataSet, time.Second*3) +func TestSet(t *testing.T) { + err := mcache.Set(key2, dataSet, TTL_FOREVER) if err != nil { t.Errorf("Error %s cache data: %v, ERROR_MSG: %v", t.Name(), dataSet, err) } @@ -60,7 +30,7 @@ func TestSetPointer(t *testing.T) { //Get cache Pointer func TestGetPointer(t *testing.T) { - if pointer, ok := mcache.GetPointer(key2); ok { + if pointer, ok := mcache.Get(key2); ok { if obj, ok := pointer.(*TestData); ok { if obj.Age != dataSet.Age { t.Errorf("Cache data incorrect by key: %s", key2)