Ich möchte meine Erfahrungen bei der Optimierung von Daten teilen, um die Ressourcenkosten zu senken.
Früher oder später wirft das System die Frage auf, die gespeicherten Daten zu optimieren, insbesondere wenn die Daten im RAM gespeichert sind. Ein Beispiel für eine solche Datenbank ist Redis.
Als vorübergehende Lösung können Sie den Arbeitsspeicher erhöhen und dadurch Zeit gewinnen.
Redis ist eine No-SQL-Datenbank. Sie können sie mit dem integrierten Befehl redis-cli --bigkeys profilieren , der die Anzahl der Schlüssel und die durchschnittliche Anzahl der einzelnen Schlüssel anzeigt .
Historische Daten vom Typ der sortierten Mengen erwiesen sich als große Datenmengen . Sie hatten eine 10-tägige Rotation von der App.
Das Projekt befindet sich in der Produktion, daher sollte die Optimierung die Benutzer in keiner Weise beeinflusst haben.
Die Daten stellten Ereignisse von Preis- / Lieferterminänderungen für das Angebot dar. Es gab viele Angebote - ungefähr 15.000 in jedem Feed (Preisliste).
Betrachten Sie das folgende Beispiel für Ereignisdaten für ein Angebot:
{"EventName":"DELIVERY_CHANGED","DateTime":"2021-02-22T00:04:00.112593982+03:00","OfferId":"109703","OfferFrom":{"Id":"109703","Name":" LG SN11R","Url":"https://www.example.ru/saundbar-lg-sn11r/?utm_source=yandex_market&utm_medium=cpc&utm_content=948&utm_campaign=3&utm_term=109703","Price":99990,"DeliveryAvailable":true,"DeliveryCost":0,"DeliveryDate":"2021-02-24T23:49:00+03:00"},"OfferTo":{"Id":"109703","Name":" LG SN11R","Url":"https://www.example.ru/saundbar-lg-sn11r/?utm_source=yandex_market&utm_medium=cpc&utm_content=948&utm_campaign=3&utm_term=109703","Price":99990,"DeliveryAvailable":true,"DeliveryCost":0,"DeliveryDate":"2021-02-23T00:04:00.112593982+03:00"}}
Dieses Ereignis benötigt 706 Bytes.
Optimierung
Zunächst reduzierte ich die Rotation auf 7 Tage, da es die letzte Woche war, die verwendet wurde. Es ist erwähnenswert, dass der Schritt sehr einfach ist (im Quellcode habe ich 10 auf 7 geändert), er reduziert sofort die RAM-Größe um 30%.
, , , name, url, offerId 50%.
C:
{"EventName":"DELIVERY_CHANGED","DateTime":"2021-02-22T00:04:00.112593982+03:00","OfferId":"109703","OfferFrom":{"Price":99990,"DeliveryAvailable":true,"DeliveryCost":0,"DeliveryDate":"2021-02-24T23:49:00+03:00"},"OfferTo":{"Price":99990,"DeliveryAvailable":true,"DeliveryCost":0,"DeliveryDate":"2021-02-23T00:04:00.112593982+03:00"}}
334 .
json protobuf.
, protobuf proto - :
syntax = "proto3"; import "google/protobuf/timestamp.proto"; message OfferEvent { enum EventType { PRICE_CHANGED = 0; DELIVERY_CHANGED = 1; DELIVERY_SWITCHED = 2; APPEARED = 3; DISAPPEARED = 4; } EventType event_name = 1; google.protobuf.Timestamp date_time = 2; string offer_id = 3; message Offer { int32 price = 1; bool delivery_available = 2; int32 delivery_cost = 3; google.protobuf.Timestamp delivery_date = 4; } Offer offer_from = 4; Offer offer_to = 5; }
protobuf
event_name: DELIVERY_CHANGED date_time { seconds: 1613941440 } offer_id: "109703" offer_from { price: 99990 delivery_available: true delivery_date { seconds: 1614199740 } } offer_to { price: 99990 delivery_available: true delivery_date { seconds: 1614027840 } }
protobuf
echo ' event_name: DELIVERY_CHANGED date_time { seconds: 1613941440 } offer_id: "109703" offer_from { price: 99990 delivery_available: true delivery_date { seconds: 1614199740 } } offer_to { price: 99990 delivery_available: true delivery_date { seconds: 1614027840 } } ' | protoc --encode=OfferEvent offerevent.proto | xxd -p | tr -d "\n" 0801120608c095cb81061a06313039373033220e08968d061001220608bcf7da81062a0e08968d061001220608c0b8d08106
50 . 85%.
proto- - https://protogen.marcgravell.com/
, 14 (50 706 ), 93%.