Node.jsでメモリキャッシュを使いたいです。
▼ メモリキャッシュが必要になる場面
- アクセスの多いデータをキャッシュしたい
- MySQLのクエリ結果をキャッシュしたい
- 少しでもNode.jsを高速に動作させたい
主に高速化と負荷軽減のためです。
そのために色々モジュールなど試したので、
Node.jsでのメモリキャッシュをまとめました。
このページの目次
メモリキャッシュ系モジュールは種類が豊富
最初に迷ったのがどのモジュールを選ぶか。
意外と選択肢が多いから迷います。
▼ 把握してるだけでも3つある
- ptarjan/node-cache
- tcs-de/nodecache
- mape/node-caching
選択肢が多いから何を選ぶべきなのか、
どれが一番いいのかを決めるのが難しいです。
だから色々使って試してみました。
一番優秀なのはnode-cacheモジュール
結論としては次のライブラリが一番良かったです。
▼ node-cache
https://github.com/node-cache/node-cache
▼ 良かったと思った理由
- キー => 値でキャッシュするシンプルさ
- 配列/オブジェクトもキャッシュできる
- 個別にTTL(有効期限)が指定できる
- キャッシュの最大上限数を指定できる
- 削除時のイベントトリガーにも対応してる
挙げてけばキリがないけど以上の点。
AWSとかの環境ではメモリが有限であるため、キャッシュの最大上限数が指定できるのは大きいです。この機能が他モジュールにはなかった…
ということでnode-cahceに決定。
プロジェクトにnode-cacheをインストール
ではnode-cacheをnpmからインストールします。
1 |
$ npm install node-cache |
ライセンスもMITライセンスなので安心です。
早速データのメモリキャッシュを試してみる
それでは適当にメモリキャッシュしてみます。
※ Node.js + Express の場合
▼ 基本的なメモリキャッシュのやり方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
const express = require('express'); /// NodeCahceを生成 const NodeCache = require( "node-cache" ); const nodeCache = new NodeCache(); const app = express(); /// HTTPリクエスト受け取り app.use(function(req, res, next) { /// キャッシュキー const key = 'hogeKey'; /// キャッシュを取得(ないならundefined) let value = nodeCache.get(key); if(value == undefined){ /// キャッシュするデータを取得。 /// 例1 : MySQLクエリのキャッシュ /// 例2 : レスポンスの結果 value = {'id':1, 'name':'hoge'}; /// TTL = 有効期限(秒) const ttl = 24*60*60; /// データをキャッシュする const success = nodeCache.set(key,value,ttl); console.log('success : ', success) /// => success : true } /// レスポンス返す res.status(200).json({value}); }); |
何をしてるかはコメントを見れば分かります。
先ほど書いたように KEY => VALUE のようにシンプルな形式であり、値・オブジェクト・配列などをキャッシュできます。TTLは秒単位の有効期限で、それが過ぎるとメモリから自動削除されます。
キャッシュキーが存在しないなら nodeCache.get(key) の返り値は undefined になるため、 nodeCache.set(key,value,ttl) でキャッシュ設定すればOKです。
とても単純明快で使いやすい。
メモリキャッシュの最大上限数も設定可能
個人的に便利だなと思うのがこの機能
メモリキャッシュの最大上限数の制限
例えば最大数を10000個にしたいとします。
▼ NodeCache生成時に指定するコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
const NodeCache = require( "node-cache" ); const nodeCache = new NodeCache({ /// 最大キャッシュ上限数を設定 maxKeys: 10000 }); /// 最大上限設定時の注意点。 /// 上限を超えるとエラーなので例外処理 try{ value = {'id':1, 'name':'hoge'}; const ttl = 24*60*60; const success = nodeCache.set(key,value,ttl); console.log('success : ', success); }catch(err){ console.error(err); } |
上記コードみたいにNodeCacheにはオプションとして maxKeys が渡せます。これはEC2みたいなメモリが限られる環境なんかで役立ちますね。
ただし最大上限数を越えると「Cache max keys amount exceeded...」のようなエラーが出るため、キャッシュ設定時は例外処理するべきです。
それ以外は注意点はありません。
メモリ消費量を把握することもできる
今どのくらいメモリを消費してるのかな?
というメモリ情報も取得することが可能です。
▼ メモリ情報取得のコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/// 100個のキャッシュ for(let i=0; i<100; ++i){ const key = 'key'+i; try{ const value = {key,i}; nodeCache.set(key,value); }catch(err){ console.error(err); } } /// 統計情報を表示 const stats = nodeCache.getStats(); console.log('Statistics : ', stats); |
▼ 上記の例ならこういう結果が表示される
1 2 3 4 5 6 7 8 9 10 11 12 |
{ hits: 0, /// 参照された回数(?) misses: 0, /// メモリから消去された個数 keys: 100, /// キーの総数 ksize: 490, /// キーのメモリ消費bytes vsize: 16000 /// 値のメモリ消費bytes } |
メモリ使用量が一目で見れるから便利です。
以上、Node.jsにメモリキャッシュ導入でした。
高速化・処理速度アップにつながります。
Node.js高速化に役立つ関連記事
最後にNode.jsの高速化の関連記事の紹介です。
▼ Node.jsでのgzip圧縮配信を有効にする手順【転送量削減】
もしかしたら役立つかもしれません。
必要になったらご覧ください。