エラーのシナリオRedis CLIやアプリケーションのドライバーでコマンドを実行し、すぐにOKというレスポンスが返ってくることを期待しているとします。しかし、代わりにサーバーは構文エラーでリクエストをブロックします。
(error) ERR wrong number of arguments for 'set' command
これはRedisのバグではありません。コマンドシグネチャが厳格に適用されているだけです。SETコマンドで最もよく見られますが、引数の数がサーバーの期待値と一致しない場合、HSET、RPUSH、ZADDでも同様のパターンが発生します。
根本的な原因:なぜRedisはコマンドを拒否するのかRedisのコマンドは位置引数に基づいています。標準的なSET操作では、エンジンは「キー」と「値」という正確に2つの主要な引数を期待します。1つしか指定しなかったり、正しいオプションフラグなしで3つ指定したりすると、パーサーは即座に失敗します。
よくあるミスの原因- 値の欠落: キーを渡したが、実際のデータペイロードを忘れている。- 引用符のないスペース: SET user:101 John Doeのような文字列を保存しようとした。Redisは"John"を値と見なし、"Doe"を不明な3番目の引数として認識します。- 不正な形式のフラグ: EX(有効期限)を含めたが、実際のTTL整数(例:3600)を指定し忘れている。- 空の変数: コード内で、文字列だと思っていた変数がnullやundefinedになっており、クライアントライブラリが不完全なコマンドを送信している。## Redis CLIでのクイックフィックス### 1. スペースを含む文字列を引用符で囲むRedis CLIは引数の区切りにスペースを使用します。値にスペースが含まれる場合は、Redisが単一の文字列として扱うように、二重引用符または一重引用符で囲む必要があります。
# Redisが合計4つの引数として認識するため、これは失敗します SET session_id_99 active user_logged_in # 結果: (error) ERR wrong number of arguments for 'set' command # これは機能します: Redisは 'set'、キー、そして完全な文字列値を認識します SET session_id_99 "active user_logged_in"
2. HELPユーティリティを使用するXADDやZADDのような複雑なコマンドを扱う場合は、引数の数を推測しないでください。組み込みのヘルプツールを使用して、正確なシグネチャを確認してください:
HELP SET
出力には、期待されるパターンが表示されます:SET key value [NX|XX] [GET] [EX seconds|PX milliseconds...]。keyとvalueは必須であり、ブラケット([])内のものはすべてオプションですが、特定の二次的な値が必要であることに注意してください。
アプリケーションのロジックを修正する### Python (redis-py)Pythonでは、通常ライブラリが引数の数を処理してくれます。しかし、文字列が必要な場所にNoneを渡すと、ロジックエラーによってこのエラーが発生することがあります。
import redis r = redis.Redis(host='localhost', port=6379, db=0) # 問題: 引数を1つしか渡していない # r.execute_command('SET', 'my_key') # これがエラーを引き起こします # 解決策: 常にキーと値を指定する r.set("api_status", "online") r.set("cache_key", "data", ex=300) # 'ex' は EX フラグと 300 という値を正しく追加します
Node.js (ioredis / node-redis)Node.jsの開発者は、非同期データを扱う際によくこのエラーに遭遇します。変数がundefinedの場合、クライアントは引数を完全に省略してしまうことがあります。
const Redis = require("ioredis"); const redis = new Redis(); const userId = "user:500"; let profileData; // これは現在 undefined です // 'profileData' が引数リストから消えるため、これは失敗します // await redis.set(userId, profileData); // 修正: フォールバックを提供するか、存在を確認する await redis.set(userId, profileData || "{}");
PHP (phpredis)PHPでは、変数が初期化されていることを確認してください。未初期化の変数を渡すと、エラーレポートの設定によっては引数が空になる可能性があります。
$redis = new Redis(); $redis->connect('127.0.0.1', 6379); $key = "site_notice"; $message = get_message_from_db(); // これが null または false を返す場合... // ...この呼び出しはサーバーに無効な数の引数を送信する可能性があります $redis->set($key, $message); // より安全なアプローチ: if ($message) { $redis->set($key, $message); }
検証手順構文を調整したら、次の手順に従って修正が有効であることを確認します:
- CLIでの手動テスト:
redis-cliで正確なコマンドを実行します。OKが返ってくるなら、問題はサーバーの設定ではなく、間違いなくアプリケーションのロジックにあります。- 型チェック:TYPE your_keyを使用して、すでにリストやハッシュが含まれているキーに対してSETを使用しようとしていないか確認します。- 通信の監視: アプリを実行している間、別のredis-cliウィンドウでMONITORを実行します。送信されている正確な生のコマンドが表示されるため、引数が欠落しているかどうかが一目瞭然になります。## まとめERR wrong number of argumentsエラーは、送信した「文章」が文法的に正しくないことをRedisが伝えているだけです。CLIで文字列を引用符で囲み、SETを呼び出す前にアプリケーションの変数がnullでないことを検証することで、このエラーを完全に排除できます。迷ったときは、HELP <command>が最大の味方です。

