注目キーワード

PHPにてRedisに限界までデータを登録したあと、データ追加したときの挙動を確認してみた

Redisの限界までデータを追加した結果

 

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 設定ファイル¶

http://redis.shibu.jp/admin/config.html

 

 

 

まとめ

いかがですか?

保存したデータは有効期限を設定しない限り消えないことがわかりました。

 

逆に入れば、キャッシュしたデータをいつ消すのか、データの生存期間を考えないと、データは満タンになってしまうとも言えます。

 

よってRedisを使うときは以下のことを考慮する必要があると言えます。

・キャッシュしたデータは消さないとずっと残り続けるので、有効期間決めること。

・データが保存できなかったときのエラー処理(キャッシュできなかったものは直接DBに保存する、エラーログを出力するなど)も実装すること

・データをいつまで残すのか設計の段階で決めておくこと