Redisはメモリベースのデータストレージであるため、メモリ管理がシステムのパフォーマンスに重要な影響を与える。データをメモリに積み続けるとメモリ不足の問題が発生する可能性がある。このポストでは、Redisのメモリ管理とパフォーマンス最適化のための主要な設定と方法を見ていく。

1. Redisメモリ管理の重要性

Redisはすべてのデータをメモリに保存し、迅速に処理する。大量のデータを保存したり、継続的に書き込み作業が発生すると、メモリ不足によってパフォーマンスが低下する可能性がある。このような問題を防ぐために、Redisはmaxmemorymaxmemory-policy設定を提供している。

Redis memory management infographic

2. メモリ制限設定: maxmemory

最大メモリ使用量を制限するにはmaxmemoryを設定する。この設定により、Redisが使用するメモリの容量を明確に指定できる。maxmemoryの設定がない場合は、システムメモリの許容範囲まで使用できる。

maxmemory 256mb  # 例: 256MBに設定

上記の設定を通じて指定されたメモリの上限を超えると、Redisはデータ削除ポリシーに従って古いデータを自動的に削除することができる。

3. メモリ削除ポリシー設定: maxmemory-policy

メモリ制限を超えた際に削除すべきデータを決定するポリシーがmaxmemory-policyである。Redisはさまざまな削除ポリシーを提供しており、主要なオプションは次の通りである:

  • noeviction: 新しいデータの保存を拒否し、データ損失を最小化
  • allkeys-lru: すべてのキーの中から最も長い間使用されていないキーを削除し、キャッシュ用途に適している
  • volatile-lru: 有効期限が設定されているキーの中から最も長い間使用されていないキーを削除
  • allkeys-random: すべてのキーの中から任意にデータを削除
  • volatile-ttl: 残りの有効期限が最も短いキーを削除

例えば、すべてのキーの中から古いデータを削除するLRUポリシーを設定するには、次のように設定する。

maxmemory-policy allkeys-lru

4. メモリ最適化設定: maxmemory-samples

maxmemory-samplesオプションは、メモリポリシーを適用する際に削除するデータをサンプリングする数を設定し、デフォルト値は5である。サンプリング数を増やすと、より正確なポリシーが適用されるが、CPUリソースを多く消費する可能性がある。

maxmemory-samples 5

5. データ圧縮と削除のためのTTL設定

Redisは各キーにTTL(有効期限)を設定でき、特定のキーが期限切れになると自動的に削除されてメモリを空ける。セッション管理やキャッシュデータに有用である。

EXPIRE <key> <seconds>  # 例: session_dataを1時間後に期限切れに

TTLが設定されたデータは、時間が経つと自動的に削除されるため、メモリの節約に効果的である。

6. メモリモニタリングとパフォーマンスチェックコマンド

Redisはメモリの状態をモニタリングし、パフォーマンスをチェックするためのコマンドを提供する。

  • INFO memory: 全体のメモリ使用量を確認
  • MEMORY USAGE <key>: 特定のキーのメモリ使用量を確認
  • MEMORY STATS: 詳細なメモリ統計を提供
  • SLOWLOG: 時間がかかるコマンドを確認することでパフォーマンスチェックが可能
redis-cli INFO memory
redis-cli MEMORY USAGE session_data
redis-cli SLOWLOG GET

7. 実践例: キャッシュデータと作業キューのためのRedisメモリ最適化

Redisでキャッシュデータ用途にallkeys-lruポリシーを使用して古いデータを自動で削除できる。一方、作業キューのようにデータ保全が重要な場合は、noevictionポリシーを設定し、AOF(Append-Only File)機能を使用してデータ復旧が可能なように設定できる。

maxmemory 256mb
maxmemory-policy allkeys-lru  # キャッシュデータに適している

appendonly yes
appendfsync everysec
maxmemory-policy noeviction  # 作業キューに適している

まとめ

Redisのメモリ管理とパフォーマンス最適化の方法を見てきた。Redisはメモリベースのデータベースであるため、メモリ管理設定が重要であり、これによってパフォーマンスとデータ保全を調整することができる。次回はDockerを使用してRedisコンテナを運営する方法を扱う。Redisを独立したコンテナとして設定し、効率的なデータ保全とパフォーマンスを維持する方法を見ていこう。