valkey-java

Java · valkey-java 5.5.0 · RESP2

所列测试通过

测试连接设置

io.valkey.Jedis standalone connection

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

已验证操作

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

可执行测试示例

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

java -cp "/clients:/clients/jars/*" Clients valkey
查看已执行的完整源代码
// Run: java -cp '/clients:/clients/jars/*' Clients jedis|valkey|lettuce
import java.util.*;
import redis.clients.jedis.Jedis;

public class Clients {
  static String installedVersion(String group, String artifact) {
    String file="META-INF/maven/"+group+"/"+artifact+"/pom.properties";
    try(var input=Clients.class.getClassLoader().getResourceAsStream(file)) {
      if(input==null)throw new IllegalStateException("Missing installed package metadata: "+file);
      var properties=new Properties();properties.load(input);return Objects.requireNonNull(properties.getProperty("version"));
    } catch(java.io.IOException error){throw new RuntimeException(error);}
  }
  static List<String> checks = new ArrayList<>();
  static void check(String name, Object actual, Object expected) {
    if (!Objects.equals(actual, expected)) throw new AssertionError(name+": "+actual+" != "+expected);
    checks.add(name);
  }
  public static void main(String[] args) {
    String library=args[0], version="";
    if (library.equals("jedis")) {
      version=installedVersion("redis.clients","jedis");
      try (var client=new Jedis("127.0.0.1",6379)) {
        client.auth("default","manual-test-only");
        check("authenticated PING",client.ping(),"PONG");
        check("SET",client.set("java:text","Hello 世界"),"OK");
        check("Unicode GET",client.get("java:text"),"Hello 世界");
        check("missing GET",client.get("java:missing"),null);
        client.hset("java:hash","field","value");check("HGET",client.hget("java:hash","field"),"value");
        try(var p=client.pipelined()){p.set("java:counter","1");var n=p.incr("java:counter");p.sync();check("pipeline",n.get(),2L);}
        try(var tx=client.multi()){tx.set("java:counter","3");tx.incr("java:counter");check("MULTI/EXEC",tx.exec(),List.of("OK",4L));}
        check("Lua EVAL",client.eval("return redis.call('GET',KEYS[1])",List.of("java:counter"),List.of()),"4");
        client.psetex("java:expiry",60000,"value");long ttl=client.pttl("java:expiry");check("PSETEX/PTTL",ttl>0&&ttl<=60000,true);
      }
    } else if(library.equals("valkey")) {
      version=installedVersion("io.valkey","valkey-java");
      try (var client=new io.valkey.Jedis("127.0.0.1",6379)) {
        client.auth("default","manual-test-only");
        check("authenticated PING",client.ping(),"PONG");
        check("SET",client.set("java:text","Hello 世界"),"OK");
        check("Unicode GET",client.get("java:text"),"Hello 世界");
        check("missing GET",client.get("java:missing"),null);
        client.hset("java:hash","field","value");check("HGET",client.hget("java:hash","field"),"value");
        try(var p=client.pipelined()){p.set("java:counter","1");var n=p.incr("java:counter");p.sync();check("pipeline",n.get(),2L);}
        try(var tx=client.multi()){tx.set("java:counter","3");tx.incr("java:counter");check("MULTI/EXEC",tx.exec(),List.of("OK",4L));}
        check("Lua EVAL",client.eval("return redis.call('GET',KEYS[1])",List.of("java:counter"),List.of()),"4");
      }
    } else {
      version=installedVersion("io.lettuce","lettuce-core");
      var uri=io.lettuce.core.RedisURI.Builder.redis("127.0.0.1",6379).withAuthentication("default","manual-test-only").withTimeout(java.time.Duration.ofSeconds(5)).build();
      var client=io.lettuce.core.RedisClient.create(uri);
      try(var connection=client.connect()) {
        var c=connection.sync();check("authenticated PING",c.ping(),"PONG");
        check("SET",c.set("java:text","Hello 世界"),"OK");check("Unicode GET",c.get("java:text"),"Hello 世界");check("missing GET",c.get("java:missing"),null);
        c.hset("java:hash","field","value");check("HGET",c.hget("java:hash","field"),"value");
        c.multi();c.set("java:counter","3");c.incr("java:counter");var results=c.exec();check("MULTI/EXEC count",results.size(),2);check("MULTI/EXEC value",results.get(1),4L);
        check("Lua EVAL",c.eval("return redis.call('GET',KEYS[1])",io.lettuce.core.ScriptOutputType.VALUE,new String[]{"java:counter"}),"4");
      } finally {client.shutdown();}
    }
    String names=String.join(",",checks.stream().map(x->"\""+x+"\"").toList());
    System.out.println("{\"library\":\""+library+"\",\"version\":\""+version+"\",\"checks\":["+names+"],\"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

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