Хранение нескольких вложенных объектов в redis

Я хотел бы хранить несколько сложных json-данных в redis, но не уверен, как

Это моя структура json

"users":{

        "user01":{username:"ally", email:"[email protected]"},
         "user02":{username:"user2".....}
        },

 "trucks":{
         "truck01":{reg_no:"azn102", make:"subaru" .......},
         "truck02":{reg_no:"kcaher3".....}
       }

Я проверил Этот вопрос, который предоставляет способ хранения пользователей, но я хотел бы хранить пользователей (01, 02) внутри пользователей, а затем грузовиков (01, 02) в грузовиках, чтобы if я хочу получить пользователей, я могу просто сделать

hmget users

и аналогичный корпус для грузовиков

Позже я также хотел бы получить user01 у пользователей, но я смущен тем, как хранить такие данные в redis

Ответ 1

Вы можете использовать модуль ReJSON Redis и напрямую хранить объекты. http://rejson.io/

Ответ 2

Вы можете сохранить данные в redis, как в прикрепленных изображениях. В этих изображениях я создал структуру для вас

для пользовательских данных

ИЗМЕНИТЬ

Пример кода:

public void saveInRedis(Jedis jedis) throws JSONException{

        JSONObject jsonObject=new JSONObject();
        JSONObject jsonObject1=new JSONObject();
        JSONObject jsonObject2=new JSONObject();
        JSONObject jsonObject3=new JSONObject();


        jsonObject2.put("username", "ally");
        jsonObject2.put("email", "[email protected]");
        jsonObject3.put("username", "xyz");
        jsonObject3.put("email", "[email protected]");
        jsonObject1.put("user01", jsonObject2);
        jsonObject1.put("user02", jsonObject3);
        jsonObject.put("users", jsonObject1);


    // json is -- >  {"users":{"user02":{"email":"[email protected]","username":"xyz"},"user01":{"email":"[email protected]","username":"ally"}}}

        System.out.println("json is ---  >  "+jsonObject);

        JSONObject parse=new JSONObject(jsonObject.toString());
        JSONObject parseJson=parse.getJSONObject("users");
        JSONObject parseJson2=parseJson.getJSONObject("user02");
        JSONObject parseJson3=parseJson.getJSONObject("user01");

        Map<String, String> map=new HashMap<>();
        Map<String, String> map1=new HashMap<>();

        map.put("email", parseJson2.getString("email"));
        map.put("username", parseJson2.getString("username"));
        map1.put("email", parseJson3.getString("email"));
        map1.put("username", parseJson3.getString("username"));
        jedis.hmset("users:user01", map);
        jedis.hmset("users:user02", map1);



    }

вы можете делать hmget и hmgetAll по этим клавишам.

Ответ 3

Вариант 1

Я думаю, что если вы ищете независимый путь реализации, то есть ожидаются те же операции и результат в разных частях системы, написанных на разных языках программирования, тогда @Not_a_Golfer рекомендация лучше всего подходит для вашего дела.

Вариант 2

Однако, если вы случайно использовали только Java, и вы еще не используете Redis 4.0, я бы рекомендовал вам использовать Redisson как ваша библиотека на стороне клиента, чтобы сделать эту работу намного проще для себя.

Отказ от ответственности, я являюсь участником проекта Redisson, мое представление ниже предвзято. Он также написан в надежде, что он сможет связаться с теми, кто находится в этой конкретной ситуации.

Redisson - это библиотека Java на стороне клиента, которая позволяет вам управлять Redis как сетью данных в памяти. Естественно поддерживаются многомерные сложные объекты.

Redisson предоставляет типы данных Redis со стандартными интерфейсами Java, то есть Redis hash предоставляется как java.util.Map и java.util.concurrent.ConcurrentMap, поэтому в вашем случае это будет просто:

//lets imagine you have a builder that creates users 
User user01 = new User();
user01.setUsername("ally");
user01.setEmail("[email protected]");

User user02 = new User();
user02.setUsername("user2");
user02.setEmail("...");

