有没有办法在不使用函数的情况下在 jedis 中传递 redis 命令?

Is there a way to pass redis commands in jedis, without using the functions?

我们正在尝试构建一个控制台来处理 redis 查询。但是,在后端我们需要使用 Jedis。因此,作为输入给出的命令需要使用 Jedis 进行处理。例如,在 redis-cli 中,我们使用“keys *”。同样,我们在 Jedis 中使用 jedis.keys(" * ")。我不知道如何将“keys *”转换为 jedis.keys(“*”)。请告诉我一些建议....

嗯...你可以参考下面做同样的事情
redis.clients.jedis.Connection.sendCommand(Command, String...)
创建一个 class extend Connection.
创建一个 class extend Connection 实例并调用 connect() 方法。
调用 super.sendCommand(Protocol.Command.valueOf(args[0].toUpperCase()), args[1~end]).
给你的例子:

public class JedisConn extends Connection {

    public JedisConn(String host, int port) {

        super(host, port);
    }

    @Override
    protected Connection sendCommand(final Protocol.Command cmd, final String... args) {
        return super.sendCommand(cmd, args);
    }


    public static void main(String[] args) {

        JedisConn jedisConn = new JedisConn("host", 6379);
        jedisConn.connect();

        Connection connection = jedisConn.sendCommand(Protocol.Command.valueOf(args[0].toUpperCase()),  Arrays.copyOfRange(args, 1, args.length));
        System.out.println(connection.getAll());
        jedisConn.close();
    }
}

哈哈~~

我找到了解决这个问题的方法。有一个名为 eval() 的函数。我们可以使用它,如下所示。

`Scanner s=new Scanner(System.in);String query=s.nextLine();
 String[] q=query.split(" ");
 String cmd='\''+q[0]+'\'';
 for(int i=1;i<q.length;i++)
 cmd+=",\'"+q[i]+'\'';
 System.out.println(j.eval("return redis.call("+cmd+")"));`

我知道这是一个老问题,但希望以下内容对其他人有用。

这是我想到的,因为最新版本的 Jedis(此时为 3.2.0)不支持 Redis >= 4 上可用的 "memory usage " 命令。此代码假设Jedis 对象已创建,可能来自 Jedis 资源池:

import redis.clients.jedis.util.SafeEncoder;
// ... Jedis setup code ...
byteSize = (Long) jedis.sendCommand(new ProtocolCommand() {
                                        @Override
                                        public byte[] getRaw() {
                                          return SafeEncoder.encode("memory");
                                        }}, 
                                    SafeEncoder.encode("usage"), 
                                    SafeEncoder.encode(key));

这是一个特例命令,因为它有一个主要关键字 memory 和一个次要操作 usage(其他的是 doctorstatspurge,等等)。当向 Redis 发送多关键字命令时,关键字必须被视为一个列表。我第一次尝试将 memory usage 指定为单个参数时因 Redis 服务器错误而失败。

随后,目前的 Jedis 实现似乎是针对单个关键字命令的,因为在引擎盖下有一堆特殊代码来处理多关键字命令,例如 debug object 不太适合原始命令关键字框架。

无论如何,一旦我当前需要调用 memory usage 的项目完成,我将尝试为 Jedis 维护者提供一个补丁,以更 [=34] =] 方式,看起来像:

Long byteSize = jedis.memoryUsage(key);

最后,为了满足您的特定需求,最好的办法是使用 Jedis class 的 scan() 方法。 SO 上有文章解释了如何使用 scan() 方法。