<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Redis on Yossy's Notes</title><link>https://yoshihiroshu.com/tags/redis/</link><description>Recent content in Redis on Yossy's Notes</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Sat, 16 Dec 2023 12:00:00 +0900</lastBuildDate><atom:link href="https://yoshihiroshu.com/tags/redis/index.xml" rel="self" type="application/rss+xml"/><item><title>Redisの負荷を1/3改善した話</title><link>https://yoshihiroshu.com/blog/redis-load-reduction/</link><pubDate>Sat, 16 Dec 2023 12:00:00 +0900</pubDate><guid>https://yoshihiroshu.com/blog/redis-load-reduction/</guid><description>&lt;div>&lt;a id="td-block-0" class="td-offset-anchor">&lt;/a>&lt;/div>
&lt;section class="row td-box td-box--white td-box--height-auto">
&lt;div class="col">
&lt;div class="container">
&lt;h2 id="はじめに">はじめに&lt;a class="td-heading-self-link" href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>現在とある金融系Webメディアを運営する会社で、主にバックエンドの開発を担当しており、フロントエンド、インフラに関する業務も担当しています。&lt;/p>
&lt;p>今回は、先輩エンジニアがデータ圧縮アルゴリズムを変更することでRedisの負荷を1/3に削減することに成功した実例をもとに記述して行きます。&lt;/p>
&lt;ul>
&lt;li>先輩エンジニア(通称 &lt;a href="https://github.com/ichigozero">ichigozero&lt;/a>)は、vimmer, hacker, rustが得意なエンジニアです。（共通の趣味（おうちKubernetes）について語り合うのが日課です。笑）&lt;/li>
&lt;/ul>
&lt;h2 id="サービスの概要">サービスの概要&lt;a class="td-heading-self-link" href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e6%a6%82%e8%a6%81" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>金融に関する記事を掲載するWebメディアを運用しています。&lt;/p>
&lt;h2 id="背景">背景&lt;a class="td-heading-self-link" href="#%e8%83%8c%e6%99%af" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>現在運用しているメディアでは約100万記事掲載しており、直近一年で約50万記事と急激に増加し、Redisのパフォーマンスが劣化する課題がありました。&lt;/p>
&lt;p>RedisのCPU使用率が高負荷状態になると、インスタンスを増やすことで一時的な対応を行っていました。&lt;/p>
&lt;p>そこで根本的なアプローチをし、改善を行うとなったのが背景です。&lt;/p>
&lt;p>*別アプローチも行っており、大幅な改善が見られました。別記事にて紹介する予定です。&lt;/p>
&lt;h2 id="前提">前提&lt;a class="td-heading-self-link" href="#%e5%89%8d%e6%8f%90" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;h3 id="データ取得のフロー">データ取得のフロー&lt;a class="td-heading-self-link" href="#%e3%83%87%e3%83%bc%e3%82%bf%e5%8f%96%e5%be%97%e3%81%ae%e3%83%95%e3%83%ad%e3%83%bc" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>サーバーでは、Redis-&amp;gt;PostgreSQLという順番で問い合わせを行っています。&lt;/p>
&lt;pre class="mermaid">sequenceDiagram
 participant Client
 participant Server
 participant Redis
 participant PostgreSQL

 Client-&amp;gt;Server: リクエスト

 Server-&amp;gt;Redis: Redisからデータを取得
 Redis-&amp;gt;Server: データが存在する場合、データを返す

 alt Redisからデータが存在しない場合
 Server-&amp;gt;PostgreSQL: PostgreSQLからデータを取得
 Server-&amp;gt;Redis: データを保存
 end

 Server-&amp;gt;Client: レスポンス&lt;/pre>
&lt;h2 id="解決策">解決策&lt;a class="td-heading-self-link" href="#%e8%a7%a3%e6%b1%ba%e7%ad%96" aria-label="Heading self-link">&lt;/a>&lt;/h2>&lt;p>データ圧縮アルゴリズムのGob形式から、パフォーマンスの高いアルゴリズムであるMgspack形式とSnappy形式を採用することで、大幅な改善に成功しました。&lt;/p>
&lt;h3 id="採用理由">採用理由&lt;a class="td-heading-self-link" href="#%e6%8e%a1%e7%94%a8%e7%90%86%e7%94%b1" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>データ圧縮のベンチマークについては、&lt;code>Gob&lt;/code>と&lt;code>Mgspack + Snappy&lt;/code>は同等のパフォーマンスです。&lt;/p>
&lt;p>しかしバイトサイズを比較すると&lt;code>Mgspack + Snappy&lt;/code>が&lt;code>Gob&lt;/code>と比べ、半分のサイズに圧縮することができています。&lt;/p>
&lt;p>結果、Redisのベンチマークを比べるとns/op(1回の操作にかかる平均時間)が約11%、B/op(1回の操作で消費する平均メモリ量)が約3%、allocs/op(1回の操作で生成される平均割り当て数)が約80%と大幅に改善したので採用しました。&lt;/p>
&lt;h3 id="ベンチマーク">ベンチマーク&lt;a class="td-heading-self-link" href="#%e3%83%99%e3%83%b3%e3%83%81%e3%83%9e%e3%83%bc%e3%82%af" aria-label="Heading self-link">&lt;/a>&lt;/h3>&lt;p>データ圧縮のベンチマーク&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-zsh" data-lang="zsh">&lt;span class="line">&lt;span class="cl">BenchmarkJSONMarshal-12 	 45304	 &lt;span class="m">25614&lt;/span> ns/op	 &lt;span class="m">17984&lt;/span> B/op	 &lt;span class="m">35&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkJSONUnmarshal-12 	 14763	 &lt;span class="m">81072&lt;/span> ns/op	 &lt;span class="m">31334&lt;/span> B/op	 &lt;span class="m">74&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkGobMarshal-12 	 120536	 &lt;span class="m">10011&lt;/span> ns/op	 &lt;span class="m">29876&lt;/span> B/op	 &lt;span class="m">51&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkGobUnmarshal-12 	 56109	 &lt;span class="m">21446&lt;/span> ns/op	 &lt;span class="m">36464&lt;/span> B/op	 &lt;span class="m">243&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkMsgpackMarshal-12 	 373802	 &lt;span class="m">2888&lt;/span> ns/op	 &lt;span class="m">28005&lt;/span> B/op	 &lt;span class="m">5&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkMsgpackUnmarshal-12 	 369746	 &lt;span class="m">3261&lt;/span> ns/op	 &lt;span class="m">15286&lt;/span> B/op	 &lt;span class="m">34&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkMsgpackSnappyMarshal-12 	 55236	 &lt;span class="m">21330&lt;/span> ns/op	 &lt;span class="m">44386&lt;/span> B/op	 &lt;span class="m">5&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BenchmarkMsgpackSnappyUnmarshal-12 	 140824	 &lt;span class="m">8507&lt;/span> ns/op	 &lt;span class="m">28951&lt;/span> B/op	 &lt;span class="m">35&lt;/span> allocs/op
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Redisベンチマーク&lt;/p></description></item></channel></rss>