首页 > 解决方案 > 有没有办法在 jedis 中传递 redis 命令,而不使用函数?

问题描述

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

标签: redisjedis

解决方案


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

这是我想出的,因为最新版本的 Jedis(截至此时为 3.2.0)不支持 Redis >= 4 上可用的“内存使用”命令。此代码假定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 维护者提供补丁,以更正式/传统的方式实现上述命令,如下所示:

Long byteSize = jedis.memoryUsage(key);

最后,为了满足您的特定需求,您最好使用 Jedis 类的 scan() 方法。这里有关于 SO 的文章解释了如何使用 scan() 方法。


推荐阅读