Optimierung der gespeicherten Daten um 93% (Redis)

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:





Erstellt mit http://json.parser.online.fr/
Erstellt mit http://json.parser.online.fr/

{"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

  1. 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%.





  2. , , , 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 .





    1. json protobuf.









      1. , 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;
        } 
              
              



      2. 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
          }
        }
        
              
              



      3. 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%.








All Articles