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
相关产品推荐
相关产品推荐

