valkey-go

Go · valkey-go v1.0.78 · RESP3

所列测试通过

测试连接设置

DisableCache: true

测试目标:127.0.0.1:6379,用户名 default,测试密码 manual-test-only,默认数据库。该密码只用于一次性的本地测试容器。

已验证操作

范围限于下方程序中的确切 API 调用与断言。

必须禁用客户端缓存:DisableCache: true。Lavik 0.1.0 的 CLIENT TRACKING ON 返回不支持的子命令错误。

可执行测试示例

此程序已在隔离 Docker 镜像中执行。它包含多个客户端分支;本页使用下面列出的参数。依赖和编译步骤位于测试目录的 Dockerfile 中。

"/clients/go-client" valkey
查看已执行的完整源代码
// Run: ./go-client redis|valkey. Fixture only; local Docker, plaintext TCP.
package main

import (
 "context"
 "encoding/json"
 "fmt"
 "os"
 "runtime/debug"
 "time"
 redis "github.com/redis/go-redis/v9"
 valkey "github.com/valkey-io/valkey-go"
)

func main() {
 ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second); defer cancel()
 checks := []string{}
 check := func(name string, got, want string, err error) { if err != nil || got != want { panic(fmt.Sprintf("%s: got %q want %q err %v", name, got, want, err)) }; checks=append(checks,name) }
 lib := "github.com/redis/go-redis/v9"
 if os.Args[1] == "redis" {
  c := redis.NewClient(&redis.Options{Addr:"127.0.0.1:6379", Username:"default", Password:"manual-test-only", Protocol:3, MaxRetries:-1}); defer c.Close()
  v,e:=c.Ping(ctx).Result();check("authenticated PING",v,"PONG",e)
  v,e=c.Set(ctx,"go:text","Hello 世界",0).Result();check("SET",v,"OK",e)
  v,e=c.Get(ctx,"go:text").Result();check("Unicode GET",v,"Hello 世界",e)
  v,e=c.Get(ctx,"go:missing").Result();if e!=redis.Nil {panic("missing GET")};checks=append(checks,"missing GET")
  c.Set(ctx,"go:binary",string([]byte{0,255,13,10}),0)
  v,e=c.Get(ctx,"go:binary").Result();check("binary round trip",v,string([]byte{0,255,13,10}),e)
  if e=c.HSet(ctx,"go:hash","field","value").Err();e!=nil {panic(e)}
  v,e=c.HGet(ctx,"go:hash","field").Result();check("HGET",v,"value",e)
  p:=c.Pipeline();p.Set(ctx,"go:counter","1",0);n:=p.Incr(ctx,"go:counter");_,e=p.Exec(ctx);check("pipeline",fmt.Sprint(n.Val()),"2",e)
  tx:=c.TxPipeline();tx.Set(ctx,"go:counter","3",0);n=tx.Incr(ctx,"go:counter");_,e=tx.Exec(ctx);check("MULTI/EXEC",fmt.Sprint(n.Val()),"4",e)
  v,e=c.Eval(ctx,"return redis.call('GET',KEYS[1])",[]string{"go:counter"}).Text();check("Lua EVAL",v,"4",e)
  if e=c.Set(ctx,"go:expiry","value",60*time.Second).Err();e!=nil {panic(e)}
  ttl,e:=c.PTTL(ctx,"go:expiry").Result();if e!=nil || ttl<=0 || ttl>60*time.Second {panic("PTTL")};checks=append(checks,"SET expiry/PTTL")
 } else {
  lib="github.com/valkey-io/valkey-go"
  // Lavik 0.1.0 does not implement CLIENT TRACKING; disable client-side caching.
  c,e:=valkey.NewClient(valkey.ClientOption{InitAddress:[]string{"127.0.0.1:6379"},Username:"default",Password:"manual-test-only",DisableCache:true});if e!=nil{panic(e)};defer c.Close()
  v,e:=c.Do(ctx,c.B().Ping().Build()).ToString();check("authenticated PING",v,"PONG",e)
  v,e=c.Do(ctx,c.B().Set().Key("go:text").Value("Hello 世界").Build()).ToString();check("SET",v,"OK",e)
  v,e=c.Do(ctx,c.B().Get().Key("go:text").Build()).ToString();check("Unicode GET",v,"Hello 世界",e)
  v,e=c.Do(ctx,c.B().Get().Key("go:missing").Build()).ToString();if !valkey.IsValkeyNil(e){panic("missing GET")};checks=append(checks,"missing GET")
  added,e:=c.Do(ctx,c.B().Hset().Key("go:hash").FieldValue().FieldValue("field","value").Build()).ToInt64();check("HSET",fmt.Sprint(added),"1",e)
  v,e=c.Do(ctx,c.B().Hget().Key("go:hash").Field("field").Build()).ToString();check("HGET",v,"value",e)
  replies:=c.DoMulti(ctx,c.B().Set().Key("go:counter").Value("1").Build(),c.B().Incr().Key("go:counter").Build(),c.B().Get().Key("go:counter").Build())
  v,e=replies[0].ToString();check("pipeline SET",v,"OK",e);n,e:=replies[1].ToInt64();check("pipeline INCR",fmt.Sprint(n),"2",e);v,e=replies[2].ToString();check("pipeline GET",v,"2",e)
  v,e=c.Do(ctx,c.B().Eval().Script("return redis.call('GET',KEYS[1])").Numkeys(1).Key("go:counter").Build()).ToString();check("Lua EVAL",v,"2",e)
 }
 version:="";if info,ok:=debug.ReadBuildInfo();ok{for _,d:=range info.Deps{if d.Path==lib{version=d.Version}}}
 if version==""{panic("Missing dependency version")}
 json.NewEncoder(os.Stdout).Encode(map[string]any{"library":lib,"version":version,"protocol":3,"checks":checks,"status":"passed"})
}

客户端官方仓库 · 依赖和复现步骤

测试环境与可复现证据

验证时间: 2026-09-21T11:15:27Z · Docker / Linux aarch64 · lavik 0.1.0-beta.1

存储与连接: io_uring · 临时文件、2 个工作线程、单机、明文 TCP、密码认证。此测试不衡量 NVMe 性能。

固定源码: 3955b98d43b312324aa8d52775df52cfb111c0d0

二进制 SHA-256: 8306b37ddf05023f85166a6aa2192b7084757e8defd342b602e6470244aca887

镜像: sha256:fd13690a1931b8abb31b1866baa2a08c7c38e6df93aa78883321d1d3c1cddd00

完整测试记录 · 可执行测试