Лучший способ сохранить список объектов 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 в качестве кеша)


person user_ab    schedule 09.03.2015    source источник


Ответы (3)


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

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

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

person zenbeni    schedule 10.03.2015
comment
Что делать, если я хочу запрашивать объекты Java, хранящиеся в Redis, с оценками? - person vkrishna17; 03.01.2019

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

Студент HMSET: 1 имя "testOne" поток "информатика" http://redis.io/commands/hmset

чтобы получить все содержимое хэша, вызовите HGETALL student:1
вы также можете получить отдельные значения хэшей с помощью HGET
ПРИМЕР HGET student:1 name

person Lugg    schedule 09.03.2015
comment
На самом деле я хочу сохранить список объектов Java и извлекать их, когда это необходимо. Также я хотел свести к минимуму количество запросов для получения списка, поэтому я решил использовать строки json для хранения объектов, что позволяет мне использовать MGET и получать все ключи за один раз. Если я использую хэши для хранения своих java-объектов, я не могу получить все элементы списка java-объектов за один раз. - person user_ab; 10.03.2015
comment
Если вы хотите сохранить их неупорядоченными, вы можете использовать SET для хранения ключей хеша. Вы можете использовать сценарий LUA, чтобы получить их за один раз. Проблема с вашим подходом: - Обновление и удаление возможно только на стороне клиента. -›плохая многопользовательская поддержка - person Lugg; 18.03.2015

Вы можете легко сделать это с помощью 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. Довольно легко, правда?

person Nikita Koksharov    schedule 26.08.2016
comment
Если у ключа есть элементы, все элементы будут сохранены в памяти. - person sgtcortez; 14.12.2020