Releases: redis/redis
7.0-rc1
Introduction to the Redis 7.0 release
Redis 7.0 includes several new user-facing features, significant performance
optimizations, and many other improvements. It also includes changes that
potentially break backwards compatibility with older versions. We urge users to
review the release notes carefully before upgrading.
In particular, users should be aware of the following changes:
- Redis 7 stores AOF as multiple files in a folder; see Multi-Part AOF below.
- Redis 7 uses a new version 10 format for RDB files, which is incompatible
with older versions. - Redis 7 converts ziplist encoded keys to listpacks on the fly when loading
an older RDB format. Conversion applies to loading a file from disk or
replicating from a Redis master and will slightly increase loading time. - See sections about breaking changes mentioned below.
Here is a comprehensive list of changes in this release compared to 6.2.6.
Each one includes the PR number that added it so that you can get more details
at https://github.com/redis/redis/pull/
New Features
- Redis Functions: A new way to extend Redis with server-side scripts (#8693)
see https://redis.io/topics/functions-intro - ACL: Fine-grained key-based permissions and allow users to support multiple
sets of command rules with selectors (#9974)
see https://redis.io/topics/acl#key-permissions and https://redis.io/topics/acl#selectors. - Cluster: Sharded (node-specific) Pub/Sub support (#8621)
see https://redis.io/topics/pubsub#sharded-pubsub - First-class handling of sub-commands in most contexts (affecting ACL
categories, INFO commandstats, etc.) (#9504, #10147) - Command metadata and documentation (#10104)
see https://redis.io/commands/command-docs, https://redis.io/topics/command-tips - Command key-specs. A better way for clients to locate key arguments and their
read/write purpose (#8324, #10122, #10167)
see https://redis.io/topics/key-specs - Multi-Part AOF mechanism to avoid AOF rewrite overheads (#9788)
- Cluster: Support for hostnames, instead of IP addresses only (#9530)
- Improved management of memory consumed by network buffers, and an option to
drop clients when total memory exceeds a limit (#8687) - Cluster: A mechanism for disconnecting cluster bus connections to prevent
uncontrolled buffer growth (#9774) - AOF: Timestamp annotations and support for point-in-time recovery (#9326)
- Lua: support Function flags in EVAL scripts (#10126)
see https://redis.io/topics/eval-intro#eval-flags - Lua: Support RESP3 reply for Verbatim and Big-Number types (#9202)
- Lua: Get Redis version via redis.REDIS_VERSION, redis.REDIS_VERSION_NUM (#10066)
New user commands or command arguments
- ZMPOP, BZMPOP commands (#9484)
- LMPOP, BLMPOP commands (#9373)
- SINTERCARD, ZINTERCARD commands (#8946, #9425)
- SPUBLISH, SSUBSCRIBE, SUNSUBSCRIBE, PUBSUB SHARDCHANNELS/SHARDNUMSUB (#8621)
- EXPIRETIME and PEXPIRETIME commands (#8474)
- EXPIRE command group supports NX/XX/GT/LT options (#2795)
- SET command supports combining NX and GET flags (#8906)
- BITPOS, BITCOUNT accepts BIT index (#9324)
- EVAL_RO, EVALSHA_RO command variants, to run on read-only replicas (#8820)
- SORT_RO command, to run on read-only replicas (#9299)
- SHUTDOWN arguments: NOW, FORCE, ABORT (#9872)
- FUNCTION *, FCALL, FCALL_RO - https://redis.io/commands/function-load
- CONFIG SET/GET can handle multiple configs atomically, in one call (#9748, #9914)
- QUIT promoted to be a proper command, HOST: and POST demoted (#9798)
- XADD supports auto sequence number via -* (#9217)
New administrative and introspection commands and command arguments
- COMMAND DOCS (#9656, #10056, #10104)
- COMMAND LIST (#9504)
- COMMAND INFO accepts sub-commands as args, and no args too (#9504, #10056)
- LATENCY HISTOGRAM (#9462)
- CLUSTER LINKS (#9774)
- CLUSTER DELSLOTSRANGE and CLUSTER ADDSLOTSRANGE (#9445)
- CLIENT NO-EVICT (#8687)
- ACL DRYRUN (#9974)
- SLOWLOG GET supports passing in -1 to get all entries (#9018)
Command replies that have been extended
- COMMAND and COMMAND INFO extended with tips, key-specs and sub-commands
see https://redis.io/commands/command - ACL CAT, COMMAND LIST list sub-commands (#10127)
- MODULE LIST reply includes path and args (#4848)
- OBJECT ENCODING returns listpack instead of ziplist (#8887, #9366)
- CLUSTER SLOTS hostname support (#9530)
- COMMAND command: Added the
blocking
andmodule
flags (#10104, #9656)
Potentially Breaking Changes
- Modifying the bind parameter to a non-default value will no longer implicitly
disable protected-mode (#9034) - Remove EVAL script verbatim replication, propagation, and deterministic
execution logic (#9812)
This has been deprecated and off by default since Redis 6 and is no longer
supported. - ACL: pub/sub channels are blocked by default (acl-pubsub-default=resetchannels) (#10181)
- SCRIPT LOAD and SCRIPT FLUSH are no longer propagated to replicas / AOF (#9812)
- ACL: Declarations of duplicate ACL users in startup files and command line
arguments will result in an error, whereas previously the last declaration
would overwrite the others. (#9330) - Replication: TTLs are always replicated as absolute (not relative) millisecond
timestamps (#8474) - Fixes in handling multi-key commands with expired keys on writable replicas (#9572)
- CONFIG SET maxmemory returns before starting eviction (#10019)
- AOF: The new Multi-Part mechanism stores data as a set of multiple files in a
designated folder (#9788) - Remove STRALGO command, preserve LCS a standalone command which only works on
keys (#9799) - Remove gopher protocol support (#9057)
- MODULE and DEBUG commands disabled (protected) by default, for better security (#9920)
- Snapshot-creating and other admin commands in MULTI/EXEC transactions are now
rejected (#10015) - PING is now rejected with -MASTERDOWN when replica-serve-stale-data=no (#9757)
- ACL GETUSER reply now uses ACL syntax for
keys
andchannels
(#9974) - COMMAND reply drops
random
andsort-for-scripts
flags, which are now part
of command tips (#10104) - LPOP/RPOP with count against non-existing list return null array (#10095)
- INFO commandstats now shows the stats per sub-command (#9504)
- ZPOPMIN/ZPOPMAX used to produce wrong replies when count is 0 with non-zset (#9711)
- LPOP/RPOP used to produce wrong replies when count is 0 (#9692)
- CONFIG GET bind now returns the current value in effect, even if the implicit
default is in use (#9034) - CONFIG REWRITE now rewrites the list of modules to load (#4848)
- Config: repl-diskless-sync is now set to yes by default (#10092)
- When shutting down, Redis can optionally wait for replicas to catch up on the
replication link (#9872) - Most CONFIG SET, REWRITE, RESETSTAT commands are now allowed during loading (#9878)
- READONLY and READWRITE commands are now allowed when loading and on stale
replicas (#7425) - Fix ACL category for SELECT, WAIT, ROLE, LASTSAVE, READONLY, READWRITE, ASKING (#9208)
- RESET is now allowed even when on unauthenticated connections (#9798)
- SCRIPT LOAD is now allowed on stale replicas (#10126)
Security improvements
- Sensitive configs and commands blocked (protected) by default (#9920)
- Improve bind and protected-mode config handling (#9034)
- Sentinel: avoid logging auth-pass value (#9652)
- redis-cli: sensitive commands bypass the history file (#8895)
Performance and resource utilization improvements
- Significant memory saving and latency improvements in cluster mode (#9356)
- Significant memory savings in case of many hash or zset keys (#9228)
- Replication backlog and replicas use one global shared replication buffer (#9166)
- Significant reduction of copy-on-write memory overheads (#8974)
- Free unused capacity in the cluster send buffer (#9255)
- Memory efficiency, make full use of client struct memory for reply buffers (#8968)
- Replace ziplist with listpack in Hash, List, Zset (#8887, #9366, #9740)
- Add support for list type to store elements larger than 4GB (#9357)
- Reuse temporary client objects for blocked clients by module (#9940)
- Remove command argument count limit, dynamically grow argv buffer (#9528)
- Optimize list type operations to seek from the nearest end (#9454)
- Improvements in fsync to avoid large writes to disk (#9409)
- BITSET and BITFIELD SET only propagated when the value actually changed (#9403)
- Improve latency when a client is unblocked by module timer (#9593)
Other General Improvements
- Make partial sync possible after master reboot (#8015)
- Always create a base AOF file when redis starts from empty (#10102)
- Replica keep serving data during repl-diskless-load=swapdb for better
availability (#9323)
Changes in CLI tools
- redis-cli --json, and -2 options (#9954)
- redis-cli --scan, add sleep interval option (#3751)
- redis-cli --replica optimization, skip RDB generation (#10044)
- redis-cli --functions-rdb, generate RDB with Functions only (#9968)
- redis-cli -X, take an arbitrary arg from stdin, extend --cluster call take -x (#9980)
- redis-benchmark -x takes an argument from stdin (#9130)
- redis-benchmark, Added URI support (#9314)
- redis-cli monitor and pubsub can be aborted with Ctrl+C, keeping the cli alive (#9347)
Platform / toolchain support related improvements
6.2.6
Upgrade urgency: SECURITY, contains fixes to security issues.
Security Fixes:
- (CVE-2021-41099) Integer to heap buffer overflow handling certain string
commands and network payloads, when proto-max-bulk-len is manually configured
to a non-default, very large value [reported by yiyuaner]. - (CVE-2021-32762) Integer to heap buffer overflow issue in redis-cli and
redis-sentinel parsing large multi-bulk replies on some older and less common
platforms [reported by Microsoft Vulnerability Research]. - (CVE-2021-32687) Integer to heap buffer overflow with intsets, when
set-max-intset-entries is manually configured to a non-default, very large
value [reported by Pawel Wieczorkiewicz, AWS]. - (CVE-2021-32675) Denial Of Service when processing RESP request payloads with
a large number of elements on many connections. - (CVE-2021-32672) Random heap reading issue with Lua Debugger [reported by
Meir Shpilraien]. - (CVE-2021-32628) Integer to heap buffer overflow handling ziplist-encoded
data types, when configuring a large, non-default value for
hash-max-ziplist-entries, hash-max-ziplist-value, zset-max-ziplist-entries
or zset-max-ziplist-value [reported by sundb]. - (CVE-2021-32627) Integer to heap buffer overflow issue with streams, when
configuring a non-default, large value for proto-max-bulk-len and
client-query-buffer-limit [reported by sundb]. - (CVE-2021-32626) Specially crafted Lua scripts may result with Heap buffer
overflow [reported by Meir Shpilraien].
Bug fixes that involve behavior changes:
- GEO* STORE with empty source key deletes the destination key and return 0 (#9271)
Previously it would have returned an empty array like the non-STORE variant. - PUBSUB NUMPAT replies with number of patterns rather than number of subscriptions (#9209)
This actually changed in 6.2.0 but was overlooked and omitted from the release notes.
Bug fixes that are only applicable to previous releases of Redis 6.2:
- Fix CLIENT PAUSE, used an old timeout from previous PAUSE (#9477)
- Fix CLIENT PAUSE in a replica would mess the replication offset (#9448)
- Add some missing error statistics in INFO errorstats (#9328)
Other bug fixes:
- Fix incorrect reply of COMMAND command key positions for MIGRATE command (#9455)
- Fix appendfsync to always guarantee fsync before reply, on MacOS and FreeBSD (kqueue) (#9416)
- Fix the wrong mis-detection of sync_file_range system call, affecting performance (#9371)
CLI tools:
- When redis-cli received ASK response, it didn't handle it (#8930)
Improvements:
6.0.16
Upgrade urgency: SECURITY, contains fixes to security issues.
Security Fixes:
- (CVE-2021-41099) Integer to heap buffer overflow handling certain string
commands and network payloads, when proto-max-bulk-len is manually configured
to a non-default, very large value [reported by yiyuaner]. - (CVE-2021-32762) Integer to heap buffer overflow issue in redis-cli and
redis-sentinel parsing large multi-bulk replies on some older and less common
platforms [reported by Microsoft Vulnerability Research]. - (CVE-2021-32687) Integer to heap buffer overflow with intsets, when
set-max-intset-entries is manually configured to a non-default, very large
value [reported by Pawel Wieczorkiewicz, AWS]. - (CVE-2021-32675) Denial Of Service when processing RESP request payloads with
a large number of elements on many connections. - (CVE-2021-32672) Random heap reading issue with Lua Debugger [reported by
Meir Shpilraien]. - (CVE-2021-32628) Integer to heap buffer overflow handling ziplist-encoded
data types, when configuring a large, non-default value for
hash-max-ziplist-entries, hash-max-ziplist-value, zset-max-ziplist-entries
or zset-max-ziplist-value [reported by sundb]. - (CVE-2021-32627) Integer to heap buffer overflow issue with streams, when
configuring a non-default, large value for proto-max-bulk-len and
client-query-buffer-limit [reported by sundb]. - (CVE-2021-32626) Specially crafted Lua scripts may result with Heap buffer
overflow [reported by Meir Shpilraien].
Other bug fixes:
5.0.14
Upgrade urgency: SECURITY, contains fixes to security issues.
Security Fixes:
- (CVE-2021-41099) Integer to heap buffer overflow handling certain string
commands and network payloads, when proto-max-bulk-len is manually configured
to a non-default, very large value [reported by yiyuaner]. - (CVE-2021-32762) Integer to heap buffer overflow issue in redis-cli and
redis-sentinel parsing large multi-bulk replies on some older and less common
platforms [reported by Microsoft Vulnerability Research]. - (CVE-2021-32687) Integer to heap buffer overflow with intsets, when
set-max-intset-entries is manually configured to a non-default, very large
value [reported by Pawel Wieczorkiewicz, AWS]. - (CVE-2021-32675) Denial Of Service when processing RESP request payloads with
a large number of elements on many connections. - (CVE-2021-32672) Random heap reading issue with Lua Debugger [reported by
Meir Shpilraien]. - (CVE-2021-32628) Integer to heap buffer overflow handling ziplist-encoded
data types, when configuring a large, non-default value for
hash-max-ziplist-entries, hash-max-ziplist-value, zset-max-ziplist-entries
or zset-max-ziplist-value [reported by sundb]. - (CVE-2021-32627) Integer to heap buffer overflow issue with streams, when
configuring a non-default, large value for proto-max-bulk-len and
client-query-buffer-limit [reported by sundb]. - (CVE-2021-32626) Specially crafted Lua scripts may result with Heap buffer
overflow [reported by Meir Shpilraien].
6.2.5
Upgrade urgency: SECURITY, contains fixes to security issues that affect
authenticated client connections on 32-bit versions. MODERATE otherwise.
Fix integer overflow in BITFIELD on 32-bit versions (CVE-2021-32761).
An integer overflow bug in Redis version 2.2 or newer can be exploited using the
BITFIELD command to corrupt the heap and potentially result with remote code
execution.
Bug fixes that involve behavior changes:
- Change reply type for ZPOPMAX/MIN with count in RESP3 to nested array (#8981).
Was using a flat array like in RESP2 instead of a nested array like ZRANGE does. - Fix reply type for HRANDFIELD and ZRANDMEMBER when key is missing (#9178).
Was using a null array instead of an empty array. - Fix reply type for ZRANGESTORE when source key is missing (#9089).
Was using an empty array like ZRANGE instead of 0 (used in the STORE variant).
Bug fixes that are only applicable to previous releases of Redis 6.2:
- ZRANDMEMBER WITHSCORES with negative COUNT may return bad score (#9162)
- Fix crash after CLIENT UNPAUSE when threaded I/O config is enabled (#9041)
- Fix XTRIM or XADD with LIMIT may delete more entries than the limit (#9048)
- Fix build issue with OpenSSL 1.1.0 (#9233)
Other bug fixes:
- Fail EXEC command in case a watched key is expired (#9194)
- Fix SMOVE not to invalidate dest key (WATCH and tracking) when member already exists (#9244)
- Fix SINTERSTORE not to delete dest key when getting a wrong type error (#9032)
- Fix overflows on 32-bit versions in GETBIT, SETBIT, BITCOUNT, BITPOS, and BITFIELD (#9191)
- Improve MEMORY USAGE on stream keys (#9164)
- Set TCP keepalive on inbound cluster bus connections (#9230)
- Fix diskless replica loading to recover from RDB short read on module AUX data (#9199)
- Fix race in client side tracking (#9116)
- Fix ziplist length updates on big-endian platforms (#2080)
CLI tools:
- redis-cli cluster import command may issue wrong MIGRATE command, sending COPY instead of REPLACE (#8945)
- redis-cli --rdb fixes when using "-" to write to stdout (#9136, #9135)
- redis-cli support for RESP3 set type in CSV and RAW output (#7338)
Modules:
6.0.15
Upgrade urgency: SECURITY, contains fixes to security issues that affect
authenticated client connections on 32-bit versions. MODERATE otherwise.
Fix integer overflow in BITFIELD on 32-bit versions (CVE-2021-32761).
An integer overflow bug in Redis version 2.2 or newer can be exploited using the
BITFIELD command to corrupt the heap and potentially result with remote code
execution.
Bug fixes that involve behavior changes:
- Change reply type for ZPOPMAX/MIN with count in RESP3 to nested array (#8981).
Was using a flat array like in RESP2 instead of a nested array like ZRANGE does.
Bug fixes:
- Fail EXEC command in case a watched key is expired (#9194)
- Fix SMOVE not to invalidate dest key (WATCH and tracking) when member already exists (#9244)
- Fix SINTERSTORE not to delete dest key when getting a wrong type error (#9032)
- Fix overflows on 32-bit versions in GETBIT, SETBIT, BITCOUNT, BITPOS, and BITFIELD (#9191)
- Set TCP keepalive on inbound cluster bus connections (#9230)
- Fix ziplist length updates on big-endian platforms (#2080)
- Fix diskless replica loading to recover from RDB short read on module AUX data (#9199)
- Fix race in client side tracking (#9116)
- If diskless repl child is killed, make sure to reap the child pid (#7742)
- Add a timeout mechanism for replicas stuck in fullsync (#8762)
CLI tools:
5.0.13
Upgrade urgency: SECURITY, contains fixes to security issues that affect
authenticated client connections on 32-bit versions. MODERATE otherwise.
Fix integer overflow in BITFIELD on 32-bit versions (CVE-2021-32761).
An integer overflow bug in Redis version 2.2 or newer can be exploited using the
BITFIELD command to corrupt the heap and potentially result with remote code
execution.
Bug fixes:
6.2.4
Upgrade urgency: SECURITY, Contains fixes to security issues that affect
authenticated client connections. MODERATE otherwise.
Fix integer overflow in STRALGO LCS (CVE-2021-32625)
An integer overflow bug in Redis version 6.0 or newer can be exploited using the
STRALGO LCS command to corrupt the heap and potentially result with remote code
execution. This is a result of an incomplete fix by CVE-2021-29477.
Bug fixes that are only applicable to previous releases of Redis 6.2:
- Fix crash after a diskless replication fork child is terminated (#8991)
- Fix redis-benchmark crash on unsupported configs (#8916)
Other bug fixes:
- Fix crash in UNLINK on a stream key with deleted consumer groups (#8932)
- SINTERSTORE: Add missing keyspace del event when none of the sources exist (#8949)
- Sentinel: Fix CONFIG SET of empty string sentinel-user/sentinel-pass configs (#8958)
- Enforce client output buffer soft limit when no traffic (#8833)
Improvements:
- Hide AUTH passwords in MIGRATE command from slowlog (#8859)
6.0.14
Upgrade urgency: SECURITY, Contains fixes to security issues that affect
authenticated client connections. MODERATE otherwise.
Fix integer overflow in STRALGO LCS (CVE-2021-32625)
An integer overflow bug in Redis version 6.0 or newer can be exploited using the
STRALGO LCS command to corrupt the heap and potentially result with remote code
execution. This is a result of an incomplete fix by CVE-2021-29477.
Other bug fixes:
6.2.3
Upgrade urgency: SECURITY, Contains fixes to security issues that affect
authenticated client connections. LOW otherwise.
Integer overflow in STRALGO LCS command (CVE-2021-29477):
An integer overflow bug in Redis version 6.0 or newer could be exploited using
the STRALGO LCS command to corrupt the heap and potentially result in remote
code execution. The integer overflow bug exists in all versions of Redis
starting with 6.0.
Integer overflow in COPY command for large intsets (CVE-2021-29478):
An integer overflow bug in Redis 6.2 could be exploited to corrupt the heap and
potentially result in remote code execution. The vulnerability involves
changing the default set-max-intset-entries configuration value, creating a
large set key that consists of integer values and using the COPY command to
duplicate it. The integer overflow bug exists in all versions of Redis starting
with 2.6, where it could result with a corrupted RDB or DUMP payload, but not
exploited through COPY (which did not exist before 6.2).
Bug fixes that are only applicable to previous releases of Redis 6.2:
- Fix memory leak in moduleDefragGlobals (#8853)
- Fix memory leak when doing lazy freeing client tracking table (#8822)
- Block abusive replicas from sending commands that could assert and crash redis (#8868)
Other bug fixes:
- Use a monotonic clock to check for Lua script timeout (#8812)
- redis-cli: Do not use unix socket when we got redirected in cluster mode (#8870)
Modules:
- Fix RM_GetClusterNodeInfo() to correctly populate master id (#8846)