...
This commit is contained in:
		
							
								
								
									
										251
									
								
								specs/backgroundinfo/redis_basics.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										251
									
								
								specs/backgroundinfo/redis_basics.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,251 @@
 | 
			
		||||
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]`     |
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
		Reference in New Issue
	
	Block a user