Skip to content

Commit

Permalink
Implement simple query caching
Browse files Browse the repository at this point in the history
This may speed up queries on slower systems, or systems with bad IO.

Ref: #392

Signed-off-by: Jo Vandeginste <Jo.Vandeginste@kuleuven.be>
  • Loading branch information
jovandeginste committed Jan 12, 2025
1 parent 88a0c59 commit 06bb971
Show file tree
Hide file tree
Showing 16 changed files with 904 additions and 2 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ require (
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/glebarez/go-sqlite v1.22.0 // indirect
github.com/go-gorm/caches/v4 v4.0.5 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/spec v0.21.0 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec
github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc=
github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw=
github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ=
github.com/go-gorm/caches/v4 v4.0.5 h1:Sdj9vxbEM0sCmv5+s5o6GzoVMuraWF0bjJJvUU+7c1U=
github.com/go-gorm/caches/v4 v4.0.5/go.mod h1:Ms8LnWVoW4GkTofpDzFH8OfDGNTjLxQDyxBmRN67Ujw=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
Expand Down
4 changes: 4 additions & 0 deletions pkg/database/gorm.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ func Connect(driver, dsn string, debug bool, logger *slog.Logger) (*gorm.DB, err
return nil, err
}

if err := db.Use(NewMemoryCache()); err != nil {
return nil, err
}

if err := preMigrationActions(db); err != nil {
return nil, err
}
Expand Down
69 changes: 69 additions & 0 deletions pkg/database/gorm_cache.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package database

import (
"context"
"errors"
"fmt"
"sync"

"github.com/go-gorm/caches/v4"
)

var ErrInvalidDataInCache = errors.New("invalid cache data")

type memoryCacher struct {
store *sync.Map
}

func (c *memoryCacher) init() {
if c.store == nil {
c.store = &sync.Map{}
}
}

func (c *memoryCacher) Get(ctx context.Context, key string, q *caches.Query[any]) (*caches.Query[any], error) {
val, ok := c.store.Load(key)
if !ok {
// Not stored in cache
return nil, nil //nolint:nilnil
}

b, ok := val.([]byte)
if !ok {
return nil, ErrInvalidDataInCache // invalid data stored in cache
}

if err := q.Unmarshal(b); err != nil {
return nil, fmt.Errorf("%w: %s", ErrInvalidDataInCache, err) // invalid data stored in cache
}

return q, nil
}

func (c *memoryCacher) Store(ctx context.Context, key string, val *caches.Query[any]) error {
res, err := val.Marshal()
if err != nil {
return err
}

c.store.Store(key, res)

return nil
}

func (c *memoryCacher) Invalidate(ctx context.Context) error {
c.store = &sync.Map{}
return nil
}

func NewMemoryCache() *caches.Caches {
c := &memoryCacher{}
c.init()

cachesPlugin := &caches.Caches{Conf: &caches.Config{
Cacher: c,
Easer: true,
}}

return cachesPlugin
}
1 change: 1 addition & 0 deletions vendor/github.com/go-gorm/caches/v4/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions vendor/github.com/go-gorm/caches/v4/LICENSE

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 06bb971

Please sign in to comment.