Redis Open Source 8.4 release notes
===================================

--------------------------------------------------------------------------------
Upgrade urgency levels:

LOW:      No need to upgrade unless there are new features you want to use.
MODERATE: Program an upgrade of the server, but it's not urgent.
HIGH:     There is a critical bug that may affect a subset of users. Upgrade!
CRITICAL: There is a critical bug affecting MOST USERS. Upgrade ASAP.
SECURITY: There are security fixes in the release.
--------------------------------------------------------------------------------

The release notes contain PRs from multiple repositories:

#n - Redis (https://github.com/redis/redis)
#Qn = Query Engine (https://github.com/RediSearch/RediSearch)
#Jn = JSON (https://github.com/RedisJSON/RedisJSON)
#Tn = Time Series (https://github.com/RedisTimeSeries/RedisTimeSeries)
#Pn = Probabilistic (https://github.com/RedisBloom/RedisBloom)

===========================================================
8.4 GA (v8.4.0)    Released Tue 18 Nov 2025 15:00:00 IST
===========================================================

This is the General Availability release of Redis 8.4 in Redis Open Source.

### Major changes compared to 8.2

- `DIGEST`, `DELEX`; `SET` extensions - atomic compare-and-set and compare-and-delete for string keys
- `MSETEX` - atomically set multiple string keys and update their expiration
- `XREADGROUP` - new `CLAIM` option for reading both idle pending and incoming stream entries
- `CLUSTER MIGRATION` - atomic slot migration
- `CLUSTER SLOT-STATS` - per-slot usage metrics: key count, CPU time, and network I/O
- Redis query engine: `FT.HYBRID` - hybrid search and fused scoring
- Redis query engine: I/O threading with performance boost for search and query commands (FT.*) 
- I/O threading: substantial throughput increase (e.g. >30% for caching use cases (10% `SET`, 90% `GET`), 4 cores)
- JSON: substantial memory reduction for homogeneous arrays (up to 91%)

### Binary distributions

- Alpine and Debian Docker images - https://hub.docker.com/_/redis
- Install using snap - see https://github.com/redis/redis-snap
- Install using brew - see https://github.com/redis/homebrew-redis
- Install using RPM - see https://github.com/redis/redis-rpm
- Install using Debian APT - see https://github.com/redis/redis-debian

### Operating systems we test Redis 8.4 on

- Ubuntu 22.04 (Jammy Jellyfish), 24.04 (Noble Numbat)
- Rocky Linux 8.10, 9.5
- AlmaLinux 8.10, 9.5
- Debian 12 (Bookworm), Debian 13 (Trixie)
- macOS 13 (Ventura), 14 (Sonoma), 15 (Sequoia)

### Bug fixes (compared to 8.4-RC1)

- #14524 `XREADGROUP CLAIM` returns strings instead of integers
- #14529 Add variable key-spec flags to SET IF* and DELEX
- #P928 Potential memory leak (MOD-11484)
- #T1801, #T1805 macOS build failures (MOD-12293)
- #J1438 `JSON.NUMINCRBY` - wrong result on integer array with non-integer increment (MOD-12282)
- #J1437 Thread safety issue related to ASM and shared strings (MOD-12013)

### Performance and resource utilization improvements (compared to 8.4-RC1)

- #14480, #14516 Optimize `XREADGROUP`

### known bugs and limitations

- When executing `FT.SEARCH`, `FT.AGGREGATE`, `FT.CURSOR`, `FT.HYBRID`, `TS.MGET`, `TS.MRANGE`, `TS.MREVRANGE` and `TS.QUERYINDEX` while an atomic slot migration process is in progress, the results may be partial or contain duplicates
- `FT.PROFILE`, `FT.EXPLAIN` and `FT.EXPLACINCLI` doesn’t contain the `FT.HYBRID` option
- Metrics from `FT.HYBRID` command aren’t displayed on `FT.INFO` and `INFO`
- Option `EXPLAINSCORE`, `SHARD_K_RATIO`, `YIELD_DISTANCE_AS` and `WITHCURSOR` with `FT.HYBRID` are not available
- Post-filtering (after `COMBINE` step) using FILTER is not available
- Currently the default response format considers only `key_id` and `score`, this may change for delivering entire document content

===========================================================
8.4-RC1 (v8.3.240)    Released Tue 4 Nov 2025 10:00:00 IST
===========================================================

This is the first Release Candidate of Redis 8.4 in Redis Open Source.

Release Candidates are feature-complete pre-releases. Pre-releases are not suitable for production use.

### Binary distributions

