java - 将数据存储到 aerospike

标签 java database aerospike

我有一些数据要存储到列中的 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 04 73 69 7A 65 78 70 00 00 00 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.");
}

There is a comment that server converts number to long

现在我有一个问题。那么是否意味着这种类型的 Case 整数不能存储?

最佳答案

如果您检查 Aerospike datatypes ,您会看到它们仅支持 64 位整数,这是 Java 中的 long 类型。

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

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

关于java - 将数据存储到 aerospike,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35970391/

相关文章:

java - 如何从 aerospike Java cilent 获取列表然后在单个事务中修改列表类型的 bin

java - JComboBox 的 ArrayList 导致 JComboBox 相互锁定

java - 如何用java向数组中添加一个元素?

database - 在 ERD 中绘制多对多关系

sql - 如何使表的属性成为该表中的外键?

java - 我从一个 JFrame 到另一个 Jframe 的链接不起作用

列表/ map 上的 Aerospike 操作

Aerospike 社区版 : what should I do to `aerospike.conf` to setup a cluster?

java - 在不使用线程的情况下处理 EJB3 中的超时

java - 接口(interface)列表器