{"id":36473713,"url":"https://github.com/georghagn/nexcache","last_synced_at":"2026-01-15T02:36:07.376Z","repository":{"id":331992125,"uuid":"1131068738","full_name":"georghagn/nexcache","owner":"georghagn","description":"A lightweight, thread-safe LRU cache for Go with TTL support, background cleanup, and JSON persistence. Designed for simplicity and performance.","archived":false,"fork":false,"pushed_at":"2026-01-09T13:26:02.000Z","size":12018,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-12T02:44:12.168Z","etag":null,"topics":["cache","go","golang","gsf","in-memory-cache","lru-cache","persistence","simple-framework","thread-safe","ttl"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/georghagn.png","metadata":{"files":{"readme":"README.de.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.de.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.de.md","support":null,"governance":null,"roadmap":"roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-09T12:30:48.000Z","updated_at":"2026-01-09T13:26:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/georghagn/nexcache","commit_stats":null,"previous_names":["georghagn/nexcache"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/georghagn/nexcache","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georghagn%2Fnexcache","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georghagn%2Fnexcache/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georghagn%2Fnexcache/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georghagn%2Fnexcache/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/georghagn","download_url":"https://codeload.github.com/georghagn/nexcache/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georghagn%2Fnexcache/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28441331,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T00:55:22.719Z","status":"online","status_checked_at":"2026-01-15T02:00:08.019Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["cache","go","golang","gsf","in-memory-cache","lru-cache","persistence","simple-framework","thread-safe","ttl"],"created_at":"2026-01-12T00:44:35.951Z","updated_at":"2026-01-15T02:36:07.370Z","avatar_url":"https://github.com/georghagn.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n|\u003csub\u003e🇬🇧 [English translation →](README.md)\u003c/sub\u003e|\n|----:|\n|    |\n\n||[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](./LICENSE) [![Dependencies](https://img.shields.io/badge/dependencies-zero-brightgreen.svg)](#)|\n|----|----|\n|![GSF-Suite-Logo](logo-gsf.png)| ***GSF-nexCache***\u003cbr\u003eDin leichtgewichtiger, thread-sicherer **Least Recently Used (LRU)** Cache für Go. Teil der **Go Small Frameworks Suite**|\n\n\u003csup\u003e***GSF*** steht für ***Go Small Frameworks*** — eine Sammlung von minimalistischen Tools für robuste Anwendungen.\u003c/sup\u003e\n\n---\n\n# LRU Cache\n\nEin leichtgewichtiger, thread-sicherer **Least Recently Used (LRU)** Cache für Go mit Time-To-Live (TTL) Unterstützung, automatischer Bereinigung und optionaler Persistenz.\n\n## Features\n\n* **LRU-Strategie:** Verdrängt automatisch die am längsten nicht verwendeten Elemente.\n* **TTL (Time-To-Live):** Elemente laufen nach einer definierten Zeitspanne ab.\n* **Thread-Safe:** Sicherer Zugriff aus mehreren Goroutinen durch `sync.Mutex`.\n* **Loader-Pattern:** Bequemes Laden von Daten via `GetOrLoad` (Lazy Loading).\n* **Persistenz:** Einfaches Speichern und Laden des Cache-Zustands als JSON.\n* **Hintergrund-Cleanup:** Automatisches Entfernen abgelaufener Einträge.\n\n## Installation\n\n```bash\ngo get github.com/georghagn/nexcache/lrucache\n\n```\n\n## Schnelleinstieg\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\t\"github.com/georghagn/nexcache/lrucache\"\n)\n\nfunc main() {\n\t// Cache erstellen: Kapazität 100, TTL 10 Min, Cleanup alle 1 Min\n\tcache := lrucache.New(100, 10*time.Minute, 1*time.Minute)\n\tdefer cache.StopCleanup()\n\n\t// Wert setzen\n\tcache.Set(\"user_1\", \"Georg\")\n\n\t// Wert abrufen\n\tif val, found := cache.Get(\"user_1\"); found {\n\t\tfmt.Println(\"Gefunden:\", val)\n\t}\n}\n\n```\n\n## Fortgeschrittene Funktionen\n\n### GetOrLoad (Lazy Loading)\n\nVermeidet Cache-Miss-Logik im restlichen Code. Wenn der Key fehlt oder abgelaufen ist, wird der Loader ausgeführt.\n\n```go\nval, err := cache.GetOrLoad(\"db_query\", func() (interface{}, error) {\n    // Hier Logik zum Laden aus der DB\n    return \"Ergebnis von DB\", nil\n})\n\n```\n\n### Persistenz\n\nSpeichere den aktuellen Zustand des Caches in einer Datei, um ihn nach einem Neustart wiederherzustellen.\n\n```go\n// Speichern\nerr := cache.SaveToFile(\"cache_dump.json\")\n\n// Laden\nerr := cache.LoadFromFile(\"cache_dump.json\")\n\n```\n\n## API Referenz\n\n| Methode | Beschreibung |\n| --- | --- |\n| `New(cap, ttl, interval)` | Erstellt einen neuen Cache mit Kapazität, TTL und Cleanup-Intervall. |\n| `Get(key)` | Liefert den Wert. Aktualisiert die LRU-Position. |\n| `Set(key, value)` | Speichert einen Wert und setzt die TTL zurück. |\n| `GetOrLoad(key, loader)` | Holt den Wert oder lädt ihn bei Fehlen über die Funktion `loader`. |\n| `SaveToFile(path)` | Exportiert den Cache-Inhalt als JSON. |\n| `LoadFromFile(path)` | Importiert Cache-Inhalte (nur nicht-abgelaufene). |\n| `StopCleanup()` | Beendet die Hintergrund-Goroutine für den Cleanup. |\n\n\n---\n\n\n## Beispiele\n\nIm Ordner `examples/` findest du vier verschiedene Implementierungen, die die Vielseitigkeit des Caches zeigen:\n\n1. **Basic Usage:** Standard `Get` und `Set` Operationen.\n2. **Lazy Loading:** Komplexere Datenabfragen mit `GetOrLoad`.\n3. **Persistence:** Strategien zum Speichern und Laden des Cache-States.\n4. **TTL \u0026 Cleanup:** Demonstration der automatischen Speicherbereinigung.\n\nUm ein Beispiel zu starten, wechsle einfach in das Verzeichnis und führe es aus:\n\n```bash\ngo run examples/persistence/example_withPersistence.go\n\n```\n\n---\n\n## Funktionsweise (LRU \u0026 TTL)\n\nDer Cache kombiniert eine **Hash-Map** für schnellen Zugriff () mit einer **doppelten verketteten Liste**, um die Nutzungsreihenfolge zu tracken.\n\n* **Lese-Zugriff:** Ein Element wird an die Spitze der Liste verschoben.\n* **Schreib-Zugriff:** Neue Elemente kommen nach vorne; bei Überschreiten der Kapazität wird das letzte Element (Oldest) entfernt.\n* **Ablauf:** Die Hintergrund-Routine prüft im definierten Intervall vom Ende der Liste her auf abgelaufene Zeitstempel, um den Speicher effizient freizugeben.\n\n---\n\n## Best Practices\n### Cleanup-Intervall wählen\n\nDas cleanupInterval bestimmt, wie oft eine Hintergrund-Goroutine den Speicher scannt.\n    Aggressiv (z.B. 10s): Gut für sehr kleine Caches mit extrem flüchtigen Daten. Erhöht die CPU-Last minimal.\n    Ausgewogen (z.B. 1m - 5m): Der Standard für die meisten Anwendungen.\n    Passiv (z.B. 1h): Reicht aus, wenn der Cache sehr groß ist und abgelaufene Daten meistens sowieso durch die LRU-Logik (Verdrängung bei Kapazitätsgrenze) entfernt werden.\n\n### Interface-Konvertierung\n\nDa der Cache interface{} speichert, solltest du beim Abrufen den Type-Assertion-Check nutzen:\n```Go\n\nif val, found := cache.Get(\"key\"); found {\n    data := val.(MeinTyp) // oder sicher: data, ok := val.(MeinTyp)\n}\n\n```\n\n---\n\n### Organisation \u0026 Standards\n\n* **Copyright:** © 2026 Georg Hagn.\n* **Namespace:** `github.com/georghagn/nexcache/lrucache`\n* **Lizenz:** Apache License, Version 2.0.\n\nGSF-nexCache ist ein unabhängiges open-source project und ist mit keinem Unternehmen ähnlichen Namens verbunden.\n\n---\n\n## Mitwirken \u0026 Sicherheit\n\nBeiträge sind willkommen! Bitte nutzen Sie GitHub Issues für Fehlerberichte oder Feature-Ideen.\n**Sicherheitsrelevante Themen** sollten nicht öffentlich diskutiert werden; bitte beachten Sie hierzu die `SECURITY.de.md`.\n\n---\n\n## Kontakt\n\nBei Fragen oder Interesse an diesem Projekt erreichen Sie mich unter:\n📧 *georghagn [at] tiny-frameworks.io*\n\n\u003csup\u003e*(Bitte keine Anfragen an die privaten GitHub-Account-Adressen)*\u003c/sup\u003e\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeorghagn%2Fnexcache","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgeorghagn%2Fnexcache","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeorghagn%2Fnexcache/lists"}