Ich bin gerade dabei, einen Emacs-Hauptmodus für das Stack Exchange-Netzwerk zu schreiben . Wenn Sie Emacs regelmäßig verwenden, profitieren Sie am Ende davon.
Um die Anzahl der Aufrufe der API von Stack Exchange (maximal 10000 pro IP und Tag) zu minimieren und nur ein allgemein verantwortlicher Bürger zu sein, möchte ich die vom Netzwerk empfangenen Informationen zwischenspeichern und im Speicher speichern und darauf warten erneut zugegriffen werden. Ich bin wirklich nicht sicher, in welcher Datenstruktur diese Informationen gespeichert werden sollen.
Offensichtlich wird es eine Liste sein. Wie bei jeder Datenstruktur muss die Auswahl jedoch davon abhängen, welche Daten gespeichert werden und wie auf sie zugegriffen wird. Was, ich möchte in der Lage sein, alle diese Informationen in einem einzigen Symbol wie zu speichern stack-api/cache
. Also, ohne weiteres, stack-api/cache
ist eine Liste der Nachteile, die durch das letzte Update verschlüsselt wurden:
`(<csite> <csite> <csite>)
wo <csite>
wäre
(1362501715 . <site>)
An dieser Stelle haben wir lediglich eine einfache Zuordnungsliste definiert . Natürlich müssen wir tiefer gehen .
Jedes <site>
ist eine Liste der API-Parameter (eindeutig), gefolgt von einer Listenfrage:
`("codereview" <cquestion> <cquestion> <cquestion>)
Jedes <cquestion>
ist, Sie haben es erraten, ein Nachteil von Fragen mit ihrer letzten Aktualisierungszeit:
`(1362501715 <question>) (1362501720 . <question>)
<question>
ist ein Nachteil einer question
Struktur und eine Liste von Antworten (wiederum berücksichtigt mit ihrer letzten Aktualisierungszeit):
`(<question-structure> <canswer> <canswer> <canswer>
und `
`(1362501715 . <answer-structure>)
Diese Datenstruktur ist wahrscheinlich am genauesten als Baum beschrieben, aber ich weiß nicht , ob es eine bessere Art und Weise ist das die Sprache unter Berücksichtigung zu tun, Emacs Lisp (die so verschieden von der Lisp nicht alles , was Sie wissen und Liebe überhaupt ) . Die expliziten Nachteile sind wahrscheinlich unnötig, aber es hilft meinem Gehirn, sich besser darum zu kümmern. Ich bin mir ziemlich sicher <csite>
, dass aus einem zum Beispiel einfach etwas werden würde
(<epoch-time> <api-param> <cquestion> <cquestion> ...)
Bedenken:
- Hat das Speichern von Daten in einer potenziell großen Struktur wie dieser Leistungskompromisse für das System? Ich möchte vermeiden, fremde Daten zu speichern, aber ich habe getan, was ich konnte, und ich glaube nicht, dass der Datensatz überhaupt so groß ist (für den normalen Gebrauch), da alles nur von Menschen lesbarer Text in angemessenem Verhältnis ist. (Ich habe vor, alte Daten anhand der Zeiten am Anfang der Liste zu löschen. Jeder erbt seine letzte Aktualisierungszeit von seinen untergeordneten Elementen und so weiter im Baum. Inwieweit sollte diese Löschung stattfinden: Ich nicht sicher.)
- Hat das Speichern solcher Daten Leistungskompromisse für das, was sie verwenden muss? Das heißt, werden das Setzen und Abrufen von Vorgängen unter der Größe der Liste leiden?
Haben Sie weitere Vorschläge, wie eine bessere Struktur aussehen könnte?
org
); <!-- language: blah>
gegebenenfalls Einfügen (abhängig von dem Modus, in dem die Codebearbeitung durchgeführt wurde); solche Sachen. Siehe README auf GitHub für weitere Informationen, und fühlen sich am meisten willkommen Features vorzuschlagen. Je mehr ich vorher darüber weiß, desto besser kann es gestaltet werden. bearbeiten , um Emacs Tastenkombinationen nicht zu erwähnen;)