是否可以在不使用函数的情况下在jedis中传递redis命令?

时间:2019-01-22 05:10:41

标签: redis jedis

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

3 个答案:

答案 0 :(得分:1)

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

这是我想出的东西,因为Jedis的最新版本(截至目前为3.2.0)不支持Redis> = 4上可用的“内存使用”命令。此代码假定{{{1 }}对象可能是从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(其他关键字是usagedoctorstats等)。在向Redis发送多关键字命令时,必须将关键字视为一个列表。我第一次尝试将purge指定为单个参数失败,但发生Redis服务器错误。

随后,当前的Jedis实现似乎是针对单关键字命令的,因为在幕后有很多特殊的代码来处理诸如memory usage这样的多关键字命令,命令关键字框架。

无论如何,一旦我当前需要调用debug object能力的项目完成,我将尽力为Jedis维护者提供补丁,以更正式/常规的方式实施上述命令,看起来像这样:

memory usage

最后,为了满足您的特定需求,最好的选择是使用Jedis类的scan()方法。 SO上有一些文章介绍了如何使用scan()方法。

答案 1 :(得分:0)

嗯...您可以通过参考以下内容进行相同的操作。
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();
    }
}

哈哈~~

答案 2 :(得分:0)

我已经找到了解决方法。有一个名为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+")"));`