- Alpine and Debian Docker images - https://hub.docker.com/_/redis
- Install using snap - see https://github.com/redis/redis-snap
- Install using brew - see https://github.com/redis/homebrew-redis
- Install using RPM - see https://github.com/redis/redis-rpm
- Install using Debian APT - see https://github.com/redis/redis-debian

### Operating systems we test Redis 8.4 on

- Ubuntu 22.04 (Jammy Jellyfish), 24.04 (Noble Numbat)
- Rocky Linux 8.10, 9.5
- AlmaLinux 8.10, 9.5
- Debian 12 (Bookworm), Debian 13 (Trixie)
- macOS 13 (Ventura), 14 (Sonoma), 15 (Sequoia)

### New Features (compared to 8.2.3)

- #14414 New command: `CLUSTER MIGRATION` - atomic slot migration
- #14435 New commands: `DELEX`, `DIGEST`; `SET` extensions - atomic compare-and-set and compare-and-delete for string keys
- #14434 New command: `MSETEX` - set multiple keys and update their expiration
- #14402 `XREADGROUP` - add `CLAIM min-idle-time` to consume both idle pending entries and incoming entries
- #14058 Add auto-repair options for broken AOF tail on startup
- #14296 Support decoding JSON empty array as a Lua array
- #T1773 `HELP` and `COMMAND DOCS` now support time series commands (MOD-8133)
- #P892 `HELP` and `COMMAND DOCS` now support probabilistic commands (MOD-8133)
- #Q7076, #Q6857 New Command: `FT.HYBRID` - hybrid queries with RRF and LINEAR combination 
- #Q7022 Support index updates when atomic slot migrations occurs
- #Q6313 Support multiple I/O threads for RQE cluster manager - Coordinator (MOD-10562)

### Bug fixes (compared to 8.2.3)

- #14423 Potential infinite loop when a stream is corrupted
- #14420 Shutdown blocked client not being properly reset after shutdown cancellation
- #14417 `CLUSTER FORGET` - heap-buffer-overflow
- #14415 Potential crash in `lookupKey()` when `executing_client` is NULL
- #T1776 Potential crash on `TS.RANGE` with `ALIGN +`, `AGGREGATION twa` and `EMPTY` (MOD-11620, MOD-10484)

### Performance and resource utilization improvements (compared to 8.2.3)

- #14440 Lookahead prefetching - parse multiple commands in advance through a lookahead pipeline
- #14309 Optimize `BITCOUNT` with AVX2 and AVX512 popcount implementations
- #14227 Optimize `BITCOUNT` with Arm Neon SIMD vectorization
- #14428 Optimize HyperLogLog with branchless comparisons and Arm Neon SIMD vectorization
- #14222 Optimize Vector set `VADD` and `VSIM` with AVX2 and AVX512 dot product implementations
- #JIJSON9 JSON - memory footprint improvement by using homogeneous arrays (MOD-9511)
- #JIJSON7 JSON - memory footprint improvement by inlining short strings (MOD-9511)

### Configuration parameters

- #14058 `aof-load-corrupt-tail-max-size` - maximum corrupted tail size (in bytes) to attempt to repair automatically
- #14296 `decode_array_with_array_mt` - Lua: control how empty JSON arrays are handled
- #14440 `lookahead` - runtime-configurable lookahead depth (default: 16)
- #Q7065 `search-default-scorer` - default text and tag scorer (new default is BM25STD)
- #Q6769 `search-on-oom` - behavior when OOM event occurs in the query time, supports 3 values:
  - `IGNORE` - queries run despite OOM, not recommended for heavy result sets (current behaviour)
  - `FAIL` - query execution fails if any node is in OOM state at start
  - `RETURN` - returns partial results if OOM is detected in only some cluster nodes (default)
- #Q6313 `search-io-threads` - allow setting the comms threads used by the cluster manager - coordinator (default: 20)

### known bugs and limitations

- When executing `FT.SEARCH`, `FT.AGGREGATE`, `FT.CURSOR`, `FT.HYBRID`, `TS.MGET`, `TS.MRANGE`, `TS.MREVRANGE` and `TS.QUERYINDEX` while an atomic slot migration process is in progress, the results may be partial or contain duplicates
- `FT.PROFILE`, `FT.EXPLAIN` and `FT.EXPLACINCLI` doesn’t contain the `FT.HYBRID` option
- Metrics from `FT.HYBRID` command aren’t displayed on `FT.INFO` and `INFO`
- Option `EXPLAINSCORE`, `SHARD_K_RATIO`, `YIELD_DISTANCE_AS` and `WITHCURSOR` with `FT.HYBRID` are not available
- Post-filtering (after `COMBINE` step) using FILTER is not available
- Currently the default response format considers only `key_id` and `score`, this may change for delivering entire document content

