お久しぶりです。技術の李です。

少し前に陳さん主催の勉強会の記事ができましたので、共有いたします。

前回のCache雑談勉強会でお見せしたキャッシュの全体像です。

今回は続きの内容で、Data Cacheについて詳しく解説いたします。

 

MySQL Query Cache

クエリーキャッシュには、クライアントに送信された対応する結果とともに、SELECT ステートメントのテキストが格納されます。あとで同じステートメントを受け取った場合、サーバーはそのステートメントを再度解析して実行する代わりに、クエリーキャッシュから結果を取得します。

関連設定

SHOW VARIABLES LIKE ‘%query cache%’ を実行し確認。

関連状態

SHOW STATUS LIKE ‘Qcache’ を実行し確認。

以下3つのクエリを実行した結果をご覧ください。3つとも同じ意味ですが、全部キャッシュされました。特に一つ目と二つ目はスペースが入っただけの違いなのにキャッシュされました。

しかし関数が入った場合、キャッシュされませんでした。

以下の場合キャッシュは効かない

・Where 条件で、関数を使った場合

・クエリ結果のサイズはquery_cache_limitより大きい場合

・テーブルの構造は変更された場合(TRUNCATE、ALTER TABLE、DROP TABLEなど)

・テーブルのデータは変更された場合(INSERT、UPDATE、 DELETEなど)

 

Cache サーバを使う

現在主流なキャッシュサーバは二つあります。MemcachedとRedisです。この二つの特徴をまとめました。

MemcachedとRedisの比較(参考リンク)

Memcachedの方が速いのか?

結論確かにMemcachedの方が速いです。理由は以下になります。

・単純なデータ型(Redisは複雑なデータタイプを持ってるので、 その場でサイズ計算するため、CPU計算に時間が掛かる)

・マルチスレッドを使用する

・Slab Allocatorというメカニズムを使ってメモリの確保・管理を行う( Redisは臨時申請制のため、メモリにフラグメンテーション(断片化)は発生しやすい)

・内蔵のオンメモリを使用する(Redisは一部VMを利用する、swap)、ValueのMax Sizeは1MB

実はRedisの方がオススメ

ここではRedis作者のSalvatore Sanfilippoさんの回答をお借りします。

You should not care too much about performances.(Redisもう十分速いよ)

You should care about memory usage. For simple key-value pairs memcached is more memory efficient. If you use Redis hashes, Redis is more memory efficient. Depends on the use case.(Redisハッシュを使用すると、Redisのメモリ効率が向上する)

You should care about persistence and replication, two features only available in Redis.(レプリケーションと永続性、再起動しても平気)

You should care about the kind of operations you need. (柔軟なデータ構造、Strings、 Lists、 Sets、 Sorted Sets、 Hashes)

参考リンク

 

読み込み時の流れ

こちらはわかりやすいです。まずキャッシュを読み込みます。あればそのままで、なければデータベースの読み込みを行います。

そして、キャッシュへ保存します。

書き込み時問題

以下の書き込みをする場合、各パターンにどのような問題があるのか考えてみましょう。

例:Key(‘supplier_1’) = 7

  Tbl(‘supplier_1’) = 7

  supplier_1のリードタイムを5に変更する

問題点

データベース更新時に失敗してしまうとまずい。先にキャッシュを更新するのはNG。

 

問題点

こちらは①と似ていて、キャッシュの更新時に失敗してしまうとまずい。

 

問題点

並行性制御問題が発生してしまいます。しかし①よりはマシになりました。

 

問題点

こちらは②と同じの失敗パターンです。

 

こちらが現在Facebookのやり方になります。

所感

勉強会を通してキャッシュとデータベースの関連性についてより知ることができました。そして、機械の処理は一瞬ですが、その一瞬を切り分けて、細かく考えることで、どこにリスクが存在しているのかを認識する考え方もとても面白いと感じました。

キャッシュのアップデートについてはupdateよりもdeleteの方が色んな状況において安全かもしれませんと思いました。

この記事が気に入ったら
いいね ! しよう

Twitter で