Redis Open Source 8.8 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)


=================================================================
Redis 8.8-M02 (v8.7.225)    Released Thu 16 Apr 2026 16:00:00 IST
=================================================================

This is the second Milestone of Redis 8.8 in Redis Open Source.

Milestones are non-feature-complete pre-releases. Pre-releases are not suitable for production use.

### Headlines:

Redis 8.8 introduces new features and performance improvements.

8.8-M02 is available as a Docker image and can be downloaded from [Docker Hub](https://hub.docker.com/_/redis). Additional distributions will be introduced in upcoming pre-releases.

### Operating systems we test Redis 8.8 on

- Ubuntu 22.04 (Jammy Jellyfish), 24.04 (Noble Numbat), 26.04 (Resolute Raccoon)
- Rocky Linux 8.10, 9.7, 10.1
- AlmaLinux 8.10, 9.7, 10.1
- Debian 12.13 (Bookworm), Debian 13.4 (Trixie)
- Alpine 3.23
- macOS 14.8.4 (Sonoma), 15.7.4 (Sequoia), 26.3 (Tahoe) - for both Intel and ARM

### New Features (compared to 8.6)

- #14826, #14905 GCRA (generic cell rate algorithm) rate limiter (based on the redis-cell module by @brandur - thank you!)
- #14797 `XNACK`: a new streams command that allows consumers to explicitly release pending messages
- #J1509 `JSON.SET`: new `FPHA` argument to specify the FP type for homogeneous FP arrays (MOD-13577)
- #14892 `ZUNION`, `ZINTER`, `ZUNIONSTORE`, `ZINTERSTORE`: new `COUNT` aggregator
- #T1916 `TS.RANGE`, `TS.REVRANGE`, `TS.MRANGE`, `TS.MREVRANGE`: multiple aggregators in a single command (MOD-9162)

### Bug fixes (compared to 8.6.2)

- #15037 `XINFO STREAM`: wrong value in the per-slot memory tracking
- #12000 Incorrect shrinking of querybuf when client is reading a big argv
- #15021 `HEXPIRE`: overflow on fields count
- #14963 `XREADGROUP`: consumer replication inconsistency
- #15011 Double-free in rdbLoadObject
- #14667, #14886 Potential TCP stalls/deadlocks
- #14942 Fix `COMMAND GETKEYS for PFMERGE` with no source keys
- #14888 Hardens safety check in `lpSafeToAdd`
- #14748 Ensure sensitive user data is not exposed in logs when `hide_user_data_from_log` is enabled
- #14877 `INFO KEYSIZES` and INFO ALLOCSIZES` fixes
- #14878 listpack memory leak in zipmap-to-hash conversion on error path
- #14955 Streams: IDMP-related bug
- #14974, #14932, #14866 Memory leaks
- #14790 Missing initialization
- #14789 DB hash tables not expanding during RDB load on standalone-mode
- #14785 Add `HOTKEYS HELP` subcommand (Each command having subcommands needs a `HELP` subcommand)
- #14784 `RESTORE` and `SET`: `expiredkeys` counter updates incorrectly on keys with past expiration time
- #14779 Accurate memory accounting for RedisModuleDict (instead of estimation)
- #14774 Missing cleanup code in `getKeysFreeResult()` on cross-slot error path
- #14771 Potential unsigned integer underflow in `used_memory_dataset calculation`
- #14780 Fixed name of `HOTKEYS` results field `sampled-command-selected-slots-us` to `sampled-commands-selected-slots-us`
- #14756 `HOTKEYS` does not track each command in a `MULTI`/`EXEC` block
- #14749 Fixed `HOTKEYS GET` RESP3 reply fixed to map instead of flat array
- #J1520 Numeric operations on homogeneous arrays: promote to next type if results overflow (MOD-14427)
- #J1519 `JSON.NUMINCRBY`, `JSON.NUMMULTBY` don’t error on numeric overflow (MOD-14191)
- #J1487 Depth limit (128) was not fully enforced (MOD-4107)
- #T1910 `TS.INCRBY`, `TS.DECRBY` create key before validating args (MOD-8167)
- #T1908 Potential crash on `TS.RANGE` with aggregation and `EMPTY`
- #T1896 Potential memory leak (MOD-13438)
- #T1913 ACL rules are not fully enforced for multi-key commands on a cluster setup (MOD-14124)

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

- #15003 Reduce overhead in command propagation
- #14979 Dismiss dict bucket arrays in fork child to reduce CoW
- #14661 Replace fast_float C++ library with pure C implementation
- #14928 Disable memory tracking in child processes
- #14885 Optimize rax (radix tree) insert and lookup for sequential key patterns
- #14335 Handle primary/replica clients in I/O threads
- #14754 Optimize prefetching commands
- #14770 Optimize `BITOP` operations with AVX512
- #14862 Streams: Filter expired IDMP entries during RDB save and load
- #14750 `SFLUSH` can now flush slots partially
- #14887 `SFLUSH` skips slot trimming when the requested slot ranges exactly match the node’s local slot coverage
- #14851 Skip RDB checksum computation/validation during diskless full synchronization to reduce CPU overhead
- #14783 Pause dict auto-resize during multi-field deletion
- #1884 `TS.RANGE`, `TS.REVRANGE`, `TS.MRANGE`, `TS.MREVRANGE`: improve performance on a cluster setup (RED-184104)
- #T1866 Register to `type_changed` KSN instead of `set` (MOD-12919)

### Modules API

- #14445 Allow modules to associate metadata with keys
  - `RedisModule_CreateKeyMetaClass` - define a new key-metadata class
  - `RedisModule_ReleaseKeyMetaClass` - release a key-metadata class
  - `RedisModule_SetModuleMetadata` - attach or update metadata to a key
  - `RedisModule_GetKeyMeta` - get key metadata

### Metrics

- #14896 `INFO STATS` - global stats for slowlog metrics:
  - `slowlog_commands_count` - commands written to slowlog
  - `slowlog_commands_time_ms_sum` - sum of execution times of commands from the slowlog
  - `slowlog_commands_time_ms_max` - maximum execution time of a command from the slowlog
- #14896 `INFO COMMANDSTATS` - per-command stats for slowlog metrics:
  - `slowlog_count` - number of times the command was written in the slowlog
  - `slowlog_time_ms_sum` - sum of execution time of the command (only from the slowlog)
  - `slowlog_time_ms_max` - maximum execution time of the command (only from the slowlog)
-14841  `INFO STATS` (global, all clients aggregated):
  - `total_client_processing_events`: attempts to process client input buffers; does not guarantee any command was actually parsed
  - `eventloop_cycles_with_clients_processing`: event loop cycles where client input buffers were processed
  - `commands_per_parse_batch_sum`: cumulative number of commands parsed across all parsing batches for all clients
  - `commands_per_parse_batch_cnt`: number of parsing batches across all clients. A batch is counted each time at least one command is parsed from a client's query buffer
  - `commands_per_parse_batch_avg`: average commands parsed per batch (sum/cnt). Approximates pipelining depth
-#14841 `CLIENT INFO` and `CLIENT LIST` (per-client):
  - `read-events`: number of read events for this client
  - `parse-batch-cmd-sum`: cumulative number of commands parsed across all parsing batches for this client
  - `parse-batch-cnt`: total number of parsing batches for this client. Divide `parse-batch-cmd-sum` by this value to get the client’s average commands per batch

### CLI tools

- #14371 Divide-by-zero in redis-benchmark and redis-cli
- #14863 Memory leak in redis-cli
- #14703 redis-cli --keystats: fix percentile calculation

