Redisエラー解決:(error) ERR wrong number of arguments for 'set' command

beginner🔴 Redis2026-07-20| Redis Server (全バージョン), redis-cli, Node.js (ioredis/node-redis), Python (redis-py), PHP (phpredis)

Error Message

(error) ERR wrong number of arguments for 'set' command
#redis#構文#コマンド#デバッグ#バックエンド

エラーのシナリオRedis CLIやアプリケーションのドライバーでコマンドを実行し、すぐにOKというレスポンスが返ってくることを期待しているとします。しかし、代わりにサーバーは構文エラーでリクエストをブロックします。

(error) ERR wrong number of arguments for 'set' command

これはRedisのバグではありません。コマンドシグネチャが厳格に適用されているだけです。SETコマンドで最もよく見られますが、引数の数がサーバーの期待値と一致しない場合、HSETRPUSHZADDでも同様のパターンが発生します。

根本的な原因:なぜRedisはコマンドを拒否するのかRedisのコマンドは位置引数に基づいています。標準的なSET操作では、エンジンは「キー」と「値」という正確に2つの主要な引数を期待します。1つしか指定しなかったり、正しいオプションフラグなしで3つ指定したりすると、パーサーは即座に失敗します。

よくあるミスの原因- 値の欠落: キーを渡したが、実際のデータペイロードを忘れている。- 引用符のないスペース: SET user:101 John Doeのような文字列を保存しようとした。Redisは"John"を値と見なし、"Doe"を不明な3番目の引数として認識します。- 不正な形式のフラグ: EX(有効期限)を含めたが、実際のTTL整数(例:3600)を指定し忘れている。- 空の変数: コード内で、文字列だと思っていた変数がnullundefinedになっており、クライアントライブラリが不完全なコマンドを送信している。## 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ユーティリティを使用するXADDZADDのような複雑なコマンドを扱う場合は、引数の数を推測しないでください。組み込みのヘルプツールを使用して、正確なシグネチャを確認してください:

HELP SET

出力には、期待されるパターンが表示されます:SET key value [NX|XX] [GET] [EX seconds|PX milliseconds...]keyvalueは必須であり、ブラケット([])内のものはすべてオプションですが、特定の二次的な値が必要であることに注意してください。

アプリケーションのロジックを修正する### 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>が最大の味方です。

Related Error Notes