今回はこういった方向け。
KVSの基礎知識を解説します。
また、Dockerを使ってKVS(Redis)をハンズオン形式で触るコーナーも用意しているので、最後まで読んで頂けると幸いです。
KVSとは何か?【KVSの基礎知識】
KVSとは「Key-Value store」の略で、NoSQL(Not only SQL:SQLを使わずにデータを保存するデータベース)の一種です。
一般にDB(データベース)というと、RDB(リレーショナルデータベース)を指すことが多いですが、NoSQLはRDBとは明確に異なるものです。
関係性を表にすると以下のようになります。

また、NoSQLも同様にKVS以外にも様々な種類があります
また、RDBの場合はSQLを使ってデータ操作(取得・登録・更新・削除)を行いますが、KVSの場合はSQLは使いません。
名前(key-value store)の通り、keyに対応するvalueを保存しているだけの単純な構造をしているため、keyを使ってデータ操作を行うだけです。

その意味では、RDBよりは仕組みを理解しやすいとも言えるでしょう。
関連記事:SQLの基礎の基礎の基礎についてまとめてみた【初心者向け】
KVSのメリットについて
KVSの主なメリットは以下です。
- 外部通信の負担を減らすことができる
- 高速にデータを読み書きすることができる
- シンプルな仕組みなので理解しやすい
外部通信の負担を減らすことができる
一般的なアプリの場合、DBサーバーや外部APIにアクセスすることも多いです。
そのときに、毎回それらにアクセスしていては、DBサーバーや外部APIの負荷が上がってしまいます。
特にDBサーバーの場合は、毎回重いクエリを投げてしまうとCPU負荷が上昇し障害に繋がる可能性もあるでしょう。
このような状況でKVSを使ってクエリの結果を保存しておけば、重いクエリを毎回実行する必要がないため、DBに対する負荷を軽減することができます。
要は、KVSが外部通信に対する緩衝材のような役割を果たせるのです。
高速にデータを読み書きすることができる
KVSの中でもRedisなどは「インメモリ型」のKVSです。
つまり、メインメモリ上で保存したデータを管理しています。
そのため、RDBのようにDBサーバーにアクセスするよりも高速にデータ操作を行うことが可能です。
データの取得速度が上がるということは、Webサイトの場合、「ページの表示速度」も向上するということです。
ページの表示速度は広告収益に直結する要素の一つでもあるため、ビジネスの収益的にもKVSを使うメリットは大きいと言えるでしょう。
シンプルな仕組みなので理解しやすい
KVSは「keyとvalueでデータを管理する」というシンプルな構造なので、非常に理解しやすいです。
SQLのように複雑なクエリを書く必要もないため、非常に勉強しやすいと言えるでしょう。
KVSのデメリットについて
KVSのデメリットについてもまとめてみます。
- コンテンツが即座に更新されない可能性がある
- 実装が複雑になる可能性がある
- 大容量のデータは扱えない
コンテンツが即座に更新されない可能性がある
KVSを使ってRDBから取得したデータを一定時間保存(キャッシュ)している場合、DBを更新してもコンテンツには即座に反映されない可能性があります。
また、気を付けないといけないのは、「HTMLをキャッシュしている場合」です。
例えば、Webページのデザインを変更したくて、HTMLとCSSを更新したとしましょう。
この場合、HTMLとCSSをリリースすると、CSSは即座に新規のコードが反映されます。
しかし、HTMLはKVSが保存しているため、以前の状態のままです。
そのため、HTMLとCSSのコードがマッチせずにデザイン崩れが生じる可能性があります。
もちろん、「HTMLをキャッシュする」というのは極端な例かもしれませんが、このような事故を招く可能性もあるため、「KVSにどんなデータを保存するか」はしっかりと考える必要があるでしょう。
実装が複雑になる可能性がある
KVSにデータを保存するということは、その処理を実装する必要があります。
そのため、場合によってはコードの行数が増えて可読性が低下したり、テストが複雑になる可能性もあるでしょう。
大容量のデータは扱えない
KVSの中でも例えばRedisなどはメモリ上で動作するため、気を付けないと大量にメモリを消費してしまう可能性があります。
そのため、大容量のデータを一度に取り扱うような処理はKVSでは行えません。
その辺りは若干の不便さがあるとも言えるでしょう。
KVSの種類について
KVSの代表的なものとしては、以下があります。
- Redis
- Memchached
ざっくり説明すると、Memchachedはシンプルな作りになっていて、Redisはより豊富な機能を揃えています。
詳しい比較は以下の記事が参考になるでしょう。
また、最近ではAWSやGCP等のクラウドベンダーもKVSのサービスを提供しています。
KVSを実際に触ってみよう【ハンズオン】
今回は、DockerのRedisコンテナを使って実際にKVS(Redis)を触ってみます。
最初に、Dockerをインストールしていない方はこちらからインストールを行ってください。
インストールが完了したら、以下のコマンドをターミナルで実行して下さい。
docker run --name redis-sample -d redis
これでDocker HubからRedisのイメージをpullし、なおかつ「redis-sample」という名前でコンテナも立ち上げることができます。
次に以下のコマンドで、作成したredis-sampleコンテナ内に入ります。
docker exec -it redis-sample bash
redis-sampleコンテナに入ったら、以下のコマンドでredis-cliを起動します。
redis-cli

この状態で、Redisに対してデータ操作(登録・更新・削除)を行ってみます。
まずはデータの登録です。以下のコマンド値をセットして下さい。
set testkey testvalue
valueはsetコマンドでセットできます。(setは大文字でも小文字でも同様に動作します)
testkeyがkeyで、testvalueがvalueです。
以下のようにOKと出力されたら登録処理は成功です。

この値が実際に登録できているかを確認してみましょう。
以下のコマンドを実行して下さい。
get testkey
「get key名」でvalueを取得できます。
valueが登録されていることを確認できました。

次に、この値を更新してみます。
更新は再度同じkeyで値をセットすればOKです。
以下のコマンドを実行して下さい。
set testkey testvalueupdate

以下のように更新できていることが確認できます。

次に、データの削除を行います。
データの削除はdelコマンドを使います。
以下のコマンドを実行して下さい。
del testkey

データが削除されていることが確認できます。

最後に、その他のredis-cliを使った操作をご紹介します。
まずはkeyの一覧を表示するコマンドです。
keyの一覧を確認するには、以下のコマンドを実行します。
keys *
データが登録してある場合、以下のようにkeyの一覧を確認できます。

最後に、全てのデータを削除したい場合です。
この場合は、以下のコマンドを実行します。
flushall

全てのデータを削除することができました。

ハンズオンは以上です。
Redisではこのようにredis-cliを使って簡単にデータの操作や確認を行うことができます。
今回紹介した以外にも様々な便利なコマンドが用意されているので、ぜひ調べて使ってみて下さい!
KVSとは?基礎をわかりやすく解説します:おわりに
今回は、KVSの基礎をご紹介しつつ、最後には実際のKVS(Redis)のデータ操作をしてみました。
少しでもKVSに対する理解を深めることができていたら幸いです。
最後まで読んで頂きありがとうございました。