mirror of
https://github.com/hanzokv/go.git
synced 2026-09-24 00:31:51 +00:00
We do not use Redis. The client was a go-redis fork and still said so
everywhere: `package redis`, `redis.NewClient`, `redis://`, `extra/redisotel`.
Consumers wrote `redis.Client` against a Valkey-backed store called KV.
package redis -> package kv (93 decls)
redis.X -> kv.X (2,794 call sites)
"redis: …" errors -> "kv: …" (206)
extra/redis{otel,cmd,prometheus,census} -> extra/kv{otel,cmd,prometheus,census}
redis:// , rediss:// -> kv:// , kvs:// (ParseURL)
Redis*/*Redis* idents -> KV*/*KV*
REDIS_VERSION, REDIS_ENDPOINTS_CONFIG_PATH -> KV_*
I previously argued this rename was unsafe because much of it was "wire
contract". That was wrong, and the categorisation shows why: RESP command names
are GET/SET/HSET — they never contain the word. Of 5,771 occurrences only two
kinds were server-visible at all: the ParseURL scheme (we choose what we pass;
our configs already use kv://) and the CLIENT SETINFO lib-name label, which the
server merely records. Nothing here changes a byte of protocol.
Two things deliberately keep the old spelling:
RediSearch — names a specific external module the FT.* commands map to.
StoreDist — contains the letters by accident (sto-reDis-t), not the word.
Breaking for consumers by design: every import site must move redis.X -> kv.X.
Minor bump, never a major — this module stays v9 forever.
109 lines
2.5 KiB
Go
109 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/hanzokv/go/v9"
|
|
)
|
|
|
|
func main() {
|
|
ctx := context.Background()
|
|
|
|
// Create a cluster client
|
|
rdb := kv.NewClusterClient(&kv.ClusterOptions{
|
|
Addrs: []string{
|
|
"localhost:16600",
|
|
"localhost:16601",
|
|
"localhost:16602",
|
|
"localhost:16603",
|
|
"localhost:16604",
|
|
"localhost:16605",
|
|
},
|
|
})
|
|
defer rdb.Close()
|
|
|
|
// Test connection
|
|
if err := rdb.Ping(ctx).Err(); err != nil {
|
|
panic(fmt.Sprintf("Failed to connect to KV cluster: %v", err))
|
|
}
|
|
|
|
fmt.Println("✓ Connected to KV cluster")
|
|
|
|
// Define 10 keys and values
|
|
keys := make([]string, 10)
|
|
values := make([]string, 10)
|
|
for i := 0; i < 10; i++ {
|
|
keys[i] = fmt.Sprintf("key%d", i)
|
|
values[i] = fmt.Sprintf("value%d", i)
|
|
}
|
|
|
|
// Set all 10 keys
|
|
fmt.Println("\n=== Setting 10 keys ===")
|
|
for i := 0; i < 10; i++ {
|
|
err := rdb.Set(ctx, keys[i], values[i], 0).Err()
|
|
if err != nil {
|
|
panic(fmt.Sprintf("Failed to set %s: %v", keys[i], err))
|
|
}
|
|
fmt.Printf("✓ SET %s = %s\n", keys[i], values[i])
|
|
}
|
|
|
|
/*
|
|
// Retrieve all keys using MGET
|
|
fmt.Println("\n=== Retrieving keys with MGET ===")
|
|
result, err := rdb.MGet(ctx, keys...).Result()
|
|
if err != nil {
|
|
panic(fmt.Sprintf("Failed to execute MGET: %v", err))
|
|
}
|
|
*/
|
|
|
|
/*
|
|
// Validate the results
|
|
fmt.Println("\n=== Validating MGET results ===")
|
|
allValid := true
|
|
for i, val := range result {
|
|
expectedValue := values[i]
|
|
actualValue, ok := val.(string)
|
|
|
|
if !ok {
|
|
fmt.Printf("✗ %s: expected string, got %T\n", keys[i], val)
|
|
allValid = false
|
|
continue
|
|
}
|
|
|
|
if actualValue != expectedValue {
|
|
fmt.Printf("✗ %s: expected '%s', got '%s'\n", keys[i], expectedValue, actualValue)
|
|
allValid = false
|
|
} else {
|
|
fmt.Printf("✓ %s: %s\n", keys[i], actualValue)
|
|
}
|
|
}
|
|
|
|
// Print summary
|
|
fmt.Println("\n=== Summary ===")
|
|
if allValid {
|
|
fmt.Println("✓ All values retrieved successfully and match expected values!")
|
|
} else {
|
|
fmt.Println("✗ Some values did not match expected values")
|
|
}
|
|
*/
|
|
|
|
// Clean up - delete the keys
|
|
fmt.Println("\n=== Cleaning up ===")
|
|
for _, key := range keys {
|
|
if err := rdb.Del(ctx, key).Err(); err != nil {
|
|
fmt.Printf("Warning: Failed to delete %s: %v\n", key, err)
|
|
}
|
|
}
|
|
fmt.Println("✓ Cleanup complete")
|
|
|
|
err := rdb.Set(ctx, "{tag}exists", "asdf", 0).Err()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
val, err := rdb.Get(ctx, "{tag}nilkeykey1").Result()
|
|
fmt.Printf("\nval: %+v err: %+v\n", val, err)
|
|
valm, err := rdb.MGet(ctx, "{tag}nilkeykey1", "{tag}exists").Result()
|
|
fmt.Printf("\nval: %+v err: %+v\n", valm, err)
|
|
}
|