在 Redis Lua 中解码 Msgpack

public class MsgPackInRedis {
    private String ip;
    private int port;
    private String session;
    private String protocol;
}
MsgPackInRedis msgPackStringInRedis = new MsgPackInRedis();

我使用 msgpack 将 Java 类 MsgPackInRedis 的对象 msgPackStringInRedis 编码后存储在 Redis 中。现在,我想在 Redis 中运行的 Lua 中解码这个对象并获取“ session”,我该如何做? 我可以像下面这样通过索引 3 获取 session 吗?

local msgPackObject = cmsgpack.unpack(msgPackStringInRedis)
local session = msgPackObject[3]
点赞
用户2087247
用户2087247

假设您的 MessagePack 数据存储在称为 foo 的 String 键中,这将执行您的命令:

EVAL "return cmsgpack.unpack(redis.call('GET', KEYS[1]))" 1 foo

注意: 以上假设数据序列化为数组。返回对象将不起作用,因为 Redis 协议不支持对象。

2017-06-13 13:15:33
用户3160475
用户3160475

MessagePack 是一种编码格式,类似于不易阅读的 JSON。实际上,这个网站可以在它们之间进行互相转换:http://kawanet.github.io/msgpack-lite/

如果你将(0x94 0xC0 0x00 0xA4 0x41 0x42 0x43 0x44 0xC0)输入到上述网站中,您可以看到 JSON 表示如下:

[
  null,
  0,
  "ABCD",
  null
]

您也可以在 Redis 的 Lua 中测试它,例如(请注意,Lua 5.1 接受_十进制_字节表示形式,因此在示例中的表示略有不同):

$ redis-cli EVAL "return(cmsgpack.unpack('\148\192\00\164\65\66\67\68\192')[3])" 0
"ABCD"

因此,说实话,我并没有发现您代码上的问题。您遇到的问题是什么?

2017-06-13 14:58:15