【问题标题】:Store data into aerospike将数据存储到 aerospike
【发布时间】:2016-03-13 12:42:24
【问题描述】:

我有一些数据要针对列存储到 aerospike 中

假设传入的数据是

["A", 1]

现在第一个问题是如何在 Java 中保存这些数据。

我试过了。

ArrayList value = new ArrayList();
value.add(new String("A"));
value.add(new Integer(2));

当我尝试将此数据写入 aerospike 时使用

AerospikeClient client = client.put(new WritePolicy(), 
         new Key("namespace", "set", "test"), 
         new Bin("binName", value) );

然后,如果我使用 AQL 查询,那么我看到了

| AC ED 00 05 73 72 00 13 6A 61 76 61 2E 75 74 69 6C 2E 41 72 72 61 79 4C 69 73 74 78 81 D2 1D 99 C7 61 9D 03 00 01 49 00 0 04 73 79 08 02 77 04 00 00 00 02 73 72 00 11 6A 61 76 61 2E 6C 61 6E 67 2E 49 6E 74 65 67 65 72 12 E2 A0 A4 F7 81 87 |

一些十六进制数

但是当我尝试使用

将数据存储到 Aerospike
AerospikeClient client = client.put(new WritePolicy(), 
         new Key("namespace", "set", "test"), 
         new Bin("binName", Value.getAsList(value)) );

然后通过 AQL 触发查询给我

["A",1]

这似乎是预期的行为,但是当我使用 Aerospike 客户端获取值并检查它们的类型时

List<Object> ret = (List<Object>) client.get(new Policy(), key, "test").getValue("binName");

    if(ret.get(0) instanceof Long){
        System.out.println("Got instance of long");
    }

然后我可以看到打印语句虽然最初我发送了整数数据。

为什么会发生这种情况,谁能告诉我将传入数据保存到 aerospike 的任何替代解决方案说数据是

["A",1]

PS:请用小代码片段支持你的回答

在 GITHUB 上找到一些信息

参考this链接有一些功能

我在下面复制/粘贴

/**
 * Write/Read ArrayList<Object> directly instead of relying on java serializer.
 */
private void testListComplex(AerospikeClient client, Parameters params) throws Exception {
    console.info("Read/Write ArrayList<Object>");
    Key key = new Key(params.namespace, params.set, "listkey2");
    client.delete(params.writePolicy, key);

    byte[] blob = new byte[] {3, 52, 125};      
    ArrayList<Object> list = new ArrayList<Object>();
    list.add("string1");
    list.add(2);
    list.add(blob);

    Bin bin = new Bin(params.getBinName("listbin2"), list);
    client.put(params.writePolicy, key, bin);

    Record record = client.get(params.policy, key, bin.name);
    List<?> receivedList = (List<?>) record.getValue(bin.name);

    validateSize(3, receivedList.size());
    validate("string1", receivedList.get(0));
    // Server convert numbers to long, so must expect long.
    validate(2L, receivedList.get(1)); 
    validate(blob, (byte[])receivedList.get(2));
    
    console.info("Read/Write ArrayList<Object> successful.");
}

有评论说服务器把数字转长了

现在我有一个问题。那么对于这种类型的Case整数是不是不能存储呢?

【问题讨论】:

    标签: java database aerospike


    【解决方案1】:

    如果您检查Aerospike datatypes,您会发现它们仅支持 64 位整数,即 Java 中的 long 类型。

    如果您不需要通过 Lua UDF 脚本访问服务器上的这些数据,那么您可以将其保存为序列化的 blob 数据。 Java 驱动程序已经支持本机序列化,这是您在第一次尝试时所做的。 AQL 只是向您显示序列化的字节,但您可以在 java 客户端中读取它就好了。

    或者您可以将其存储为 json 序列化字符串,以便与您将来可能使用的其他语言驱动程序更兼容。

    【讨论】:

    • 任何unsupported type(即应用程序端的类型,不直接映射到 Aerospike 服务器类型)在服务器上被序列化并存储在 as_bytes 类型中。在这种情况下,它有一个 encoding 说明它已由 Java 客户端 (AS_BYTES_JAVA) 序列化。
    猜你喜欢
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多