【问题标题】:How to read erlang term from redis by using java client?如何使用 java 客户端从 redis 读取 erlang 术语?
【发布时间】:2013-05-30 08:46:37
【问题描述】:

例如我将元组 T = {k1, v1, k2, v2} 通过 jedis 保存到 redis:

 eredis:q(Conn, ["SET", <<"mykey">>, term_to_binary(T)]).

我正在尝试使用下面的代码来阅读这个 erlang 术语:

Jedis j =  Redis.pool.getResource();
byte[] t = j.get("mykey").getBytes();
OtpInputStream ois = new OtpInputStream(t);
System.out.println(OtpErlangObject.decode(ois));

错误是:com.ericsson.otp.erlang.OtpErlangDecodeException:未知数据类型:239。

那么如何正确获取 erlang 术语?


Erlang 方面:

term_to_binary({k1, v1, k2, v2})。

>

Java端:

j.get("mykey").getBytes():

-17 -65 -67 104 4 100 0 2 107 49 100 0 2 118 49 100 0 2 107 50 100 0 2 118 50。

似乎只有前 3 个字节不同。所以我把它们改成字节(131), 然后就可以用 System.out.println(OtpErlangObject.decode(ois)) 正确打印了。

但是当术语比较复杂的时候,比如里面有list的记录,就不行了。因为其他一些字符不仅会出现在数据的开头,还会出现在数据的末尾和中间。

为什么我保存的数据与我得到的不同?

【问题讨论】:

  • 您可以将数据存储为字符串。比如说,json格式。
  • 但是out项目运行了很久,很多数据都是用erlang term存储在redis中的。那么除了改变数据的格式,还有其他的方式来读取term吗?

标签: java erlang redis jedis erlang-driver


【解决方案1】:

字节数组开头的负数不是 erlang 外部术语语法的有效值。

我假设由于您已经以这种方式将 erlang 术语存储在 redis 中一段时间​​了,因此您正确地插入了它们。

这真的只剩下一件事:当您调用getBytes() 时,您的编码已关闭,很可能使用您系统上设置为默认的任何编码(可能是 UTF-8,但我不确定)。你真正想做的是将不同的编码传递给getBytes(),可能是这样的:getBytes("US-ASCII")

check out the documentation 编码可用。

这是一个link on SO,它展示了如何将字符串转换为 ASCII 字节数组。

【讨论】:

    猜你喜欢
    • 2019-02-02
    • 2014-03-11
    • 2015-07-04
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2018-11-23
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多