go-redis/redis · error
GeoRadiusByMember does not support Store or StoreDist
Error message
GeoRadiusByMember does not support Store or StoreDist
What it means
GeoRadiusByMember uses the read-only GEORADIUSBYMEMBER_RO command and rejects Store/StoreDist (geo_commands.go:74-76). To persist results you must use the writing variant GeoRadiusByMemberStore.
Source
Thrown at geo_commands.go:75
cmd := NewIntCmd(ctx, args...)
if query.Store == "" && query.StoreDist == "" {
cmd.SetErr(errors.New("GeoRadiusStore requires Store or StoreDist"))
return cmd
}
_ = c(ctx, cmd)
return cmd
}
// GeoRadiusByMember queries a geospatial index for members within a distance from a member.
// This is a read-only variant that does not support Store or StoreDist options.
//
// Deprecated: Use GeoSearch with BYRADIUS and FROMMEMBER arguments instead as of Redis 6.2.0.
func (c cmdable) GeoRadiusByMember(
ctx context.Context, key, member string, query *GeoRadiusQuery,
) *GeoLocationCmd {
cmd := NewGeoLocationCmd(ctx, query, "georadiusbymember_ro", key, member)
if query.Store != "" || query.StoreDist != "" {
cmd.SetErr(errors.New("GeoRadiusByMember does not support Store or StoreDist"))
return cmd
}
_ = c(ctx, cmd)
return cmd
}
// GeoRadiusByMemberStore is a writing GEORADIUSBYMEMBER command.
func (c cmdable) GeoRadiusByMemberStore(
ctx context.Context, key, member string, query *GeoRadiusQuery,
) *IntCmd {
args := geoLocationArgs(query, "georadiusbymember", key, member)
cmd := NewIntCmd(ctx, args...)
if query.Store == "" && query.StoreDist == "" {
cmd.SetErr(errors.New("GeoRadiusByMemberStore requires Store or StoreDist"))
return cmd
}
_ = c(ctx, cmd)
return cmdView on GitHub (pinned to 36d97525cd)
Solutions
- Use client.GeoRadiusByMemberStore(...) for the writing form.
- Unset Store/StoreDist for a pure read.
- Prefer GeoSearchStore with FROMMEMBER on Redis >= 6.2.
Example fix
// before
client.GeoRadiusByMember(ctx, key, m, &redis.GeoRadiusQuery{Store: "dest"})
// after
client.GeoRadiusByMemberStore(ctx, key, m, &redis.GeoRadiusQuery{Store: "dest"}) Defensive patterns
Strategy: validation
Validate before calling
if query.Store != "" || query.StoreDist != "" {
return client.GeoRadiusByMemberStore(ctx, key, member, query)
}
return client.GeoRadiusByMember(ctx, key, member, query) Type guard
func isStoreQuery(q *redis.GeoRadiusQuery) bool {
return q.Store != "" || q.StoreDist != ""
} Try / catch
cmd := client.GeoRadiusByMember(ctx, key, m, query)
if err := cmd.Err(); err != nil && strings.Contains(err.Error(), "does not support Store") {
return client.GeoRadiusByMemberStore(ctx, key, m, query)
} Prevention
- Pair member+store intent with GeoRadiusByMemberStore.
- Migrate to GeoSearchStore(FROMMEMBER) on Redis >= 6.2.
When it happens
Trigger: Calling client.GeoRadiusByMember(ctx, key, member, &GeoRadiusQuery{Store: "dest"}) or with StoreDist set.
Common situations: Migrating from deprecated GEORADIUSBYMEMBER that allowed Store, or pairing a member query with persistence intent.
Related errors
- GeoRadius does not support Store or StoreDist
- GeoRadiusByMemberStore requires Store or StoreDist
- GeoRadiusStore requires Store or StoreDist
- redis: invalid timeseries aggregator: %d
- redis: at least one metric must be specified for HOTKEYS STA
AI-assisted analysis of go-redis/redis@36d97525cd (2026-08-06).
Data as JSON: /data/errors/dcd15272e7b6188e.json.
Report an issue: GitHub.