Optimización de los datos almacenados en un 93% (Redis)

Me gustaría compartir mi experiencia en la optimización de datos para reducir los costos de recursos.





Tarde o temprano, el sistema plantea la cuestión de optimizar los datos almacenados, especialmente si los datos se almacenan en RAM. Un ejemplo de una base de datos de este tipo es Redis.





Como solución temporal, puede aumentar la RAM ganando tiempo.





Redis es una base de datos sin sql, puede perfilarla usando el comando incorporado redis-cli --bigkeys , que mostrará la cantidad de claves y cuánto toma cada clave en promedio.





Los datos históricos del tipo de conjuntos ordenados resultaron ser datos grandes . Tenían una rotación de 10 días desde la aplicación.





El proyecto está en producción, por lo que la optimización no debería haber afectado a los usuarios de ninguna manera.





Los datos representan eventos de cambios de precio / fecha de entrega para la oferta. Hubo muchas ofertas, alrededor de 15,000 en cada feed (lista de precios).





Considere el siguiente ejemplo de datos de eventos para una oferta:





Hecho con http://json.parser.online.fr/
Hecho con 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"}}







Este evento ocupa 706 bytes.





Mejoramiento

  1. Para empezar, reduje la rotación a 7 días, ya que fue la última semana que se utilizó. Vale la pena señalar aquí que el paso es muy fácil (en el código fuente cambié de 10 a 7), inmediatamente reduce el tamaño de la RAM en un 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