...
This commit is contained in:
307
instructions/hset_redis_functions.md
Normal file
307
instructions/hset_redis_functions.md
Normal file
@@ -0,0 +1,307 @@
|
||||
|
||||
# 🔑 Redis `HSET` and Related Hash Commands
|
||||
|
||||
## 1. `HSET`
|
||||
|
||||
* **Purpose**: Set the value of one or more fields in a hash.
|
||||
* **Syntax**:
|
||||
|
||||
```bash
|
||||
HSET key field value [field value ...]
|
||||
```
|
||||
* **Return**:
|
||||
|
||||
* Integer: number of fields that were newly added.
|
||||
* **RESP Protocol**:
|
||||
|
||||
```
|
||||
*4
|
||||
$4
|
||||
HSET
|
||||
$3
|
||||
key
|
||||
$5
|
||||
field
|
||||
$5
|
||||
value
|
||||
```
|
||||
|
||||
(If multiple field-value pairs: `*6`, `*8`, etc.)
|
||||
|
||||
---
|
||||
|
||||
## 2. `HSETNX`
|
||||
|
||||
* **Purpose**: Set the value of a hash field only if it does **not** exist.
|
||||
* **Syntax**:
|
||||
|
||||
```bash
|
||||
HSETNX key field value
|
||||
```
|
||||
* **Return**:
|
||||
|
||||
* `1` if field was set.
|
||||
* `0` if field already exists.
|
||||
* **RESP Protocol**:
|
||||
|
||||
```
|
||||
*4
|
||||
$6
|
||||
HSETNX
|
||||
$3
|
||||
key
|
||||
$5
|
||||
field
|
||||
$5
|
||||
value
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. `HGET`
|
||||
|
||||
* **Purpose**: Get the value of a hash field.
|
||||
* **Syntax**:
|
||||
|
||||
```bash
|
||||
HGET key field
|
||||
```
|
||||
* **Return**:
|
||||
|
||||
* Bulk string (value) or `nil` if field does not exist.
|
||||
* **RESP Protocol**:
|
||||
|
||||
```
|
||||
*3
|
||||
$4
|
||||
HGET
|
||||
$3
|
||||
key
|
||||
$5
|
||||
field
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. `HGETALL`
|
||||
|
||||
* **Purpose**: Get all fields and values in a hash.
|
||||
* **Syntax**:
|
||||
|
||||
```bash
|
||||
HGETALL key
|
||||
```
|
||||
* **Return**:
|
||||
|
||||
* Array of `[field1, value1, field2, value2, ...]`.
|
||||
* **RESP Protocol**:
|
||||
|
||||
```
|
||||
*2
|
||||
$7
|
||||
HGETALL
|
||||
$3
|
||||
key
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. `HMSET` (⚠️ Deprecated, use `HSET`)
|
||||
|
||||
* **Purpose**: Set multiple field-value pairs.
|
||||
* **Syntax**:
|
||||
|
||||
```bash
|
||||
HMSET key field value [field value ...]
|
||||
```
|
||||
* **Return**:
|
||||
|
||||
* Always `OK`.
|
||||
* **RESP Protocol**:
|
||||
|
||||
```
|
||||
*6
|
||||
$5
|
||||
HMSET
|
||||
$3
|
||||
key
|
||||
$5
|
||||
field
|
||||
$5
|
||||
value
|
||||
$5
|
||||
field2
|
||||
$5
|
||||
value2
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. `HMGET`
|
||||
|
||||
* **Purpose**: Get values of multiple fields.
|
||||
* **Syntax**:
|
||||
|
||||
```bash
|
||||
HMGET key field [field ...]
|
||||
```
|
||||
* **Return**:
|
||||
|
||||
* Array of values (bulk strings or nils).
|
||||
* **RESP Protocol**:
|
||||
|
||||
```
|
||||
*4
|
||||
$5
|
||||
HMGET
|
||||
$3
|
||||
key
|
||||
$5
|
||||
field1
|
||||
$5
|
||||
field2
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. `HDEL`
|
||||
|
||||
* **Purpose**: Delete one or more fields from a hash.
|
||||
* **Syntax**:
|
||||
|
||||
```bash
|
||||
HDEL key field [field ...]
|
||||
```
|
||||
* **Return**:
|
||||
|
||||
* Integer: number of fields removed.
|
||||
* **RESP Protocol**:
|
||||
|
||||
```
|
||||
*3
|
||||
$4
|
||||
HDEL
|
||||
$3
|
||||
key
|
||||
$5
|
||||
field
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. `HEXISTS`
|
||||
|
||||
* **Purpose**: Check if a field exists.
|
||||
* **Syntax**:
|
||||
|
||||
```bash
|
||||
HEXISTS key field
|
||||
```
|
||||
* **Return**:
|
||||
|
||||
* `1` if exists, `0` if not.
|
||||
* **RESP Protocol**:
|
||||
|
||||
```
|
||||
*3
|
||||
$7
|
||||
HEXISTS
|
||||
$3
|
||||
key
|
||||
$5
|
||||
field
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. `HKEYS`
|
||||
|
||||
* **Purpose**: Get all field names in a hash.
|
||||
* **Syntax**:
|
||||
|
||||
```bash
|
||||
HKEYS key
|
||||
```
|
||||
* **Return**:
|
||||
|
||||
* Array of field names.
|
||||
* **RESP Protocol**:
|
||||
|
||||
```
|
||||
*2
|
||||
$5
|
||||
HKEYS
|
||||
$3
|
||||
key
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. `HVALS`
|
||||
|
||||
* **Purpose**: Get all values in a hash.
|
||||
* **Syntax**:
|
||||
|
||||
```bash
|
||||
HVALS key
|
||||
```
|
||||
* **Return**:
|
||||
|
||||
* Array of values.
|
||||
* **RESP Protocol**:
|
||||
|
||||
```
|
||||
*2
|
||||
$5
|
||||
HVALS
|
||||
$3
|
||||
key
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. `HLEN`
|
||||
|
||||
* **Purpose**: Get number of fields in a hash.
|
||||
* **Syntax**:
|
||||
|
||||
```bash
|
||||
HLEN key
|
||||
```
|
||||
* **Return**:
|
||||
|
||||
* Integer: number of fields.
|
||||
* **RESP Protocol**:
|
||||
|
||||
```
|
||||
*2
|
||||
$4
|
||||
HLEN
|
||||
$3
|
||||
key
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 12. `HSCAN`
|
||||
|
||||
* **Purpose**: Iterate fields/values of a hash (cursor-based scan).
|
||||
* **Syntax**:
|
||||
|
||||
```bash
|
||||
HSCAN key cursor [MATCH pattern] [COUNT count]
|
||||
```
|
||||
* **Return**:
|
||||
|
||||
* Array: `[new-cursor, [field1, value1, ...]]`
|
||||
* **RESP Protocol**:
|
||||
|
||||
```
|
||||
*3
|
||||
$5
|
||||
HSCAN
|
||||
$3
|
||||
key
|
||||
$1
|
||||
0
|
||||
```
|
80
instructions/redb.md
Normal file
80
instructions/redb.md
Normal file
@@ -0,0 +1,80 @@
|
||||
========================
|
||||
CODE SNIPPETS
|
||||
========================
|
||||
TITLE: 1PC+C Commit Strategy Vulnerability Example
|
||||
DESCRIPTION: Illustrates a scenario where a partially committed transaction might appear complete due to the non-cryptographic checksum (XXH3) used in the 1PC+C commit strategy. This requires controlling page flush order, introducing a crash during fsync, and ensuring valid checksums for partially written data.
|
||||
|
||||
SOURCE: https://github.com/cberner/redb/blob/master/docs/design.md#_snippet_9
|
||||
|
||||
LANGUAGE: rust
|
||||
CODE:
|
||||
```
|
||||
table.insert(malicious_key, malicious_value);
|
||||
table.insert(good_key, good_value);
|
||||
txn.commit();
|
||||
```
|
||||
|
||||
LANGUAGE: rust
|
||||
CODE:
|
||||
```
|
||||
table.insert(malicious_key, malicious_value);
|
||||
txn.commit();
|
||||
```
|
||||
|
||||
----------------------------------------
|
||||
|
||||
TITLE: Basic Key-Value Operations in redb
|
||||
DESCRIPTION: Demonstrates the fundamental usage of redb for creating a database, opening a table, inserting a key-value pair, and retrieving the value within separate read and write transactions.
|
||||
|
||||
SOURCE: https://github.com/cberner/redb/blob/master/README.md#_snippet_0
|
||||
|
||||
LANGUAGE: rust
|
||||
CODE:
|
||||
```
|
||||
use redb::{Database, Error, ReadableTable, TableDefinition};
|
||||
|
||||
const TABLE: TableDefinition<&str, u64> = TableDefinition::new("my_data");
|
||||
|
||||
fn main() -> Result<(), Error> {
|
||||
let db = Database::create("my_db.redb")?;
|
||||
let write_txn = db.begin_write()?;
|
||||
{
|
||||
let mut table = write_txn.open_table(TABLE)?;
|
||||
table.insert("my_key", &123)?;
|
||||
}
|
||||
write_txn.commit()?;
|
||||
|
||||
let read_txn = db.begin_read()?;
|
||||
let table = read_txn.open_table(TABLE)?;
|
||||
assert_eq!(table.get("my_key")?.unwrap().value(), 123);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## What *redb* currently supports:
|
||||
|
||||
* Simple operations like creating databases, inserting key-value pairs, opening and reading tables ([GitHub][1]).
|
||||
* No mention of operations such as:
|
||||
|
||||
* Iterating over keys with a given prefix.
|
||||
* Range queries based on string prefixes.
|
||||
* Specialized prefix‑filtered lookups.
|
||||
|
||||
|
||||
## implement range scans as follows
|
||||
|
||||
You can implement prefix-like functionality using **range scans** combined with manual checks, similar to using a `BTreeSet` in Rust:
|
||||
|
||||
```rust
|
||||
for key in table.range(prefix..).keys() {
|
||||
if !key.starts_with(prefix) {
|
||||
break;
|
||||
}
|
||||
// process key
|
||||
}
|
||||
```
|
||||
|
||||
This pattern iterates keys starting at the prefix, and stops once a key no longer matches the prefix—this works because the keys are sorted ([GitHub][1]).
|
250
instructions/redis_basics.md
Normal file
250
instructions/redis_basics.md
Normal file
@@ -0,0 +1,250 @@
|
||||
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