保存データの93%の最適化(Redis)

リソースコストを削減するためにデータを最適化した経験を共有したいと思います。





遅かれ早かれ、システムは、特にデータがRAMに保存されている場合、保存されたデータを最適化するという問題を提起します。このようなデータベースの例はRedisです。





一時的な解決策として、RAMを増やして時間を稼ぐことができます。





RedisはSQLを使用しないデータベースであり、組み込みコマンドredis-cli --bigkeysを使用してプロファイルを作成できます。このデータベースには、キーの数と各キーの平均使用量が表示されます。





ソートされたセットタイプの履歴データは大きなデータであることが判明しました彼らはアプリから10日間ローテーションしました。





プロジェクトは本番環境にあるため、最適化によってユーザーに影響が及ぶことはありません。





データは、オファーの価格/納期変更のイベントを表しています。たくさんのオファーがありました-各フィード(価格表)で約15,000。





オファーのイベントデータの次の例について考えてみます。





http://json.parser.online.fr/で作成
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"}}







このイベントは706バイトかかります。





最適化

  1. まず、使用されたのは最後の週だったので、ローテーションを7日に短縮しました。ここで注目に値するのは、この手順が非常に簡単で(ソースコードで10から7に変更した場合)、RAMサイズがすぐに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