Redis: когда использовать хеши против ReJSON?
Я нахожусь в точке, где я могу хранить ресурс в Redis как хэш или как ReJSON. Мои конкретные данные в этом случае - это временные объекты данных, каждый из которых состоит из нескольких строковых и числовых полей. Пользователь вызовет процесс, который создает такую структуру, как:
{
'item_id': 'k0f8h3n5m6n1w9d0k0k1m1n4b6c8f8r7'
'amount': 3.00042
'timestamp': 1590440708,
'user1_status': 'pending',
'user_2_status': 'completed'
}
По сути, это очередь, обрабатываемая клиентом и пользователем (постановка в очередь обрабатывается отдельным потоком Redis), в которой каждый объект будет использоваться (как хэш или объект rejson) в среднем около 1 часа. В любой момент времени в очереди будут десятки тысяч этих объектов. Находясь в очереди, поля объекта (например,user1_status
а также user2_status
) будет обновляться несколько раз.
Как только каждый объект будет обработан, я мог бы либо оставить его в Redis, либо переместить каждый объект в базу данных холодного хранения для ведения журнала и удаления из Redis. Я не уверен, что мне следует это сделать или просто оставить.
Какой тип данных Redis (Hash или ReJSON) больше подходит для моей задачи? Каковы некоторые общие соображения при выборе между этими двумя типами?
Примечание: я понимаю, что если я хочу сделать что-то вроде этого:
{
'item_id': 'k0f8h3n5m6n1w9d0k0k1m1n4b6c8f8r7'
'amount': 3.00042
'timestamp': 1590440708,
'user1_status': 'pending',
'user_2_status': 'completed'
'parent': {
'item1': 1,
'item2': [1, 2, 3, 4]
'item3': {
'one': 1,
'two': 2
}
}
}
ReJSON, вероятно, будет правильным выбором, потому что вам нужно сгладить любой объект перед сохранением его в виде хэша. Ради этого вопроса, предположим, что мне не нужно этого делать, поскольку я уже знаю об этом.
1 ответ
Как вы уже упоминали, плоские и вложенные объекты - одна из основных причин использования RedisJSON. Другая причина заключается в том, что вы заботитесь о типах, специфичных для JSON, таких как числа и строки, поскольку значения хэша Redis всегда являются строками.
Наконец, если вам нужно запрашивать объекты по определенным критериям, RedisJSON поддерживает JSONPath для того, что может быть удобно.
Что касается производительности: хотя RedisJSON довольно эффективен, у него есть некоторые накладные расходы по сравнению с обычными хэшами Redis из-за необходимости хранить ключи JSON и сериализацию / десериализацию.
В итоге: если ваши данные структурированы или вложены и имеют определенную схему, вы можете эффективно использовать RedisJSON. Если это просто простые пары ключ / значение и вам не важны типы значений, подойдут простые хэши Redis.