redis/go-redis · error

redis: got elements in the VSIM array, wanted a multiple of…

Error message

redis: got %d elements in the VSIM array, wanted a multiple of 3

What it means

VSIM replies parsed into VectorScoreAttrib values contain name/score/attribute triples, so the array length must be a multiple of 3. Any other count means the reply shape does not match the requested options and parsing fails immediately.

Solutions

  1. Confirm the server supports attributes in VSIM replies and is not silently dropping them (redis-cli VSIM ... WITHSCORES WITHATTRIBS).
  2. Use RESP3 (Protocol: 3) so the reply structure is explicit.
  3. Upgrade go-redis and the Redis server to matching current versions.
  4. If only scores are needed, switch to the score-only variant so a 2-field reply parses correctly.

Example fix

// before: server drops attribs -> 2 fields per element vs expected 3
res, err := rdb.VSimWithScoresAttrib(ctx, "pts", vector)
// redis: got 6 elements in the VSIM array, wanted a multiple of 3

// after: match the parser to the actual reply shape
res, err := rdb.VSimWithScores(ctx, "pts", vector)
Defensive patterns

Strategy: try-catch

Validate before calling

raw, _ := rdb.Do(ctx, "VSIM", "pts", vec, "WITHSCORES", "WITHATTRIBS").Result()
_ = raw // confirm 3 fields per element in the reply

Try / catch

cmd := rdb.VSimWithScoresAttrib(ctx, "pts", vec)
if err := cmd.Err(); err != nil {
    if strings.Contains(err.Error(), "wanted a multiple of 3") {
        // degrade to VSimWithScores (2 fields) or raw parsing
    }
    return err
}

Prevention

When it happens

Trigger: Calling VSIM with both WITHSCORES and WITHATTRIBS (the tri-field parser at command.go:~8923) and receiving an array whose length is not divisible by 3.

Common situations: Server returning fewer fields per element (e.g. attribs dropped for large attributes) causing arity mismatch; version skew between client expectations and server vector-set implementation; proxies altering the reply.

Related errors


AI-assisted analysis of redis/go-redis@c5cad058c7 (2026-09-01). Data as JSON: /api/errors/9ab4dee9d2fe53f5. Report an issue: GitHub.

Appendix: source

Thrown at command.go:8923

			score, err := rd.ReadFloat()
			if err != nil {
				return err
			}
			attrib, err := readVectorAttribStringOrNil(rd)
			if err != nil {
				return err
			}
			cmd.val[i] = VectorScoreAttrib{Name: name, Score: score, Attribs: attrib}
		}
		return nil
	}

	n, err := rd.ReadArrayLen()
	if err != nil {
		return err
	}
	if n%3 != 0 {
		return fmt.Errorf("redis: got %d elements in the VSIM array, wanted a multiple of 3", n)
	}
	cmd.val = make([]VectorScoreAttrib, n/3)
	for i := range cmd.val {
		name, err := rd.ReadString()
		if err != nil {
			return err
		}
		score, err := rd.ReadFloat()
		if err != nil {
			return err
		}
		attrib, err := readVectorAttribStringOrNil(rd)
		if err != nil {
			return err
		}
		cmd.val[i] = VectorScoreAttrib{Name: name, Score: score, Attribs: attrib}
	}
	return nil

View on GitHub (pinned to c5cad058c7)