Ответ 1
Вы можете использовать модуль ReJSON Redis и напрямую хранить объекты. http://rejson.io/
Я хотел бы хранить несколько сложных 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
Вы можете использовать модуль ReJSON Redis и напрямую хранить объекты. http://rejson.io/
Вы можете сохранить данные в 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 по этим клавишам.
Вариант 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 посредством хеш-отображения объектов и ссылки на объекты:
Я думаю, что лучше использовать 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" вы можете проанализировать это значение и использовать в соответствии с вашим требованием.
Redis - это хранилище ключевых значений. Вы не можете связать две структуры данных с помощью Redis. Лучше использовать Mongo DB или Couch DB, которые представляют собой базы данных документов, предназначенные для связывания структур данных.