//You get a Redis hash handler that works as a standard Java map
Map<String, User> users = redisson.getMap("users");
//This is how you put your data in Redis
//Redisson serialize the data into JSON format by default
users.put("user01", user01);
users.put("user02", user02);

//the same works for trucks
Truck truck01 = new Truck();
truck01.setRegNo("azn102");
truck01.setMake("subaru");

Truck truck02 = new Truck();
truck02.setRegNo("kcaher3");
truck02.setMake("...");

//The same as above
Map<String, Truck> trucks = redisson.getMap("trucks");
trucks.put("truck01", truck01);
trucks.put("truck02", truck02);

Получение ваших данных так же легко

User user01 = users.get("user01");
Truck truck02 = trucks.get("truck02");

В Redis вы получите два хэша, один из которых называется users, а другой - trucks, вы увидите, что строки JSON хранятся в отношении указанных имен полей в этих хэш-объектах.

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

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

Я бы сказал, что это довольно типичные случаи использования бизнеса.

Это действительно добавляет больше размеров и сложности структурам данных. Обычно вам придется разбить их на разные части:

  • Вам нужно, чтобы Truck и User отображались на другой хэш, чтобы избежать дублирования данных и согласованности;

  • Вам также необходимо будет управлять отдельным списком для каждого грузовика для хранения журнала использования.

В Redisson эти типы задач обрабатываются более естественно и без учета вышеупомянутых забот в виду.

Вы просто сделали бы, как обычно, в Java, как это:

  • Аннотировать класс User class и Truck с помощью аннотации @REntity и выбрать генератор идентификаторов или собственный идентификатор, это может быть значение поля.

  • Добавить поле List (usageLog) в класс Truck.

  • Добавить поле Truck (в настоящее время) в класс пользователя.

Это все, что вам нужно. Таким образом, использование не намного больше, чем вы обычно делали в Java:

//prepare the service and register your class.
RLiveObjectService service = redisson.getLiveObjectService();
service.registerClass(User.class);
service.registerClass(Truck.class);

Truck truck01 = new Truck();
truck01.setRegNo("azn102");
truck01.setMake("subaru");
//stores this record as a Redis hash
service.persist(truck01);

User user02 = new User();
user02.setUsername("user2");
user02.setEmail("...");
//stores this record as a Redis hash
service.persist(user02);

//assuming you have invoked setUsageLog elsewhere.
truck01.getUsageLog().add(user02);
user02.setCurrentlyDriving(truck01);

//under normal circumstance keeping a Redis hash registry is not necessary.
//the service object can be used for this type of look up.
//this is only for demonstration.
Map<String, Truck> trucks = redisson.getMap("trucks");
trucks.put("truck01", truck01);

Map<String, User> users = redisson.getMap("users");
users.put("user02", user02);

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

Как вы можете видеть, Redisson предоставляет решение, которое фиксирует все флажки и убирает головные боли во время процесса.

Для получения дополнительной информации о том, как Redisson обрабатывает многомерные сложные объекты в Redis посредством хеш-отображения объектов и ссылки на объекты:

Ответ 4

Я думаю, что лучше использовать HMSET для сохранения ключей.

Как и в вашем случае, вы можете создать HMSET с именем " пользователи" и " грузовики". В этом HMSET вы можете создавать ключи (например, поля), такие как " user01" и " user02". Поскольку эти ключи (например, "user01" , "user02" и т.д.) Могут хранить в нем значение, поэтому вы можете сохранить ваш отдых (т.е. {username:"ally", email:"[email protected]"}) объекта JSON в stringified.

Например: HMSET users user01 "{\"username\":\"ally\",\"email\":\"[email protected]\"}"

После этого вы можете получить список пользователей HGETALL (например, используя HGETALL users), Аналогичным образом, если вам нужно получить данные пользователя "user01" , вы можете использовать HGET, например HGET users user01. После получения значения "user01" вы можете проанализировать это значение и использовать в соответствии с вашим требованием.

Ответ 5

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