diff options
author | 2024-01-26 12:14:10 +0000 | |
---|---|---|
committer | 2024-01-26 12:14:10 +0000 | |
commit | 07207e71e932b0d4a38253e069be6090872c4e3f (patch) | |
tree | bee71828fe2e6d3086bcd36e175301388fc95972 /vendor/codeberg.org/gruf/go-structr/README.md | |
parent | [docs] Fix log-timestamp-format (#2572) (diff) | |
download | gotosocial-07207e71e932b0d4a38253e069be6090872c4e3f.tar.xz |
[performance] cache library performance enhancements (updates go-structr => v0.2.0) (#2575)
* update go-structr => v0.2.0
* update readme
* whoops, fix the link
Diffstat (limited to 'vendor/codeberg.org/gruf/go-structr/README.md')
-rw-r--r-- | vendor/codeberg.org/gruf/go-structr/README.md | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/vendor/codeberg.org/gruf/go-structr/README.md b/vendor/codeberg.org/gruf/go-structr/README.md index e2a9bdc15..125b20090 100644 --- a/vendor/codeberg.org/gruf/go-structr/README.md +++ b/vendor/codeberg.org/gruf/go-structr/README.md @@ -2,4 +2,74 @@ A performant struct caching library with automated indexing by arbitrary combinations of fields, including support for negative results (errors!). An example use case is in database lookups. +Some example code of how you can use `go-structr` in your application: +```golang +type Cached struct { + Username string + Domain string + URL string + CountryCode int +} + +var c structr.Cache[*Cached] + +c.Init(structr.Config[*Cached]{ + + // Fields this cached struct type + // will be indexed and stored under. + Indices: []structr.IndexConfig{ + {Fields: "Username,Domain", AllowZero: true}, + {Fields: "URL"}, + {Fields: "CountryCode", Multiple: true}, + }, + + // Maximum LRU cache size before + // new entries cause evictions. + MaxSize: 1000, + + // User provided value copy function to + // reduce need for reflection + ensure + // concurrency safety for returned values. + CopyValue: func(c *Cached) *Cached { + c2 := new(Cached) + *c2 = *c + return c2 + }, + + // User defined invalidation hook. + Invalidate: func(c *Cached) { + log.Println("invalidated:", c) + }, +}) + +var url string + +// Load value from cache, with callback function to hydrate +// cache if value cannot be found under index name with key. +// Negative (error) results are also cached, with user definable +// errors to ignore from caching (e.g. context deadline errs). +value, err := c.LoadOne("URL", func() (*Cached, error) { + return dbType.SelectByURL(url) +}, url) +if err != nil { + return nil, err +} + +// Store value in cache, only if provided callback +// function returns without error. Passes value through +// invalidation hook regardless of error return value. +// +// On success value will be automatically added to and +// accessible under all initially configured indices. +if err := c.Store(value, func() error { + return dbType.Insert(value) +}); err != nil { + return nil, err +} + +// Invalidate all cached results stored under +// provided index name with give field value(s). +c.Invalidate("CountryCode", 42) +``` + This is a core underpinning of [GoToSocial](https://github.com/superseriousbusiness/gotosocial)'s performance.
\ No newline at end of file |