Optimisation des données stockées de 93% (Redis)

Je souhaite partager mon expérience dans l'optimisation des données afin de réduire les coûts de ressources.





Tôt ou tard, le système pose la question de l'optimisation des données stockées, surtout si les données sont stockées en RAM. Un exemple d'une telle base de données est Redis.





En tant que solution temporaire, vous pouvez augmenter la RAM, gagnant ainsi du temps.





Redis est une base de données sans sql, vous pouvez la profiler à l'aide de la commande intégrée redis-cli --bigkeys , qui affichera le nombre de clés et combien chaque clé prend en moyenne.





Les données historiques du type ensembles triés se sont avérées être des données volumineuses . Ils avaient une rotation de 10 jours depuis l'application.





Le projet est en production, l'optimisation n'aurait donc pas dû affecter les utilisateurs en aucune façon.





Les données représentaient des événements de changement de prix / date de livraison pour l'offre. Il y avait beaucoup d'offres - environ 15 000 dans chaque flux (liste de prix).





Prenons l'exemple suivant de données d'événement pour une offre:





Réalisé avec http://json.parser.online.fr/
Réalisé avec 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"}}







Cet événement prend 706 octets.





Optimisation

  1. Pour commencer, j'ai réduit la rotation à 7 jours, puisque c'était la dernière semaine qui était utilisée. Il est à noter ici que l'étape est très simple (dans le code source j'ai changé 10 à 7), cela réduit immédiatement la taille de la RAM de 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