Skip to content

Commit

Permalink
Deprecated old method
Browse files Browse the repository at this point in the history
  • Loading branch information
OrlovEvgeny committed May 20, 2019
1 parent ff14629 commit 9e9261a
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 130 deletions.
53 changes: 7 additions & 46 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
```
Expand All @@ -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
Expand Down
11 changes: 5 additions & 6 deletions bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
}
2 changes: 0 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
module github.com/OrlovEvgeny/go-mcache

require github.com/vmihailenco/msgpack v4.0.1+incompatible
2 changes: 0 additions & 2 deletions go.sum

This file was deleted.

67 changes: 26 additions & 41 deletions mcache.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
}
Expand Down Expand Up @@ -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)
}
36 changes: 3 additions & 33 deletions mcache_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package mcache
import (
"log"
"testing"
"time"
)

var (
Expand All @@ -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)
}
Expand All @@ -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)
Expand Down

0 comments on commit 9e9261a

Please sign in to comment.