Redisに限界までメモリーにデータを保存したあと、新たにデータを追加したらどうなるか知りたくなったので確認してみた。
その結果、(有効期限の設定がない場合)データを追加できなくなりました。
この記事では、データの追加ができなくなることを検証した方法を解説します。
検証した方法
実際にデータを追加できないことを検証した方法を示します。
(1)RedisをLinux環境にインストールする
(2)PHPからRedisにアクセスするためライブラリー phpredisをインストール
(3)Redisを起動する
(4)PHPで以下のようなテストコードを作成して、データを追加する。
//Redisの動作テスト用のプログラム
//1キーに1MB書き込むサンプルプログラム
// 注意 事前に「php -m」をして「redis」が組み込まれているか確認すること
//Redis用のモジュールが入っているか確認
if(!class_exists('Redis')) return;
//Redisに接続する
$redis = new Redis();
//ホスト,ポート、タイムアウト時間を設定
if(!$redis->connect("sample.amazonaws.com",6379,1000)){
echo "接続失敗";
return;
}
//1MB分のデータ生成
$testData = "";
$maxdata = 1*1024*1024;
for($i = 0; $i < $maxdata; $i++){
$testData = $testData . "a";
}
//1000個分のデータを書き込む
for($i = 0; $i < 1000; $i++){
$key = "key_{$i}" ;
//$redis->hSet("memtest",$key ,$testData);
$code = $redis->set($key ,$testData);
//code =1以外は、書き込み失敗
echo "追加したキー " . $key . " status:" . $code . PHP_EOL;
}
テストコードの解説:
・1keyあたりに1Mほどのデータを追加する。
・データ追加をひたすら行う(コードでは1000回としています)
(5)(4)のプログラムを実行してひたすらデータを追加登録する
(6)その結果、メモリの限界(redisの設定ファイルmaxmemoryで設定した値)のところでデータが追加できないことを確認した。
コードの例では「$code==1」以外は追加登録の失敗の意味になります。
$code = $redis->set($key ,$testData);
この結果、メモリの限界のところで、公式サイトに書いてあるとおりデータを追加できないことを確認取れました。
本家のドキュメントにも以下のように書いてあります
maxmemory(bytes)
指定された量以上のメモリを使用しなくなります。Redisは、メモリ使用量の限界に達すると、 EXPIRE されたセットのキーを削除しようとします。キーを開放しようとします。また、少しで期限が切れそうなキーや、長い間維持されてきたキーを削除しようとします。可能であれば、フリーのリストのオブジェクトも可能であれば削除しようとします。
もしこれらがすべて失敗した場合には、 SET や LPUSH などの、メモリを使用するコマンドに対してエラーを返すようになります。 GET などの読み込み専用のコマンドは引き続き処理可能です。
出典
indexnext |previous |redis 2.0.3 documentation 設定ファイル¶
まとめ
いかがですか?
保存したデータは有効期限を設定しない限り消えないことがわかりました。
逆に入れば、キャッシュしたデータをいつ消すのか、データの生存期間を考えないと、データは満タンになってしまうとも言えます。
よってRedisを使うときは以下のことを考慮する必要があると言えます。
・キャッシュしたデータは消さないとずっと残り続けるので、有効期間決めること。
・データが保存できなかったときのエラー処理(キャッシュできなかったものは直接DBに保存する、エラーログを出力するなど)も実装すること
・データをいつまで残すのか設計の段階で決めておくこと