2016-03-13 2 views
3

У меня есть некоторые данные, которые должны быть сохранены в aerospike против колонкиХранить данные в aerospike

Пусть Incomming данные

["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))); 

Затем стрельба запрос через ДУК дает мне

[ "А", 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"); 
    } 

Тогда я могу видеть, оператор печати, хотя первоначально я послал данные Integer.

Почему это происходит, и может кто-нибудь сказать мне любое альтернативное решение, чтобы сохранить данные Incomming в aerospike говорят данные

["A",1] 

PS: Пожалуйста, аргументируйте свой ответ с небольшой код Snippit

НАЙДЕН некоторая информация о 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."); 
} 

Существует комментарий, который сервер преобразует номер в длинной

Теперь у меня есть вопрос. Значит ли это, что этот тип целых чисел не может быть сохранен?

ответ

1

Если вы проверите Aerospike datatypes, вы увидите, что они поддерживают только 64-битные целые числа, которые являются long типами на Java.

Если вам не нужно обращаться к этим данным на сервере с помощью сценариев Lua UDF, вы можете просто сохранить его в виде сериализованных данных blob. Драйвер java уже поддерживает собственную сериализацию, что и было сделано с первой попытки. AQL просто показывает вам сериализованные байты, но вы можете просто прочитать его в java-клиенте.

Или вы можете сохранить его как строку сериализации json, чтобы она была более совместима с другими языковыми драйверами, которые вы могли бы использовать в будущем.

+1

Любой [неподдерживаемый тип] (http://www.aerospike.com/docs/client/java/usage/data_type.html) (то есть тип на стороне приложения, который не сопоставляется непосредственно с типом сервера Aerospike) получает сериализован и хранится в виде as_bytes на сервере. В этом случае у него есть [кодирование] (http://www.aerospike.com/docs/udf/api/bytes.html#encoding-type), в котором указано, что он был сериализован клиентом Java (AS_BYTES_JAVA). –

Смежные вопросы