# Feature catalog — redis/redis

> Canonical page: https://codevetter.com/unpack/redis/feature-catalog

# Feature catalog — redis/redis

Scanned commit c3215f019a4c11c35d438f241114e94730fe39e5 (2026-09-22). Generated by codevetter codevetter 1.12.0 on 2026-09-22.

User-facing surface is the RESP command set — 464 JSON command specs under `src/commands/` compiled into the 13k-line `src/commands.def`. Alongside the classic types (string/list/set/zset/hash/stream/HLL/geo/bitmap) this tree adds a first-class array type (AR* commands), key-blessing (BLESS), hot-key tracking (HOTKEYS), INCREX, hash-field expiration (HEXPIRE family), and a compiled-out GCRA rate limiter. Administrative surface spans ACL, CLIENT, CLUSTER (including atomic slot migration), CONFIG, FUNCTION, DEBUG, and the Sentinel command set. Client-side tooling ships as `redis-cli` (with a full cluster manager and ~60 flags), `redis-benchmark`, and the two check tools.
- 464 command specification JSON files under `src/commands/` are the declarative source of the command table; `utils/generate-command-code.py` compiles them into `src/commands.def` (13,236 lines) via the `$(COMMANDS_DEF_FILENAME).def` Make rule. — [src/commands/](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/commands/) [utils/generate-command-code.py#L1-40](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/utils/generate-command-code.py#L1-L40) [src/Makefile#L503-504](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/Makefile#L503-L504)
- A new `OBJ_ARRAY` (type 7) sparse-array data type is exposed via 18 commands — ARSET, ARGET, ARDEL, ARDELRANGE, ARGETRANGE, ARGREP, ARINFO, ARINSERT, ARLASTITEMS, ARLEN, ARMGET, ARMSET, ARNEXT, AROP, ARRING, ARSCAN, ARSEEK, ARCOUNT — implemented in `src/t_array.c` over `src/sparsearray.c`. — [src/server.h#L900-925](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/server.h#L900-L925) [src/commands/arset.json](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/commands/arset.json) [src/t_array.c#L1-20](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/t_array.c#L1-L20) [tests/unit/type/array.tcl#L1-20](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/tests/unit/type/array.tcl#L1-L20)
- BLESS marks keys as never-evictable: the NO-EVICT bit lives in the kvBits byte after each kvobj, persists through RDB and AOF, and is exposed as BLESS SET/GET/CLEAR/SCAN plus an `blessed_keys` INFO counter backed by a per-DB `db->blessed_keys` index. — [src/bless.c#L1-25](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/bless.c#L1-L25) [src/commands/bless-set.json](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/commands/bless-set.json) [src/commands/bless-scan.json](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/commands/bless-scan.json) [tests/unit/bless.tcl](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/tests/unit/bless.tcl)
- HOTKEYS START/STOP/GET/RESET/HELP expose a CuckooHeavyKeeper top-K sketch (`src/chk.c`, based on the Ngo & Papatriantafilou paper plus a min-heap borrowed from RedisBloom's TopK) that can be scoped to specific cluster slot ranges via a `slotRangeArray`. — [src/chk.c#L1-16](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/chk.c#L1-L16) [src/hotkeys.c#L1-25](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/hotkeys.c#L1-L25) [src/commands/hotkeys-start.json](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/commands/hotkeys-start.json) [tests/unit/hotkeys.tcl](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/tests/unit/hotkeys.tcl)
- INCREX is a new string command returning a two-element reply (`{value, applied}`) that creates a missing key at 0 before incrementing, with an optional increment argument. — [tests/unit/type/increx.tcl#L1-15](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/tests/unit/type/increx.tcl#L1-L15) [src/commands/](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/commands/)
- Hash-field expiration ships as eight commands — HEXPIRE, HEXPIREAT, HPEXPIRE, HPEXPIREAT, HEXPIRETIME, HPEXPIRETIME, HGETEX, HGETDEL — backed by the `ebuckets` radix-of-buckets expiry structure and the per-DB `estore` subexpires store. — [src/commands/hexpire.json](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/commands/hexpire.json) [src/commands/hgetex.json](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/commands/hgetex.json) [src/ebuckets.c](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/ebuckets.c) [src/estore.c#L1-25](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/estore.c#L1-L25) [tests/unit/type/hash-field-expire.tcl](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/tests/unit/type/hash-field-expire.tcl)
- A GCRA (Generic Cell Rate Algorithm) leaky-bucket rate limiter exists as `src/gcra.c` with an `OBJ_GCRA` object type and a 4-arg `GCRA key max_burst tokens_per_period period` command, ported from redis-cell — but it is compiled out by default behind `#ifdef ENABLE_GCRA`. — [src/gcra.c#L1-22](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/gcra.c#L1-L22) [src/server.h#L917-928](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/server.h#L917-L928) [tests/unit/gcra.tcl#L1-30](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/tests/unit/gcra.tcl#L1-L30)
- Atomic slot migration is a user-facing cluster feature driven by `CLUSTER MIGRATION IMPORT <slots>` run on the destination node, handled by `clusterMigrationCommand()`, with an eight-step protocol documented in the file header. — [src/cluster_asm.c#L18-45](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/cluster_asm.c#L18-L45) [src/cluster_asm.c#L907-1051](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/cluster_asm.c#L907-L1051) [tests/unit/cluster/atomic-slot-migration.tcl](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/tests/unit/cluster/atomic-slot-migration.tcl)
- Lua scripting is offered in two forms: ephemeral EVAL/EVALSHA/SCRIPT via `evalGenericCommand()` and `luaCreateFunction()` in `src/eval.c`, and persistent FUNCTION libraries via a pluggable engine registry in `src/functions.c` whose only registered engine is `LUA_ENGINE_NAME` from `src/function_lua.c`. — [src/eval.c#L436-720](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/eval.c#L436-L720) [src/functions.c#L407-461](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/functions.c#L407-L461) [src/function_lua.c#L512](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/function_lua.c#L512)
- `redis-cli` is a large multi-mode tool (11,561 lines) exposing analysis modes `--bigkeys --memkeys --hotkeys --keystats-samples --scan --latency --latency-dist --latency-history --intrinsic-latency --lru-test --rdb --functions-rdb --pipe --replica --eval --ldb`, RESP3/JSON output modes, and TLS flags (`--tls --cert --key --cacert --cacertdir --insecure`). — [src/redis-cli.c](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/redis-cli.c) [src/redis-cli.c#L176-270](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/redis-cli.c#L176-L270)
- `redis-cli --cluster` embeds a full cluster manager dispatch table of `clusterManagerCommandProc` functions — create, add-node, del-node, info, check, fix, reshard, rebalance — with ~25 `--cluster-*` option flags. — [src/redis-cli.c#L3943-4000](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/redis-cli.c#L3943-L4000)
- Sentinel is a distinct operating mode of the same binary: `initSentinelConfig()` + `initSentinel()` run before config parsing so the config file populates monitored-master state, and `sentinelIsRunning()` replaces the normal ready-to-serve path in `main()`. — [src/server.c#L8342-8352](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/server.c#L8342-L8352) [src/server.c#L8594-8600](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/server.c#L8594-L8600) [src/sentinel.c](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/sentinel.c) [sentinel.conf](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/sentinel.conf)
- Multi-threaded IO is a runtime feature with its own event loops per thread: `initThreadedIO()` is called from `InitServerLast()`, and `readQueryFromClient()` branches on `server.io_threads_num > 1` and atomically tracks `c->pending_read` and per-thread `IOThreads[c->running_tid].io_reads_processed`. — [src/server.c#L3365-3370](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/server.c#L3365-L3370) [src/iothread.c#L991](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/iothread.c#L991) [src/networking.c#L3981-4006](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/networking.c#L3981-L4006)
- Client/replication payload compression is a user-visible option: `clientCompressionProcessPendingData()` runs in `beforeSleep()`, clients carry a `compression_state` and `CLIENT_IO_COMPRESSION_ENABLED` io_flag, and `setReplCompression(server.repl_compression)` is forced off at init when the build lacks zstd. — [src/client_comp.c#L1-25](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/client_comp.c#L1-L25) [src/server.c#L1990-1998](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/server.c#L1990-L1998) [src/server.c#L3090-3094](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/src/server.c#L3090-L3094)
- `modules/vector-sets/` is an in-tree module (deliberately absent from modules.yaml) implementing HNSW vector search with its own `commands.json`, `hnsw.c`, an expression filter language in `expr.c`, and a word2vec helper `w2v.c`. — [modules/vector-sets/](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/modules/vector-sets/) [modules/modules.yaml#L48-50](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/modules/modules.yaml#L48-L50) [modules/MODULES.md#L38-44](https://github.com/redis/redis/blob/c3215f019a4c11c35d438f241114e94730fe39e5/modules/MODULES.md#L38-L44)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
