{"id":24246,"date":"2022-12-01T00:00:00","date_gmt":"2022-12-01T00:00:00","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/golangs-superior-cache-solution-memcached-redis-2\/"},"modified":"2026-09-16T11:46:09","modified_gmt":"2026-09-16T11:46:09","slug":"golangs-superior-cache-solution-memcached-redis","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/","title":{"rendered":"GroupCache: Der \u00fcberlegene Golang-Cache"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Der Golang-Cache macht verteiltes Caching und die Synchronisierung einfach und l\u00e4sst sich mit GroupCache leicht bereitstellen. Aber warum ist dies das \u00fcberlegene Tool? Und welche Probleme l\u00f6st es? Bei Mailgun haben wir GroupCache eingesetzt, um die Latenz in unserem Rate-Limiting-Service zu reduzieren. Wir haben von der Synchronisierung profitiert und gleichzeitig Deadlock-Probleme bei der Erstellung und Verwaltung eindeutiger Ressourcen vermieden. Wenn Sie noch nicht \u00fcberzeugt sind, ist das in Ordnung. Wir sind sicher, dass Sie es am Ende dieses Artikels sein werden.<\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-9360\"><p class=\"h5 m-0\" id=\"toc-title-9360\">Inhaltsverzeichnis<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#was-ist-ein-verteilter-cache\">Was ist ein verteilter Cache?<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#wie-funktioniert-verteiltes-caching\">Wie funktioniert verteiltes Caching?<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#das-thundering-herd-problem-loesen-cache-stampedes-und-hohe-nebenlaeufigkeit\">Das Thundering-Herd-Problem l\u00f6sen: Cache Stampedes und hohe Nebenl\u00e4ufigkeit<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#was-ist-groupcache-und-wie-schneidet-es-im-vergleich-zu-anderen-caching-loesungen-ab\">Was ist GroupCache und wie schneidet es im Vergleich zu anderen Caching-L\u00f6sungen ab?<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">05<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#groupcache-als-synchronisierungstool\">GroupCache als Synchronisierungstool<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">06<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#verwendung-von-groupcache\">Verwendung von GroupCache<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">07<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#so-implementieren-sie-es-mit-http-2-und-tls\">So implementieren Sie es mit HTTP\/2 und TLS<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">08<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#mailguns-update-zur-schluesselentfernung\">Mailguns Update zur Schl\u00fcsselentfernung<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">09<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#leistungsverbesserungen-von-mailgun-durch-die-verwendung-von-groupcache\">Leistungsverbesserungen von Mailgun durch die Verwendung von GroupCache<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">10<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#fazit-verteiltes-caching-leicht-gemacht\">Fazit: Verteiltes Caching leicht gemacht<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Was ist ein verteilter Cache?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Cache ist eine Hochgeschwindigkeits-Speicherl\u00f6sung, die stark nachgefragte Daten vorh\u00e4lt, um den Datenzugriff und -abruf zu beschleunigen. <b>Ein verteilter Cache unterteilt den Cache in Segmente und verteilt diese<\/b>, sodass jeder Knoten in einem Server-Cluster nur ein Segment des gesamten Caches enth\u00e4lt. Auf diese Weise l\u00e4sst sich der Cache weiter skalieren, indem dem Cluster einfach neue Knoten hinzugef\u00fcgt werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dies ist aus mehreren Gr\u00fcnden wichtig.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><b>Verteilte Caches erm\u00f6glichen es dem Cache, mit den Daten zu wachsen.<\/b> Sie sind in Umgebungen mit hohem Datenvolumen und gro\u00dfer Auslastung von Vorteil.<\/li>\n\n\n\n<li><b>Ein verteilter Cache kann sich \u00fcber mehrere Server erstrecken<\/b>, was ihm eine weitaus h\u00f6here Transaktionskapazit\u00e4t verleiht.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Wie funktioniert verteiltes Caching?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Verteilte Caching-Systeme wie Redis und Memcached-Clients funktionieren in der Regel so:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die <b>App<\/b> fragt die zwischengespeicherten Daten \u00fcber einen Schl\u00fcssel beim <b>Client<\/b> an.<\/li>\n\n\n\n<li>Anschlie\u00dfend f\u00fchrt der <b>Client<\/b> einen Consistent Hash auf den Schl\u00fcssel aus, um festzustellen, welcher <b>Knoten<\/b> \u00fcber die Daten verf\u00fcgt.<\/li>\n\n\n\n<li>Sobald der <b>Client<\/b> die Daten lokalisiert hat, sendet er eine Netzwerkanfrage an den <b>Knoten<\/b>.<\/li>\n\n\n\n<li>Der <b>Knoten<\/b> gibt die Daten zur\u00fcck, falls diese gefunden werden.<\/li>\n\n\n\n<li>Die <b>App<\/b> pr\u00fcft, ob Daten zur\u00fcckgegeben werden. Andernfalls rendert oder ruft sie die Daten aus der Datenbank ab. <\/li>\n\n\n\n<li>Die <b>App<\/b> weist den <b>Client<\/b> an, Daten f\u00fcr diesen Schl\u00fcssel zu speichern.<\/li>\n\n\n\n<li>Der <b>Client<\/b> f\u00fchrt einen Consistent Hash auf den Schl\u00fcssel aus, um festzustellen, welcher <b>Knoten<\/b> die Daten besitzen soll.<\/li>\n\n\n\n<li>Abschlie\u00dfend speichert der <b>Client<\/b> die Daten auf dem <b>Knoten<\/b>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn man sich diesen Ablauf ansieht, fallen zwei wesentliche Auswirkungen auf: <\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Jede Cache-Anfrage f\u00fchrt zu einem Roundtrip zu einem <b>Knoten<\/b>, unabh\u00e4ngig davon, ob es sich um einen Cache-Hit oder -Miss handelt.<\/li>\n\n\n\n<li>Sie k\u00f6nnen den Roundtrip zu einem <b>Knoten<\/b> nicht vermeiden, indem Sie den Wert lokal zwischenspeichern, da der entfernte <b>Knoten<\/b> die Daten jederzeit ohne Wissen der <b>App<\/b> invalidieren k\u00f6nnte.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Obwohl keine dieser Auswirkungen f\u00fcr die meisten Anwendungen besonders problematisch ist, k\u00f6nnen die zus\u00e4tzlichen Roundtrips zur Datenbank Anwendungen mit hoher Leistung und geringer Latenz beeintr\u00e4chtigen. Es gibt jedoch noch eine weitere Auswirkung, die m\u00f6glicherweise nicht sofort ersichtlich ist: das Thundering-Herd-Problem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Das Thundering-Herd-Problem l\u00f6sen: Cache Stampedes und hohe Nebenl\u00e4ufigkeit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Das Thundering-Herd-Problem ist ein Ansturm von Anfragen, der das System \u00fcberlastet.<\/b> Dieses Problem, das manchmal auch als Cache Stampede, Dogpiling oder Slashdot-Effekt bezeichnet wird, tritt auf, wenn mehrere Instanzen einer Anwendung gleichzeitig versuchen, auf Daten zuzugreifen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Kontext ist unsere Thundering Herd eine Reaktion auf einen Cache-Miss, was bedeutet, dass die Daten entweder entfernt oder nie in den Cache gelegt wurden. Beispielsweise bleibt <b>eine Anwendung im Normalbetrieb auch unter starker Auslastung responsiv, solange die Daten zwischengespeichert bleiben<\/b>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn der Cache nicht \u00fcber die Daten verf\u00fcgt, k\u00f6nnte diese Thundering Herd durch gleichzeitige Prozesse das System \u00fcberlasten, was zu Staus und einem potenziellen Zusammenbruch des Systems f\u00fchrt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um diese gleichzeitigen Prozesse zu bew\u00e4ltigen, ben\u00f6tigen Sie ein System zur Synchronisierung des Abrufs oder Renderings der Daten. Gl\u00fccklicherweise <b>gibt es eine Golang-Bibliothek namens <\/b><a href=\"https:\/\/github.com\/mailgun\/groupcache\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>GroupCache<\/b><\/a><b>, die verwendet werden kann, um das Thundering-Herd-Problem zu l\u00f6sen<\/b> und die erw\u00e4hnten Auswirkungen des Remote-Caches zu verbessern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was ist GroupCache und wie schneidet es im Vergleich zu anderen Caching-L\u00f6sungen ab?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Es gibt viele Caching-L\u00f6sungen auf dem Markt. GroupCache von Golang ist eine Open-Source-L\u00f6sung, die sich von beliebten Tools wie BigCache, Redis und Memcache unterscheidet, da sie sich <b>als In-Code Distributed Cache (ICDC) direkt in Ihren Code integriert<\/b>. Dies bedeutet, dass jede Instanz der <b>App<\/b> ein <b>Knoten<\/b> im verteilten Cache <i>ist<\/i>. Der Vorteil? Als vollwertiges Mitglied des verteilten Caches kennt jede Anwendungsinstanz die Datenstrukturen\u00a0\u2013 nicht nur, wie Daten f\u00fcr den Knoten gespeichert werden, sondern auch, wie die Daten abgerufen oder gerendert werden, falls sie fehlen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um zu verstehen, warum dies Redis oder Memcached \u00fcberlegen ist, gehen wir den Ablauf des verteilten Cachings bei der Verwendung von GroupCache durch. Behalten Sie beim Lesen des Ablaufs im Hinterkopf, dass <b>GroupCache eine Bibliothek ist, die von der Anwendung verwendet wird und auch auf eingehende Anfragen von anderen Instanzen der Anwendung lauscht<\/b>, die GroupCache verwenden.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Die <b>App<\/b> fragt die Daten \u00fcber einen Schl\u00fcssel beim <b>GroupCache<\/b> an.<\/li>\n\n\n\n<li>Als N\u00e4chstes pr\u00fcft der <b>GroupCache<\/b> den In-Memory-Hot-Cache auf die Daten. Wenn keine Daten vorhanden sind, wird fortgefahren.<\/li>\n\n\n\n<li>Der <b>GroupCache<\/b> f\u00fchrt einen Consistent Hash auf den Schl\u00fcssel aus, um festzustellen, welche <b>GroupCache<\/b>-Instanz \u00fcber die Daten verf\u00fcgt.<\/li>\n\n\n\n<li>Dann sendet der <b>GroupCache<\/b> eine Netzwerkanfrage an die <b>GroupCache-Instanz<\/b>, die die Daten hat.<\/li>\n\n\n\n<li>Der <b>GroupCache<\/b> gibt die Daten zur\u00fcck, wenn sie im Arbeitsspeicher vorhanden sind. Andernfalls bittet er die <b>App<\/b>, die Daten zu rendern oder abzurufen.<\/li>\n\n\n\n<li>Abschlie\u00dfend gibt der <b>GroupCache<\/b> die Daten an die <b>GroupCache-Instanz<\/b> zur\u00fcck, die die Anfrage initiiert hat. <\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Schritt 5<\/b> ist im Kontext eines Thundering-Herd-Ereignisses von Bedeutung, da <b>nur eine der GroupCache-Instanzen<\/b> das Rendering oder den Abruf der angeforderten Daten durchf\u00fchrt. Alle anderen Instanzen der Anwendung, die die Daten ebenfalls bei der GroupCache-Instanz anfragen, werden blockiert, bis die besitzende Instanz der Anwendung die Daten erfolgreich rendert oder abruft. <b>Dies schafft einen nat\u00fcrlichen Synchronisationspunkt f\u00fcr den Datenzugriff im verteilten<\/b> System und verhindert das Thundering-Herd-Problem. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Schritt 2<\/b> ist ebenfalls von Bedeutung, da die M\u00f6glichkeit, die Daten lokal im Arbeitsspeicher zwischenzuspeichern, die Kosten eines Netzwerk-Roundtrips vermeidet. Dies bietet einen enormen Leistungsvorteil und reduziert die Netzwerkbelastung. Da <b>GroupCache<\/b> ein Teil der Anwendung ist, vermeiden wir die M\u00f6glichkeit, dass der <b>GroupCache<\/b> die Daten ohne Wissen der Anwendung l\u00f6scht, da ein solches L\u00f6schereignis von allen Instanzen der Anwendung geteilt wird, die <b>GroupCache<\/b> verwenden. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein zugegebenerma\u00dfen kleinerer Vorteil\u00a0\u2013 aber einer, den diejenigen von uns, die Einfachheit sch\u00e4tzen, begr\u00fc\u00dfen werden\u00a0\u2013 betrifft die Bereitstellung. Obwohl es nicht allzu schwierig ist, Redis und Memcached als separate Entit\u00e4ten von der Anwendung bereitzustellen und abzusichern, bedeutet eine einzige bereitzustellende Anwendung f\u00fcr Betreiber eine Aufgabe weniger, die sie verwalten, aktuell halten und absichern m\u00fcssen. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es lohnt sich, dies noch einmal zu erw\u00e4hnen, da man es leicht \u00fcbersieht. Die F\u00e4higkeit der Cache-Implementierung, die Daten bei einem Cache-Miss aus einer Datenbank zu rendern oder abzurufen, sowie die M\u00f6glichkeit, sich auf einen lokalen In-Memory-Hot-Cache zu verlassen, machen GroupCache zu einer \u00fcberlegenen Wahl unter den verteilten Caches. Kein verteilter Cache au\u00dferhalb Ihrer Anwendung kann diese Vorteile bieten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">GroupCache als Synchronisierungstool<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Da GroupCache gro\u00dfartige Synchronisierungssemantiken bietet, haben wir festgestellt, dass GroupCache bei der Erstellung und Verwaltung eindeutiger Ressourcen <b>eine \u00fcberlegene Alternative zu Sperren auf Verteilungs- oder Datenbankebene<\/b> ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als Beispiel liest unsere interne Analysen-Engine Tausende von Ereignissen und f\u00fcgt dynamisch Tags mit zugewiesenen Statistiken hinzu. Da bei uns viele Instanzen der Engine ausgef\u00fchrt werden, muss jedes neue erkannte Tag als potenziell neues Tag behandelt werden. Normalerweise w\u00fcrde dies einen konstanten Strom von Upsert-Anfragen an unsere Datenbank erzeugen. Durch die Verwendung von GroupCache kann jede Instanz den Cache mit dem Schl\u00fcssel <code>account:tag<\/code> abfragen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn das Tag bereits existiert, wird es mit den neuesten Daten zum Tag zur\u00fcckgegeben. Wenn das Tag jedoch nicht existiert, leitet GroupCache die Anfrage an die besitzende Instanz weiter und erstellt das Tag. Auf diese Weise wird nur ein einziges Upsert an die Datenbank gesendet, wenn das System auf ein neues Tag st\u00f6\u00dft.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Auf \u00e4hnliche Weise verwenden wir GroupCache zum Z\u00e4hlen eindeutiger Z\u00e4hler, bei denen das System nur eine einzige Instanz eines Z\u00e4hlers erfassen soll. Da wir <b>Groupcache verwenden, vermeiden wir die Nutzung einer verteilten Sperre und Deadlock-Probleme vollst\u00e4ndig<\/b>. Dies ist besonders n\u00fctzlich, wenn eine NoSQL-Datenbank verwendet wird, die \u00fcber wenig bis gar keine eigenen Sperr- oder Synchronisierungssemantiken verf\u00fcgt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Verwendung von GroupCache<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mailgun nutzt eine modifizierte Version von <i>Brad Fitzpatricks (<\/i><a href=\"https:\/\/github.com\/patrickmn\/go-cache\" target=\"_tabs\" rel=\"noopener noreferrer\"><i>patrickmn<\/i><\/a><i>)<\/i> originaler <a href=\"https:\/\/github.com\/mailgun\/groupcache\" target=\"_tabs\" rel=\"noopener noreferrer\">GroupCache-Bibliothek auf github.com<\/a>.<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> API-Dokumentationen und Beispiele finden Sie unter <a href='http:\/\/godoc.org\/github.com\/mailgun\/groupcache'>http:\/\/godoc.org\/github.com\/mailgun\/groupcache<\/a><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Nennenswerte \u00c4nderungen an der Bibliothek sind:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Support f\u00fcr die explizite Entfernung von Schl\u00fcsseln aus einer Gruppe. <code>Remove()<\/code><\/li>\n\n\n\n<li>Support f\u00fcr abgelaufene Werte. <code>SetBytes()<\/code>, <code>SetProto()<\/code> und <code>SetString()<\/code> akzeptieren jetzt eine optionale <code>time.Time{}<\/code>, die einen Zeitpunkt in der Zukunft darstellt, an dem der Wert abl\u00e4uft.<\/li>\n\n\n\n<li>Support f\u00fcr den Golang-Standard <code>context.Context<\/code><\/li>\n\n\n\n<li>F\u00fcllt immer den Hot-Cache auf.<\/li>\n\n\n\n<li>Um GroupCache zu verwenden, erstellen Sie einen Pool von Instanzen, mit denen jede GroupCache-Instanz kommuniziert. Anschlie\u00dfend erstellen Sie mehrere unabh\u00e4ngige Cache-Gruppen, die denselben Pool von Instanzen verwenden.<\/li>\n\n\n\n<li>Behalten Sie die Peers in unserem Cluster im Auge und f\u00fcgen Sie unsere Instanz zum Pool hinzu `<code>http:\/\/localhost:8080` pool := groupcache.NewHTTPPoolOpts(\"http:\/\/localhost:8080\", &amp;groupcache.HTTPPoolOptions{}<\/code>)<\/li>\n\n\n\n<li>F\u00fcgen Sie weitere Peers hinzu <code>pool.Set(\"http:\/\/peer1:8080\", \"http:\/\/peer2:8080\")<\/code><\/li>\n\n\n\n<li>Erstellen Sie einen neuen Gruppen-Cache mit einer maximalen Cache-Gr\u00f6\u00dfe von 3 MB group: = <code>groupcache.NewGroup(\"users\", 3000000, groupcache.GetterFunc( func(ctx context.Context, id string, dest groupcache.Sink) error { \/\/ Gibt ein Protobuf-Struct `User` zur\u00fcck if user, err := fetchUserFromMongo(ctx, id); err != nil { return err }<\/code><\/li>\n\n\n\n<li>Legen Sie fest, dass der Nutzer im Groupcache nach 5 Minuten abl\u00e4uft <code>if err := dest.SetProto(&amp;user, time.Now().Add(time.Minute*5)); err != nil { return err } return nil }, ))<\/code> <\/li>\n\n\n\n<li>var user User<\/li>\n\n\n\n<li>Rufen Sie die Definition aus dem Gruppen-Cache ctx ab, <code>cancel := context.WithTimeout(context.Background(), time.Second*10) if err := group.Get(ctx, \u201ckey\u201d, groupcache.ProtoSink(&amp;user)); err != nil { return nil, err } cancel()<\/code> <\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">So implementieren Sie es mit HTTP\/2 und TLS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GroupCache verwendet HTTP zur Kommunikation zwischen Instanzen im Cluster. Wenn Ihre Anwendung ebenfalls HTTP verwendet, kann GroupCache denselben HTTP-Port wie Ihre Anwendung nutzen. F\u00fcgen Sie den Pool einfach als Handler mit einem eigenen Pfad hinzu.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    1\/\/ Our application2http.HandleFunc(&quot;\/&quot;, func(w http.ResponseWriter, r *http.Request) {3 fmt.Fprint(w, &quot;Hi there&quot;)4})5\/\/ Handle GroupCache requests6http.Handle(&quot;\/_groupcache\/&quot;, pool)7log.Fatal(http.ListenAndServe(&quot;:8080&quot;, nil))8\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Wenn f\u00fcr Ihre Anwendung TLS konfiguriert ist, profitiert GroupCache von derselben TLS-Konfiguration, die Ihre Anwendung verwendet. Zudem besteht die M\u00f6glichkeit, HTTP\/2 zu aktivieren, was die Leistung von GroupCache-Anfragen weiter verbessert.\u202f<a href=\"https:\/\/www.mailgun.com\/blog\/dev-life\/http-2-cleartext-h2c-client-beispiel-go\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Sie k\u00f6nnen HTTP\/2 auch ohne TLS \u00fcber H2C verwenden<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mailguns Update zur Schl\u00fcsselentfernung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Ein nennenswerter Unterschied der Mailgun-Version von GroupCache ist die M\u00f6glichkeit, Schl\u00fcssel explizit aus dem Cache zu l\u00f6schen.<\/b> Wenn eine Instanz einen Schl\u00fcssel entfernen m\u00f6chte, l\u00f6scht sie den Schl\u00fcssel zun\u00e4chst aus der besitzenden Instanz und sendet dann die L\u00f6schanfragen an alle anderen Instanzen im Pool. Dadurch wird sichergestellt, dass alle zuk\u00fcnftigen Anfragen von Nicht-Eigent\u00fcmer-Instanzen im Pool an den Eigent\u00fcmer zu einem neuen Abruf oder Rendering der Daten f\u00fchren (oder zu einem Fehler, falls die Daten nicht mehr verf\u00fcgbar sind).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wie bei jedem verteilten System besteht die M\u00f6glichkeit, dass eine Instanz nicht verf\u00fcgbar ist oder die Verbindung unterbrochen wurde, als die Entfernungsanfrage gestellt wurde. In diesem Szenario gibt <code>group.Remove()<\/code> einen Fehler zur\u00fcck, der darauf hinweist, dass einige Instanzen nicht kontaktiert wurden, und die Art des Fehlers angibt. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je nach Anwendungsfall hat der Nutzer dann die M\u00f6glichkeit, den Aufruf von <code>group.Remove()<\/code> erneut zu versuchen oder den Fehler zu ignorieren. F\u00fcr einige Systeme kann es akzeptabel sein, den Fehler zu ignorieren, insbesondere wenn Sie die Funktion f\u00fcr abgelaufene Werte verwenden. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Funktion f\u00fcr abgelaufene Werte erm\u00f6glicht es Ihnen, eine optionale Ablaufzeit <code>time.Time<\/code> anzugeben, die einen zuk\u00fcnftigen Zeitpunkt festlegt, an dem die Daten ablaufen sollen.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    1\/\/ Our application2http.HandleFunc(&quot;\/&quot;, func(w http.ResponseWriter, r *http.Request) {3 fmt.Fprint(w, &quot;Hi there&quot;)4})5\/\/ Handle GroupCache requests6http.Handle(&quot;\/_groupcache\/&quot;, pool)7log.Fatal(http.ListenAndServe(&quot;:8080&quot;, nil))8\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">In dem oben genannten Szenario, in dem wir vor\u00fcbergehend die Verbindung zu einer Instanz verlieren, sprechen wir davon, dass sich der Instanzen-Pool in einem inkonsistenten Zustand befindet. Bei Verwendung in Verbindung mit der Datenablauffunktion wissen wir jedoch, dass das System schlie\u00dflich wieder konsistent wird, wenn die Daten auf den getrennten Instanzen ablaufen. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es gibt andere, weitaus komplexere L\u00f6sungen f\u00fcr dieses Problem, aber wir haben in der Praxis festgestellt, dass Eventually-Consistent-L\u00f6sungen <b>der einfachste und am wenigsten fehleranf\u00e4llige Weg<\/b> sind, um mit Netzwerkunterbrechungen umzugehen.<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> Eine kurze Anmerkung zur Discovery: GroupCache bietet zwar keine Methode zur Discovery von Instanzen, aber es gibt mehrere weit verbreitete Systeme, die diesen Prozess einfach machen. Hier sind einige Optionen f\u00fcr den Einstieg:<\/div><ul class=\"mb-0 mt-3\"><li><a href='https:\/\/github.com\/etcd-io\/etcd'>Etcd<\/a><\/li><li><a href='https:\/\/github.com\/kubernetes\/kubernetes'>Kubernetes<\/a><\/li><li><a href='https:\/\/github.com\/hashicorp\/consul'>Consul<\/a><\/li><li><a href='https:\/\/github.com\/hashicorp\/memberlist'>MemberList<\/a><\/li><\/ul>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Leistungsverbesserungen von Mailgun durch die Verwendung von GroupCache<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bei Mailgun erfolgte der erste produktive Einsatz von GroupCache in unserem Rate-Limit-Service. Da dieser Service auf einem sehr hohen Leistungs- und niedrigen Latenzniveau arbeiten muss, waren herk\u00f6mmliche Caching-Systeme bedenklich: Je mehr Roundtrips wir in die Anfrage-Pipeline einf\u00fchrten, desto mehr M\u00f6glichkeiten gab es f\u00fcr zus\u00e4tzliche Latenzen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die folgenden Diagramme <b>zeigen die Gesamtzahl der Cache-Hits sowie die Gesamtzahl der Hits, die zu einem Roundtrip zu einer anderen GroupCache-Instanz gef\u00fchrt haben<\/b>. Dies demonstriert genau, wie sehr wir vom lokalen In-Memory-Hot-Cache profitieren, anstatt bei jeder Anfrage einen Roundtrip-Aufruf durchzuf\u00fchren.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4841\" width=\"961\" height=\"469\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen_Shot_2022-11-22_at_4.18.53_PM__1_.png\" alt=\"Graph showing GroupCache hits and misses per second\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen_Shot_2022-11-22_at_4.18.53_PM__1_.png 961w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen_Shot_2022-11-22_at_4.18.53_PM__1_-300x146.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen_Shot_2022-11-22_at_4.18.53_PM__1_-768x375.png 768w\" sizes=\"(max-width: 961px) 100vw, 961px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Im n\u00e4chsten Diagramm k\u00f6nnen Sie genau sehen, wie sehr MongoDB und unsere Anwendung von der Vermeidung des Thundering-Herd-Problems profitieren, wenn neue Schl\u00fcssel aus dem System abgerufen werden.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4842\" width=\"696\" height=\"693\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen_Shot_2022-11-23_at_12.44.44_PM__2_.png\" alt=\"GroupCache peer request graph\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen_Shot_2022-11-23_at_12.44.44_PM__2_.png 696w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen_Shot_2022-11-23_at_12.44.44_PM__2_-150x150.png 150w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screen_Shot_2022-11-23_at_12.44.44_PM__2_-300x300.png 300w\" sizes=\"(max-width: 696px) 100vw, 696px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Die tats\u00e4chlichen Aufrufe von MongoDB machen nur einen kleinen Bruchteil der gesamten Anfragen aus, die tats\u00e4chlich an den Service gestellt werden. Zusammen mit der Geschwindigkeit von Gubernator erm\u00f6glicht dies unserem Rate-Limit-Service, auch bei hoher Auslastung mit geringer Latenz zu arbeiten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier sehen Sie die Antwortzeit-Metriken des Rate-Limits-Service. Bedenken Sie, dass wir f\u00fcr jede Anfrage einen Gubernator-Aufruf und eine GroupCache-Anfrage durchf\u00fchren, was in einer GroupCache-HTTP-Anfrage oder MongoDB-Anfrage resultieren kann \u2013 aber nicht muss.\u202f<i>(Dieses Diagramm zeigt die langsamsten Antworten, nicht den Durchschnitt)<\/i>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit: Verteiltes Caching leicht gemacht<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GroupCache hat die Leistung unserer Dienste bei Mailgun verbessert. Es macht <b>verteiltes Caching und Synchronisierung einfach<\/b> und leicht bereitzustellen. Ich hoffe, dass andere dieselben Vorteile entdecken, die wir genie\u00dfen, und dass dies weitere ICDC-Implementierungen in anderen Sprachen inspiriert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">War das hilfreich? Bei Mailgun evaluieren und implementieren wir st\u00e4ndig neue Wege, um unsere Dienste zu skalieren und unsere Leistung zu verbessern. Das ist nicht immer einfach. Wir w\u00fcrden uns freuen, wenn Sie aus unseren Erfahrungen lernen. Abonnieren Sie unseren Newsletter f\u00fcr weitere Inhalte wie diesen.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"longform-spacings\">\r\n        <div class=\"cta bg-primary rounded-lg px-5 py-6 p-md-7 px-md-6\">\r\n                    <div class=\"form-subscription\">\r\n                            <div class=\"h4 mb-3\">\r\n                    Bleiben Sie informiert! Erhalten Sie jede Woche wertvolle Inhalte direkt in Ihr Posteingang.                <\/div>\r\n                                    <form accept-charset=\"UTF-8\" action=\"\" enctype=\"multipart\/form-data\" data-form-subscription method=\"POST\" style=\"max-width: 400px;\">\r\n                <div class=\"row justify-content-between align-items-top g-2\">\r\n                    <div class=\"col-10\">\r\n                        <input type=\"email\" name=\"email\" class=\"form-control\" placeholder=\"Email\" autocomplete=\"email\" required>\r\n                        <div data-fs=\"error\" role=\"alert\" class=\"invalid-feedback\">\r\n                            Please complete this required field.                        <\/div>\r\n                    <\/div>\r\n                                            <div class=\"col-12 order-last mt-3 fs-xxs\" data-fs=\"acceptance\" style=\"display:none;\">\r\n                            \r\n                                <div class=\"form-check\">\r\n                                    <input id=\"formSubscriptionAcceptance-terms-6304\" class=\"form-check-input\"\r\n                                        type=\"checkbox\" name=\"terms\">\r\n                                    <label for=\"formSubscriptionAcceptance-terms-6304\" class=\"form-check-label text-body-color\">\r\n                                        Ich habe die Servicebedingungen gelesen und stimme ihnen zu.                                        <span class=\"hs-form-required\">*<\/span>\r\n                                    <\/label>\r\n                                <\/div>\r\n\r\n                            \r\n                                <div class=\"form-check\">\r\n                                    <input id=\"formSubscriptionAcceptance-privacy-5318\" class=\"form-check-input\"\r\n                                        type=\"checkbox\" name=\"privacy\">\r\n                                    <label for=\"formSubscriptionAcceptance-privacy-5318\" class=\"form-check-label text-body-color\">\r\n                                        Ich habe die Datenschutzerkl\u00e4rung gelesen und bin damit einverstanden.                                        <span class=\"hs-form-required\">*<\/span>\r\n                                    <\/label>\r\n                                <\/div>\r\n\r\n                                                    <\/div>\r\n                    \r\n                                            <div class=\"col-12 order-last fs-xxs mb-0 mt-2 text-body-color\">\r\n                            Senden Sie mir den Mailjet-Newsletter. Ich bin mit dem Erhalt des Newsletters einverstanden und wei\u00df, dass ich mich jederzeit unkompliziert wieder abmelden kann.                        <\/div>\r\n                    \r\n                    <div class=\"col-2\">\r\n                        <button type=\"submit\" value=\"Submit\" aria-label=\"Submit\" class=\"btn btn-secondary btn-icon\">\r\n                            <svg aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/layout\/chevron-right.svg\"><\/svg>\r\n                        <\/button>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <input type=\"hidden\" name=\"formSubscriptionRecaptchaToken\" data-fs=\"recaptcha-token\">\r\n                <input type=\"hidden\" name=\"customListID\" value=\"\">\r\n\r\n            <\/form>\r\n            <div data-fs=\"message-success\" style=\"display: none;\">\r\n                <p class=\"mb-0 mt-2 text-body-color\">\r\n                    Pr\u00fcfen Sie Ihren Posteingang jeden Monat auf Ihren Mailjet Newsletter!                <\/p>\r\n            <\/div>\r\n        <\/div>\r\n        <\/div>\r\n    <\/div>\r\n","protected":false},"excerpt":{"rendered":"<p>Der Golang-Cache, auch bekannt als GroupCache, ist eine fantastische Erg\u00e4nzung unseres Toolsets f\u00fcr verteilte Dienste bei Mailgun. So implementieren Sie ihn in Ihrem Toolset.<\/p>\n","protected":false},"author":35,"featured_media":4843,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[23],"class_list":["post-24246","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-it-and-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Golangs \u00fcberlegene Cache-L\u00f6sung gegen\u00fcber Memcached und Redis - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"GroupCache ist eine fantastische Erg\u00e4nzung unseres Toolsets f\u00fcr verteilte Dienste bei Mailgun. So k\u00f6nnen Sie ihn in Ihrem Toolset implementieren.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Golangs \u00fcberlegene Cache-L\u00f6sung gegen\u00fcber Memcached und Redis - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"GroupCache ist eine fantastische Erg\u00e4nzung unseres Toolsets f\u00fcr verteilte Dienste bei Mailgun. So k\u00f6nnen Sie ihn in Ihrem Toolset implementieren.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-16T11:46:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"10\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/golangs-superior-cache-solution-memcached-redis\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/golangs-superior-cache-solution-memcached-redis\\\/\",\"name\":\"Golangs \u00fcberlegene Cache-L\u00f6sung gegen\u00fcber Memcached und Redis - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/golangs-superior-cache-solution-memcached-redis\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/golangs-superior-cache-solution-memcached-redis\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"datePublished\":\"2022-12-01T00:00:00+00:00\",\"dateModified\":\"2026-09-16T11:46:09+00:00\",\"description\":\"GroupCache ist eine fantastische Erg\u00e4nzung unseres Toolsets f\u00fcr verteilte Dienste bei Mailgun. So k\u00f6nnen Sie ihn in Ihrem Toolset implementieren.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/golangs-superior-cache-solution-memcached-redis\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/golangs-superior-cache-solution-memcached-redis\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/golangs-superior-cache-solution-memcached-redis\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/golangs-superior-cache-solution-memcached-redis\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"GroupCache: Der \u00fcberlegene Golang-Cache\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Golangs \u00fcberlegene Cache-L\u00f6sung gegen\u00fcber Memcached und Redis - Transactional Email API Service For Developers | Mailgun","description":"GroupCache ist eine fantastische Erg\u00e4nzung unseres Toolsets f\u00fcr verteilte Dienste bei Mailgun. So k\u00f6nnen Sie ihn in Ihrem Toolset implementieren.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/","og_locale":"de_DE","og_type":"article","og_title":"Golangs \u00fcberlegene Cache-L\u00f6sung gegen\u00fcber Memcached und Redis - Transactional Email API Service For Developers | Mailgun","og_description":"GroupCache ist eine fantastische Erg\u00e4nzung unseres Toolsets f\u00fcr verteilte Dienste bei Mailgun. So k\u00f6nnen Sie ihn in Ihrem Toolset implementieren.","og_url":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-09-16T11:46:09+00:00","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"10\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/","url":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/","name":"Golangs \u00fcberlegene Cache-L\u00f6sung gegen\u00fcber Memcached und Redis - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","datePublished":"2022-12-01T00:00:00+00:00","dateModified":"2026-09-16T11:46:09+00:00","description":"GroupCache ist eine fantastische Erg\u00e4nzung unseres Toolsets f\u00fcr verteilte Dienste bei Mailgun. So k\u00f6nnen Sie ihn in Ihrem Toolset implementieren.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/golangs-superior-cache-solution-memcached-redis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/de\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/de\/blog\/"},{"@type":"ListItem","position":3,"name":"GroupCache: Der \u00fcberlegene Golang-Cache"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/de\/#website","url":"https:\/\/www.mailgun.com\/de\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!","publisher":{"@id":"https:\/\/www.mailgun.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/de\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/24246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/users\/35"}],"version-history":[{"count":1,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/24246\/revisions"}],"predecessor-version":[{"id":24247,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/24246\/revisions\/24247"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media\/4843"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media?parent=24246"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog_category?post=24246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}