将数据存储到 aerospike
Store data into 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:请用小代码snippit支持你的回答
在 GITHUB
上找到了一些信息
参考this link有一些功能
下面是我copy/pasting
/**
* 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 驱动程序已经支持本机序列化,这是您在第一次尝试时所做的。 AQL 只是向您显示序列化字节,但您可以在 java 客户端中读取它就好了。
或者您可以将其存储为 json 序列化字符串,以便它与您将来可能使用的其他语言驱动程序更兼容。
我有一些数据要存储到 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:请用小代码snippit支持你的回答
在 GITHUB
上找到了一些信息参考this link有一些功能
下面是我copy/pasting
/**
* 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 驱动程序已经支持本机序列化,这是您在第一次尝试时所做的。 AQL 只是向您显示序列化字节,但您可以在 java 客户端中读取它就好了。
或者您可以将其存储为 json 序列化字符串,以便它与您将来可能使用的其他语言驱动程序更兼容。