Gostaria de compartilhar minha experiência em otimização de dados para reduzir custos de recursos.
Mais cedo ou mais tarde, o sistema levanta a questão de otimizar os dados armazenados, especialmente se os dados estão armazenados na RAM. Um exemplo de banco de dados é o Redis.
Como solução temporária, você pode aumentar a RAM, ganhando tempo.
O Redis é um banco de dados sem sql, você pode criar o perfil dele usando o comando interno redis-cli --bigkeys , que mostrará o número de chaves e quanto cada chave leva em média.
Os dados históricos do tipo de conjuntos classificados revelaram-se grandes dados . Eles tiveram uma rotação de 10 dias do aplicativo.
O projeto está em produção, então a otimização não deveria ter afetado os usuários de forma alguma.
Os dados representaram eventos de mudanças de preço / data de entrega para a oferta. Houve muitas ofertas - cerca de 15.000 em cada feed (lista de preços).
Considere o seguinte exemplo de dados de evento para uma oferta:
{"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.
Otimização
Para começar, reduzi o rodízio para 7 dias, já que foi a última semana que usei. É importante notar aqui que a etapa é muito fácil (no código-fonte eu alterei de 10 para 7), ela reduz imediatamente o tamanho da RAM em 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%.