2015-03-09 2 views
6

Было бы здорово, если бы кто-нибудь мог предложить мне, что было бы лучшим способом сохранить список объектов java в Redis.Лучший способ сохранить список объектов java в Redis

В настоящее время я конвертирую java-объекты в строки json и сохраняю эти строки в Redis, и у меня есть набор в Redis, чтобы отслеживать все это.

Для например: -

SET student:1 '{"name":"testOne","stream":computer science}' 
SET student:2 '{"name":"testTwo","stream":electronics}' 
SADD students 1 
SADD students 2 

Так что, когда я когда-либо хочу получать список студентов, я сначала получить набор students, а затем перебрать его и получить строки JSON в этих ключах.

Просто интересно, есть ли другой лучший способ справиться с сценарием хранения списка объектов Java для Redis.

(я использую Redis в качестве кэш-памяти)

ответ

6

Если вам не нужно запрашивать свои объекты Java, хранящиеся в Redis (индексация, оценка ...), то вы можете просто сериализовать их в ByteArray с библиотекой (например, Kryo) и сохранить их в String в redis , Обратите внимание, что вы можете сериализовать целую коллекцию объектов Java в одной строке redis, просто запомните, какой класс он (тип коллекции + тип объекта), когда вы хотите десериализовать, например, вы можете определить умное имя ключа для этой цели.

JSON просто будет использовать больше места и будет более интенсивным в сети, чем другие двоичные форматы маршаллинга, если вам не нужны запросы или данные для чтения человеком в redis, тогда это нормально (и более результативно) для хранения двоичных данных в Redis.

Обратите внимание, что если вы используете библиотеку jedis (как вы отметили ее), у вас есть методы для Jedis, которые принимают bytearrays как параметры вместо строк Java, чтобы отправлять данные как C-String в Redis (без потери данных в процессе).

3

Redis больше, чем просто хранилище ключей значение. Вы можете использовать хэши для хранения структурированных данных в Redis

HMSET студент: 1 название «testOne» поток «компьютерные науки» http://redis.io/commands/hmset

, чтобы получить все содержимое студента хэш-вызов HGETALL: 1
вы также можете получить отдельные значения хэш с HGET
Пример HGET студент: 1 имя

+0

Я действительно ищу, чтобы хранить список объектов java и извлекать их когда когда-либо понадобилось. Также я хотел свести к минимуму количество запросов для извлечения списка, поэтому я решил использовать строки json для хранения объектов, которые позволяют мне использовать MGET и получать все ключи за один раз. Если я использую хеши для хранения объектов java, я не могу получить все элементы списка объектов Java за один раз. –

+0

Если вы хотите сохранить их не заказанными, вы можете использовать SET для хранения ключей хэша. Вы можете использовать LUA-скрипт для извлечения их за один раз. Проблема с вашим подходом: -Удалить и удалить только на клиентской стороне. -> плохая поддержка нескольких пользователей – Lugg

1

Вы можете легко сделать это с помощью Redisson. Это основанная на Redis платформа для Java, которая поддерживает множество популярных кодеков (Jackson JSON, Avro, Smile, CBOR, MsgPack, Kryo, FST, LZ4, Snappy и JDK Serialization) и режимы соединения Redis, такие как Cluster, Sentinel, AWS Elasticache.

Вот пример того, как хранить объект Java в список:

RList<SomeObject> list = redisson.getList("anyList"); 
list.add(new SomeObject(1)); 
list.add(new SomeObject(2)); 

RList интерфейс также реализует java.util.List интерфейс. Довольно легко, не так ли?