redis - 有没有办法在 jedis 中传递 redis 命令,而不使用函数?
问题描述
我们正在尝试构建一个控制台来处理 redis 查询。但是,在后端我们需要使用 Jedis。因此,作为输入给出的命令需要使用 Jedis 进行处理。例如,在 redis-cli 中,我们使用“keys *”。同样,我们在 Jedis 中使用 jedis.keys(" * ")。我不知道如何将“keys *”转换为 jedis.keys(“*”)。请告诉我一些建议......
解决方案
我知道这是一个老问题,但希望以下内容对其他人有用。
这是我想出的,因为最新版本的 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
(其他关键字是doctor
、stats
、purge
等)。向 Redis 发送多关键字命令时,必须将关键字视为列表。我第一次尝试指定memory usage
为单个参数失败,出现 Redis 服务器错误。
随后,似乎当前的 Jedis 实现面向单关键字命令,因为在底层有一堆特殊代码来处理多关键字命令,例如debug object
不完全符合原始命令关键字框架的代码。
无论如何,一旦我当前需要调用能力的项目memory usage
完成,我将尝试向 Jedis 维护者提供补丁,以更正式/传统的方式实现上述命令,如下所示:
Long byteSize = jedis.memoryUsage(key);
最后,为了满足您的特定需求,您最好使用 Jedis 类的 scan() 方法。这里有关于 SO 的文章解释了如何使用 scan() 方法。
推荐阅读
- java - FileDialog getFilterIndex() 方法返回 -1
- regex - 使用 RegEx 在 Kibana 中查询字段
- android - 未找到处理 Intent { act=com.android.car.developeroptions.action.DEMO_MODE } 的 Activity
- java - 用于 Selenium 测试的 VM 屏幕太小
- node.js - 带有子文档数组的类型鹅 ref
- node.js - 检索单个值 onWrite firebase cloud Function
- python - Flask 正在工作,但带有 nginx 的 Flask 无法正常工作
- sql - Postgress 在查询期间用以前的值填充丢失的行值
- python-3.x - AttributeError:模块 'tensorflow._api.v1.initializers' 没有属性 'TruncatedNormal'
- python - 等待 C++ lib 完成的 Python 线程可以冻结整个应用程序吗?