{"id":13411777,"url":"https://github.com/bluele/gcache","last_synced_at":"2025-05-13T19:05:54.990Z","repository":{"id":26337712,"uuid":"29786463","full_name":"bluele/gcache","owner":"bluele","description":"An in-memory cache library for golang. It supports multiple eviction policies: LRU, LFU, ARC","archived":false,"fork":false,"pushed_at":"2024-03-01T12:49:21.000Z","size":125,"stargazers_count":2666,"open_issues_count":28,"forks_count":276,"subscribers_count":44,"default_branch":"master","last_synced_at":"2025-04-27T03:59:21.736Z","etag":null,"topics":["arc","cache","go","golang","in-memory","lfu","lru"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bluele.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-01-24T18:17:07.000Z","updated_at":"2025-04-25T04:37:58.000Z","dependencies_parsed_at":"2024-06-18T11:11:59.990Z","dependency_job_id":null,"html_url":"https://github.com/bluele/gcache","commit_stats":{"total_commits":59,"total_committers":10,"mean_commits":5.9,"dds":0.288135593220339,"last_synced_commit":"d8b7e051c564c174fea6ef60d180abf601099015"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bluele%2Fgcache","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bluele%2Fgcache/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bluele%2Fgcache/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bluele%2Fgcache/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bluele","download_url":"https://codeload.github.com/bluele/gcache/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251085198,"owners_count":21533842,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arc","cache","go","golang","in-memory","lfu","lru"],"created_at":"2024-07-30T20:01:16.819Z","updated_at":"2025-04-27T03:59:25.009Z","avatar_url":"https://github.com/bluele.png","language":"Go","funding_links":[],"categories":["开源类库","Database","Programming","Go","Open source library","Containers \u0026 Language Extentions \u0026 Linting","Repositories","数据库","Generators","数据库  `go语言实现的数据库`","Uncategorized","數據庫","\u003cspan id=\"数据库-database\"\u003e数据库 Database\u003c/span\u003e","Data Integration Frameworks"],"sub_categories":["缓存","Caches","Advanced Console UIs","Golang","Cache","For Go","标准 CLI","高级控制台界面","高級控制台界面","\u003cspan id=\"高级控制台用户界面-advanced-console-uis\"\u003e高级控制台用户界面 Advanced Console UIs\u003c/span\u003e"],"readme":"# GCache\n\n![Test](https://github.com/bluele/gcache/workflows/Test/badge.svg)\n[![GoDoc](https://godoc.org/github.com/bluele/gcache?status.svg)](https://pkg.go.dev/github.com/bluele/gcache?tab=doc)\n\nCache library for golang. It supports expirable Cache, LFU, LRU and ARC.\n\n## Features\n\n* Supports expirable Cache, LFU, LRU and ARC.\n\n* Goroutine safe.\n\n* Supports event handlers which evict, purge, and add entry. (Optional)\n\n* Automatically load cache if it doesn't exists. (Optional)\n\n## Install\n\n```\n$ go get github.com/bluele/gcache\n```\n\n## Example\n\n### Manually set a key-value pair.\n\n```go\npackage main\n\nimport (\n  \"github.com/bluele/gcache\"\n  \"fmt\"\n)\n\nfunc main() {\n  gc := gcache.New(20).\n    LRU().\n    Build()\n  gc.Set(\"key\", \"ok\")\n  value, err := gc.Get(\"key\")\n  if err != nil {\n    panic(err)\n  }\n  fmt.Println(\"Get:\", value)\n}\n```\n\n```\nGet: ok\n```\n\n### Manually set a key-value pair, with an expiration time.\n\n```go\npackage main\n\nimport (\n  \"github.com/bluele/gcache\"\n  \"fmt\"\n  \"time\"\n)\n\nfunc main() {\n  gc := gcache.New(20).\n    LRU().\n    Build()\n  gc.SetWithExpire(\"key\", \"ok\", time.Second*10)\n  value, _ := gc.Get(\"key\")\n  fmt.Println(\"Get:\", value)\n\n  // Wait for value to expire\n  time.Sleep(time.Second*10)\n\n  value, err := gc.Get(\"key\")\n  if err != nil {\n    panic(err)\n  }\n  fmt.Println(\"Get:\", value)\n}\n```\n\n```\nGet: ok\n// 10 seconds later, new attempt:\npanic: ErrKeyNotFound\n```\n\n\n### Automatically load value\n\n```go\npackage main\n\nimport (\n  \"github.com/bluele/gcache\"\n  \"fmt\"\n)\n\nfunc main() {\n  gc := gcache.New(20).\n    LRU().\n    LoaderFunc(func(key interface{}) (interface{}, error) {\n      return \"ok\", nil\n    }).\n    Build()\n  value, err := gc.Get(\"key\")\n  if err != nil {\n    panic(err)\n  }\n  fmt.Println(\"Get:\", value)\n}\n```\n\n```\nGet: ok\n```\n\n### Automatically load value with expiration\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"time\"\n\n  \"github.com/bluele/gcache\"\n)\n\nfunc main() {\n  var evictCounter, loaderCounter, purgeCounter int\n  gc := gcache.New(20).\n    LRU().\n    LoaderExpireFunc(func(key interface{}) (interface{}, *time.Duration, error) {\n      loaderCounter++\n      expire := 1 * time.Second\n      return \"ok\", \u0026expire, nil\n    }).\n    EvictedFunc(func(key, value interface{}) {\n      evictCounter++\n      fmt.Println(\"evicted key:\", key)\n    }).\n    PurgeVisitorFunc(func(key, value interface{}) {\n      purgeCounter++\n      fmt.Println(\"purged key:\", key)\n    }).\n    Build()\n  value, err := gc.Get(\"key\")\n  if err != nil {\n    panic(err)\n  }\n  fmt.Println(\"Get:\", value)\n  time.Sleep(1 * time.Second)\n  value, err = gc.Get(\"key\")\n  if err != nil {\n    panic(err)\n  }\n  fmt.Println(\"Get:\", value)\n  gc.Purge()\n  if loaderCounter != evictCounter+purgeCounter {\n    panic(\"bad\")\n  }\n}\n```\n\n```\nGet: ok\nevicted key: key\nGet: ok\npurged key: key\n```\n\n\n## Cache Algorithm\n\n  * Least-Frequently Used (LFU)\n\n  Discards the least frequently used items first.\n\n  ```go\n  func main() {\n    // size: 10\n    gc := gcache.New(10).\n      LFU().\n      Build()\n    gc.Set(\"key\", \"value\")\n  }\n  ```\n\n  * Least Recently Used (LRU)\n\n  Discards the least recently used items first.\n\n  ```go\n  func main() {\n    // size: 10\n    gc := gcache.New(10).\n      LRU().\n      Build()\n    gc.Set(\"key\", \"value\")\n  }\n  ```\n\n  * Adaptive Replacement Cache (ARC)\n\n  Constantly balances between LRU and LFU, to improve the combined result.\n\n  detail: http://en.wikipedia.org/wiki/Adaptive_replacement_cache\n\n  ```go\n  func main() {\n    // size: 10\n    gc := gcache.New(10).\n      ARC().\n      Build()\n    gc.Set(\"key\", \"value\")\n  }\n  ```\n\n  * SimpleCache (Default)\n\n  SimpleCache has no clear priority for evict cache. It depends on key-value map order.\n\n  ```go\n  func main() {\n    // size: 10\n    gc := gcache.New(10).Build()\n    gc.Set(\"key\", \"value\")\n    v, err := gc.Get(\"key\")\n    if err != nil {\n      panic(err)\n    }\n  }\n  ```\n\n## Loading Cache\n\nIf specified `LoaderFunc`, values are automatically loaded by the cache, and are stored in the cache until either evicted or manually invalidated.\n\n```go\nfunc main() {\n  gc := gcache.New(10).\n    LRU().\n    LoaderFunc(func(key interface{}) (interface{}, error) {\n      return \"value\", nil\n    }).\n    Build()\n  v, _ := gc.Get(\"key\")\n  // output: \"value\"\n  fmt.Println(v)\n}\n```\n\nGCache coordinates cache fills such that only one load in one process of an entire replicated set of processes populates the cache, then multiplexes the loaded value to all callers.\n\n## Expirable cache\n\n```go\nfunc main() {\n  // LRU cache, size: 10, expiration: after a hour\n  gc := gcache.New(10).\n    LRU().\n    Expiration(time.Hour).\n    Build()\n}\n```\n\n## Event handlers\n\n### Evicted handler\n\nEvent handler for evict the entry.\n\n```go\nfunc main() {\n  gc := gcache.New(2).\n    EvictedFunc(func(key, value interface{}) {\n      fmt.Println(\"evicted key:\", key)\n    }).\n    Build()\n  for i := 0; i \u003c 3; i++ {\n    gc.Set(i, i*i)\n  }\n}\n```\n\n```\nevicted key: 0\n```\n\n### Added handler\n\nEvent handler for add the entry.\n\n```go\nfunc main() {\n  gc := gcache.New(2).\n    AddedFunc(func(key, value interface{}) {\n      fmt.Println(\"added key:\", key)\n    }).\n    Build()\n  for i := 0; i \u003c 3; i++ {\n    gc.Set(i, i*i)\n  }\n}\n```\n\n```\nadded key: 0\nadded key: 1\nadded key: 2\n```\n\n# Author\n\n**Jun Kimura**\n\n* \u003chttp://github.com/bluele\u003e\n* \u003cjunkxdev@gmail.com\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbluele%2Fgcache","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbluele%2Fgcache","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbluele%2Fgcache/lists"}