Alexey Kim 1 year ago
parent
commit
d8b92ab28c
5 changed files with 84 additions and 0 deletions
  1. 10 0
      cache/element.go
  2. 10 0
      cache/icache.go
  3. 55 0
      cache/ttl_cache.go
  4. 3 0
      go.mod
  5. 6 0
      go.sum

+ 10 - 0
cache/element.go

@@ -0,0 +1,10 @@
+package cache
+
+import "github.com/mailru/easyjson"
+
+type Element interface {
+	easyjson.Unmarshaler
+	easyjson.Marshaler
+
+	Key() string
+}

+ 10 - 0
cache/icache.go

@@ -0,0 +1,10 @@
+package cache
+
+import "git.beejay.kim/Craft/Api/service"
+
+type Cache interface {
+	service.Service
+
+	Get(elm Element) bool
+	Set(elm Element) bool
+}

+ 55 - 0
cache/ttl_cache.go

@@ -0,0 +1,55 @@
+package cache
+
+import (
+	"github.com/hashicorp/golang-lru/v2/expirable"
+	"github.com/mailru/easyjson"
+	"time"
+)
+
+type ttlCache struct {
+	buf *expirable.LRU[string, []byte]
+}
+
+func New(size int, ttl time.Duration) Cache {
+	c := &ttlCache{}
+	c.buf = expirable.NewLRU[string, []byte](size, nil, ttl)
+	return c
+}
+
+func (c *ttlCache) Get(elm Element) bool {
+	buf, ok := c.buf.Get(elm.Key())
+	if !ok {
+		return false
+	}
+
+	if err := easyjson.Unmarshal(buf, elm); err != nil {
+		return false
+	}
+
+	return true
+}
+
+func (c *ttlCache) Set(elm Element) bool {
+	var k = elm.Key()
+
+	buf, err := easyjson.Marshal(elm)
+	if err != nil {
+		c.buf.Remove(k)
+		return false
+	}
+
+	c.buf.Add(k, buf)
+	return true
+}
+
+func (c *ttlCache) String() string {
+	return "ttl_lru_cache"
+}
+
+func (c *ttlCache) Close() error {
+	if c.buf != nil {
+		c.buf.Purge()
+	}
+
+	return nil
+}

+ 3 - 0
go.mod

@@ -8,8 +8,10 @@ require (
 	github.com/gofrs/uuid v4.4.0+incompatible
 	github.com/golang-jwt/jwt/v4 v4.5.0
 	github.com/google/uuid v1.3.0
+	github.com/hashicorp/golang-lru/v2 v2.0.5
 	github.com/labstack/echo-jwt/v4 v4.2.0
 	github.com/labstack/echo/v4 v4.11.1
+	github.com/mailru/easyjson v0.7.7
 	github.com/urfave/cli/v2 v2.25.7
 	gopkg.in/yaml.v3 v3.0.1
 )
@@ -23,6 +25,7 @@ require (
 	github.com/go-resty/resty/v2 v2.7.0 // indirect
 	github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
 	github.com/golang-jwt/jwt/v5 v5.0.0 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
 	github.com/klauspost/compress v1.16.7 // indirect
 	github.com/labstack/gommon v0.4.0 // indirect
 	github.com/mattn/go-colorable v0.1.13 // indirect

+ 6 - 0
go.sum

@@ -33,6 +33,10 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
 github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4=
+github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
@@ -49,6 +53,8 @@ github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUU
 github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ=
 github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8=
 github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
 github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
 github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=