Saya ingin berbagi pengalaman saya dalam mengoptimalkan data untuk mengurangi biaya sumber daya.
Cepat atau lambat, sistem menimbulkan pertanyaan tentang mengoptimalkan data yang disimpan, terutama jika data disimpan dalam RAM. Contoh database semacam itu adalah Redis.
Sebagai solusi sementara, Anda dapat meningkatkan RAM sehingga menambah waktu.
Redis adalah database no-sql, Anda dapat membuat profil menggunakan perintah built-in redis-cli --bigkeys , yang akan menunjukkan jumlah kunci dan berapa banyak rata-rata yang dibutuhkan setiap kunci.
Data historis dari jenis set yang diurutkan ternyata merupakan data besar . Mereka memiliki rotasi 10 hari dari aplikasi.
Proyek ini sedang dalam produksi, jadi pengoptimalan seharusnya tidak memengaruhi pengguna dengan cara apa pun.
Data mewakili peristiwa perubahan harga / tanggal pengiriman untuk penawaran tersebut. Ada banyak penawaran - sekitar 15.000 di setiap feed (daftar harga).
Pertimbangkan contoh data acara berikut untuk sebuah penawaran:
{"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"}}
Acara ini membutuhkan 706 byte.
Optimasi
Untuk memulainya, saya mengurangi rotasi menjadi 7 hari, karena itu adalah minggu terakhir yang digunakan. Perlu dicatat di sini bahwa langkahnya sangat mudah (di kode sumber saya ubah 10 menjadi 7), segera mengurangi ukuran RAM sebesar 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%.