gpt4 book ai didi

java - 我在 redis 中存储了一个用 messagepack 打包的 lua 表,我怎样才能 hget 它并用 java 解压它?

转载 作者:IT王子 更新时间:2023-10-29 06:15:00 31 4
gpt4 key购买 nike

Redis lua脚本如下:

local vv = cmsgpack.unpack(msgpack)
local mv = {[\"v\"]=v, [\"t\"]=t, [\"tp\"]=tp, [\"pt\"] = pt}
table.insert(vv, mv)
msgpack = cmsgpack.pack(vv)

然后我用 java hget 表:

@Message
public static class UserMessage {
public String v;
public long t;
public String tp;
public String pt;
}

String ret = redisClient.hget(uid, "m:v");
byte[] bytes = ret.getBytes();
MessagePack msgpack = new MessagePack();
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
Unpacker unpacker = msgpack.createUnpacker(in);
UserMessage[] dst = unpacker.read(UserMessage[].class);

但是错了,不能正确解包,不知道是我的错在哪里?困扰了我很久...

最佳答案

问题可能是您正在使用 String 对象从 HGET 获取结果。你需要一个字节[]。 String 对象会做各种讨厌的事情,比如解释代码页、空字符等。即使有效,开销也很大。所以使用 byte[],我猜你的 redis 客户端有办法做到这一点。

我们使用 aredis 从 Redis 中检索 msgpack 数据。这里有一些线索:

import org.aredis.cache.AsyncRedisClient;
import org.aredis.cache.AsyncRedisFactory;
import org.aredis.cache.DataHandler;
import org.aredis.cache.RedisCommand;
import org.aredis.cache.RedisCommandInfo;
import org.aredis.io.CompressibleByteArrayOutputStream;
import org.aredis.net.ServerInfo;

private class RawHandler extends Object implements DataHandler {

@Override
public Object deserialize(Object arg0, byte[] arg1, int arg2, int arg3, ServerInfo arg4) throws IOException {
return arg1;
}

@Override
public void serialize(Object arg0, Object arg1, CompressibleByteArrayOutputStream arg2, ServerInfo arg3) throws IOException {
throw new NotActiveException("Not supported, deserialize only.");
}

}

Future<RedisCommandInfo> futureOE = oRedis.oCliDpart.submitCommand(
new RawHandler(),
RedisCommand.ZRANGEBYLEX,
"_ourkey#blabla.d",
String.format("[%s;", cDbAndTable),
String.format("(%s<", cDbAndTable));
...

final Object[] val = (Object[]) futureOE.get().getResult();
for (Object item : val) {
if (item instanceof byte[]) {
...

从那里开始,msgpack 反序列化应该是微不足道的。

希望这有帮助,TW

关于java - 我在 redis 中存储了一个用 messagepack 打包的 lua 表,我怎样才能 hget 它并用 java 解压它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25342344/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com