Ich arbeite mit einem Account-System, mit dem Benutzer ihre Anzeigenamen ändern können. Um dies zu erreichen, hat jeder Benutzer eine UUID. An verschiedenen Punkten in meinem Programm habe ich möglicherweise eine UUID und möchte ihren aktuellen Anzeigenamen, oder ich habe einen aktuellen Anzeigenamen und ich möchte die UUID nachschlagen. Das Nachschlagen beinhaltet entweder einen Datenbankaufruf oder eine HTTP-Anfrage, daher möchte ich Ergebnisse im Speicher zwischenspeichern. Ich bin vertraut mit Guava's LoadingCache, aber es scheint, als müsste ich zwei Caches (Namen -> UUIDs und UUIDs -> Namen) erstellen, um dies zu erreichen. This seems bug-prone, similar to how a BiMap is better than two synchronous maps Gibt es so etwas wie einen bidirektionalen LoadingCache?Etwas ähnliches wie Guava LoadingCache, aber bidirektional?
Antwort
Für diesen Fall würde ich nicht unbedingt über ein Paar Caches sorgen, die Bug-anfällig sind: Sie müssen nicht die beiden Richtungen synchron halten, und wenn Sie dies nicht tun, gibt es keine echten Fehler. UUIDs und ihre Beziehungen zu Benutzern werden sich nicht ändern.
Es ist schwierig, einen bidirektionalen Cache richtig synchronisiert zu halten, aber für diesen Fall scheint es Overkill zu sein.
Gut genug, ich denke, mein Hauptanliegen ist eine Situation wie die Abfrage von UUID -> name und bald danach, dass ich nach der UUID dieses Namens gefragt habe. Ich möchte nicht nach Informationen suchen müssen, die ich bereits habe (wenn auch rückwärts, in einem anderen Cache) – ThankThePhoenicians
Dieser Wettlauf ist etwas unvermeidlich, aber Sie können ihn reduzieren, indem Sie z. 'PutIfAbsent' im Reverse-Cache. Du wirst Rennen haben, und sie werden vielleicht zu mehr Fragen führen, als du gerne hättest, aber sie werden gutartige Rassen sein, und alles bessere wäre super kompliziert, wenn es überhaupt möglich wäre. –
- 1. Entwerfen einer Guava LoadingCache mit variablem Eintrag Ablauf
- 2. Refresh Guava LoadingCache jeden Tag zu einer bestimmten Zeit
- 3. Guava LoadingCache: Warum refreshAfterWrite und expireAfterWrite zusammen verwenden
- 4. Gibt es etwas Ähnliches wie strcpy, aber für int-Wert?
- 5. Statische Schlüssel in Google Guava
- 6. Hat Ruby etwas ähnliches wie. =, Wie + =?
- 7. rmarkdown Kommentare oder etwas ähnliches
- 8. Etwas ähnliches wie jMonkey Engine für C#
- 9. Hat JUnit 3 etwas Ähnliches wie @BeforeClass?
- 10. mciSendString, sucht etwas ähnliches wie Befehl "Warten"
- 11. Hat MEAN.js etwas ähnliches wie Sails.js Blaupausen?
- 12. Hat jQuery etwas ähnliches wie YUIs getDocumentScrollTop?
- 13. Etwas ähnliches wie PHP SimpleXML in Python?
- 14. Guava LoadingCache - wie man mit Schlüsseln umgeht, die nicht im Backing-Store existieren
- 15. muss helfen auf Bootstrap oder etwas ähnliches
- 16. c hat scanf, hat python etwas ähnliches?
- 17. Sind native JavaScript-Funktionen etwas "superglobales" -ähnliches?
- 18. Etwas wie jQuery.extend() aber Standalone?
- 19. ReSharper (oder etwas ähnliches) für Qt?
- 20. Dateierstellungszeit über PHP (oder etwas Ähnliches)
- 21. ReSharper (oder etwas ähnliches) für Visual C++?
- 22. Google Guava Arbeiten mit der Anwendung
- 23. tut XElement etwas ähnliches hat XmlNodeList
- 24. Guava-Cache expireAfterAccess Problem
- 25. Wie implementiert man etwas Ähnliches wie die @Override Java Annotation?
- 26. Guava Ticker Cache
- 27. BeautifulSoup: etwas Ähnliches wie .head() Funktion in Pandas
- 28. Gibt es in PHP etwas Ähnliches wie NEGATIVE_INFINITY?
- 29. Gibt es etwas Ähnliches wie Androids Ressourcensystem in kleinerem Maßstab?
- 30. Hat Asp.net-Webseiten etwas ähnliches wie Html.Partial in Razor
Können zwei Benutzer den gleichen Anzeigenamen haben? Wenn ja, dann muss Ihr Reverse-Lookup das irgendwie handhaben und es ist nicht eins zu eins. Wahrscheinlich möchten Sie die ID stattdessen mit dem Anzeigenamen ausblenden. –