有没有办法在不使用函数的情况下在 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
(其他的是 doctor
、stats
、purge
,等等)。当向 Redis 发送多关键字命令时,关键字必须被视为一个列表。我第一次尝试将 memory usage
指定为单个参数时因 Redis 服务器错误而失败。
随后,目前的 Jedis 实现似乎是针对单个关键字命令的,因为在引擎盖下有一堆特殊代码来处理多关键字命令,例如 debug object
不太适合原始命令关键字框架。
无论如何,一旦我当前需要调用 memory usage
的项目完成,我将尝试为 Jedis 维护者提供一个补丁,以更 [=34] =] 方式,看起来像:
Long byteSize = jedis.memoryUsage(key);
最后,为了满足您的特定需求,最好的办法是使用 Jedis class 的 scan() 方法。 SO 上有文章解释了如何使用 scan() 方法。
我们正在尝试构建一个控制台来处理 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
(其他的是 doctor
、stats
、purge
,等等)。当向 Redis 发送多关键字命令时,关键字必须被视为一个列表。我第一次尝试将 memory usage
指定为单个参数时因 Redis 服务器错误而失败。
随后,目前的 Jedis 实现似乎是针对单个关键字命令的,因为在引擎盖下有一堆特殊代码来处理多关键字命令,例如 debug object
不太适合原始命令关键字框架。
无论如何,一旦我当前需要调用 memory usage
的项目完成,我将尝试为 Jedis 维护者提供一个补丁,以更 [=34] =] 方式,看起来像:
Long byteSize = jedis.memoryUsage(key);
最后,为了满足您的特定需求,最好的办法是使用 Jedis class 的 scan() 方法。 SO 上有文章解释了如何使用 scan() 方法。