251 lines
3.2 KiB
Markdown
251 lines
3.2 KiB
Markdown
Got it 👍 — let’s break this down properly.
|
||
|
||
Redis has two broad classes you’re asking about:
|
||
|
||
1. **Basic key-space functions** (SET, GET, DEL, EXISTS, etc.)
|
||
2. **Iteration commands** (`SCAN`, `SSCAN`, `HSCAN`, `ZSCAN`)
|
||
|
||
And for each I’ll show:
|
||
|
||
* What it does
|
||
* How it works at a high level
|
||
* Its **RESP protocol implementation** (the actual wire format).
|
||
|
||
---
|
||
|
||
# 1. Basic Key-Space Commands
|
||
|
||
### `SET key value`
|
||
|
||
* Stores a string value at a key.
|
||
* Overwrites if the key already exists.
|
||
|
||
**Protocol (RESP2):**
|
||
|
||
```
|
||
*3
|
||
$3
|
||
SET
|
||
$3
|
||
foo
|
||
$3
|
||
bar
|
||
```
|
||
|
||
(client sends: array of 3 bulk strings: `["SET", "foo", "bar"]`)
|
||
|
||
**Reply:**
|
||
|
||
```
|
||
+OK
|
||
```
|
||
|
||
---
|
||
|
||
### `GET key`
|
||
|
||
* Retrieves the string value stored at the key.
|
||
* Returns `nil` if key doesn’t exist.
|
||
|
||
**Protocol:**
|
||
|
||
```
|
||
*2
|
||
$3
|
||
GET
|
||
$3
|
||
foo
|
||
```
|
||
|
||
**Reply:**
|
||
|
||
```
|
||
$3
|
||
bar
|
||
```
|
||
|
||
(or `$-1` for nil)
|
||
|
||
---
|
||
|
||
### `DEL key [key ...]`
|
||
|
||
* Removes one or more keys.
|
||
* Returns number of keys actually removed.
|
||
|
||
**Protocol:**
|
||
|
||
```
|
||
*2
|
||
$3
|
||
DEL
|
||
$3
|
||
foo
|
||
```
|
||
|
||
**Reply:**
|
||
|
||
```
|
||
:1
|
||
```
|
||
|
||
(integer reply = number of deleted keys)
|
||
|
||
---
|
||
|
||
### `EXISTS key [key ...]`
|
||
|
||
* Checks if one or more keys exist.
|
||
* Returns count of existing keys.
|
||
|
||
**Protocol:**
|
||
|
||
```
|
||
*2
|
||
$6
|
||
EXISTS
|
||
$3
|
||
foo
|
||
```
|
||
|
||
**Reply:**
|
||
|
||
```
|
||
:1
|
||
```
|
||
|
||
---
|
||
|
||
### `KEYS pattern`
|
||
|
||
* Returns all keys matching a glob-style pattern.
|
||
⚠️ Not efficient in production (O(N)), better to use `SCAN`.
|
||
|
||
**Protocol:**
|
||
|
||
```
|
||
*2
|
||
$4
|
||
KEYS
|
||
$1
|
||
*
|
||
```
|
||
|
||
**Reply:**
|
||
|
||
```
|
||
*2
|
||
$3
|
||
foo
|
||
$3
|
||
bar
|
||
```
|
||
|
||
(array of bulk strings with key names)
|
||
|
||
---
|
||
|
||
# 2. Iteration Commands (`SCAN` family)
|
||
|
||
### `SCAN cursor [MATCH pattern] [COUNT n]`
|
||
|
||
* Iterates the keyspace incrementally.
|
||
* Client keeps sending back the cursor from previous call until it returns `0`.
|
||
|
||
**Protocol example:**
|
||
|
||
```
|
||
*2
|
||
$4
|
||
SCAN
|
||
$1
|
||
0
|
||
```
|
||
|
||
**Reply:**
|
||
|
||
```
|
||
*2
|
||
$1
|
||
0
|
||
*2
|
||
$3
|
||
foo
|
||
$3
|
||
bar
|
||
```
|
||
|
||
Explanation:
|
||
|
||
* First element = new cursor (`"0"` means iteration finished).
|
||
* Second element = array of keys returned in this batch.
|
||
|
||
---
|
||
|
||
### `HSCAN key cursor [MATCH pattern] [COUNT n]`
|
||
|
||
* Like `SCAN`, but iterates fields of a hash.
|
||
|
||
**Protocol:**
|
||
|
||
```
|
||
*3
|
||
$5
|
||
HSCAN
|
||
$3
|
||
myh
|
||
$1
|
||
0
|
||
```
|
||
|
||
**Reply:**
|
||
|
||
```
|
||
*2
|
||
$1
|
||
0
|
||
*4
|
||
$5
|
||
field
|
||
$5
|
||
value
|
||
$5
|
||
age
|
||
$2
|
||
42
|
||
```
|
||
|
||
(Array of alternating field/value pairs)
|
||
|
||
---
|
||
|
||
### `SSCAN key cursor [MATCH pattern] [COUNT n]`
|
||
|
||
* Iterates members of a set.
|
||
|
||
Protocol and reply structure same as SCAN.
|
||
|
||
---
|
||
|
||
### `ZSCAN key cursor [MATCH pattern] [COUNT n]`
|
||
|
||
* Iterates members of a sorted set with scores.
|
||
* Returns alternating `member`, `score`.
|
||
|
||
---
|
||
|
||
# Quick Comparison
|
||
|
||
| Command | Purpose | Return Type |
|
||
| -------- | ----------------------------- | --------------------- |
|
||
| `SET` | Store a string value | Simple string `+OK` |
|
||
| `GET` | Retrieve a string value | Bulk string / nil |
|
||
| `DEL` | Delete keys | Integer (count) |
|
||
| `EXISTS` | Check existence | Integer (count) |
|
||
| `KEYS` | List all matching keys (slow) | Array of bulk strings |
|
||
| `SCAN` | Iterate over keys (safe) | `[cursor, array]` |
|
||
| `HSCAN` | Iterate over hash fields | `[cursor, array]` |
|
||
| `SSCAN` | Iterate over set members | `[cursor, array]` |
|
||
| `ZSCAN` | Iterate over sorted set | `[cursor, array]` |
|
||
|