You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jedis管道echo命令被移除,求直接返回字符串的简便实现方案

在Jedis新版Pipeline中直接获取ECHO命令的字符串结果

Jedis 2.x之后的版本确实移除了Pipeline中的echo()封装方法,直接调用sendCommand会返回字节数组。想要直接拿到字符串结果,有两种简便的处理方式:

方式1:自定义Pipeline扩展类

自己封装一个带echo方法的Pipeline子类,内部处理字节数组转字符串的逻辑,后续使用时直接调用封装好的方法即可,不用每次手动转换:

Scala代码示例

import redis.clients.jedis._
import redis.clients.jedis.util.SafeEncoder

class CustomPipeline(jedis: Jedis) extends Pipeline(jedis.getClient) {
  def echo(msg: String): Response[String] = {
    val resp = sendCommand(Protocol.Command.ECHO, msg)
    new Response[String](resp) {
      override def get: String = SafeEncoder.encode(super.get)
    }
  }
}

// 使用示例
object Main {
  def main(args: Array[String]): Unit = {
    val jedis = new Jedis("redis://localhost:6379/0")
    val pipe = new CustomPipeline(jedis)
    val echoResp = pipe.echo("Hello, Redis!")
    pipe.sync()
    println(echoResp.get) // 直接得到字符串结果
  }
}

Java代码示例(场景一致)

import redis.clients.jedis.*;
import redis.clients.jedis.util.SafeEncoder;

public class CustomPipeline extends Pipeline {
    public CustomPipeline(Client client) {
        super(client);
    }

    public Response<String> echo(String msg) {
        Response<byte[]> resp = sendCommand(Protocol.Command.ECHO, msg);
        return new Response<String>(resp.getRawObject()) {
            @Override
            public String get() {
                return SafeEncoder.encode(super.get());
            }
        };
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("redis://localhost:6379/0");
        CustomPipeline pipe = new CustomPipeline(jedis.getClient());
        Response<String> echoResp = pipe.echo("Hello, Redis!");
        pipe.sync();
        System.out.println(echoResp.get());
    }
}

方式2:直接用Jedis内置编码器转换

如果不想自定义类,每次获取结果时用Jedis自带的SafeEncoder.encode()工具转换即可,这也是旧版本echo()方法内部的处理逻辑,编码兼容性有保障:

Scala代码示例

import redis.clients.jedis._
import redis.clients.jedis.util.SafeEncoder

object Main {
  def main(args: Array[String]): Unit = {
    val jedis = new Jedis("redis://localhost:6379/0")
    val pipe = jedis.pipelined()
    val resp = pipe.sendCommand(Protocol.Command.ECHO, "Hello, Redis!")
    pipe.sync()
    val result = SafeEncoder.encode(resp.get)
    println(result)
  }
}

Java代码示例(场景一致)

import redis.clients.jedis.*;
import redis.clients.jedis.util.SafeEncoder;

public class Main {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("redis://localhost:6379/0");
        Pipeline pipe = jedis.pipelined();
        Response<byte[]> resp = pipe.sendCommand(Protocol.Command.ECHO, "Hello, Redis!");
        pipe.sync();
        String result = SafeEncoder.encode(resp.get());
        System.out.println(result);
    }
}

补充说明

  • SafeEncoder.encode()默认使用UTF-8编码,和旧版本echo()方法的处理逻辑完全一致,不会出现编码乱码问题。
  • 如果你的Redis实例使用了非UTF-8编码,可以直接用字符串构造方法指定编码,比如new String(resp.get(), "GBK")(根据实际编码调整)。

内容的提问来源于stack exchange,提问作者Amaterasu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:53:22