1

以下の 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でテーブルを取得します:

@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);

しかし、それは間違っています。正しく解凍できません。どこが悪いのかわかりません。これは長い間私を悩ませてきました...

4

1 に答える 1

1

おそらく問題は、HGET から結果を取得するために String オブジェクトを使用していることです。byte[] が必要です。String オブジェクトは、コードページや null 文字の解釈など、あらゆる種類の厄介なことを行います。たとえそれが機能したとしても、それは多くのオーバーヘッドです。したがって、バイト[]を使用してください。あなたのredisクライアントにはそれを行う方法があると思います。

Redis から msgpack データを取得するために aredis を使用します。ここにいくつかの手がかりがあります:

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

于 2014-08-16T20:15:52.197 に答える