2013-05-13 2 views
1

У меня есть 2D-массив для хранения в redis, и я вижу два решения: сохранение его как строки JSON или сохранение одного хэша на строку. Какой путь лучше?Храните 2D-массив в redis

+0

Можете ли вы конвейер написать, что redis читает/пишет? Это похоже на подходящий случай для бенчмаркинга. – sberry

+0

Да Я могу конвейерно читать/писать –

+0

«Лучше» зависит от ваших рисунков изогентов. Будет ли смысл читать или обновлять строку или столбец за раз? Будете ли вы всегда сохранять/читать всю таблицу сразу? Вы оптимизируете скорость передачи? Скорость сериализации? Размер хранилища? – Triptych

ответ

3

Я столкнулся с тем же вопросом при разработке приложения. Я выбрал сторону простоты. Я собираюсь предположить, что ваш 2d-массив данных представляет строку базы данных. Я бы JSON закодировал его и сохранил, используя SET. Это позволяет мне использовать MGET и MSET, когда я хочу обрабатывать несколько объектов, используя одну команду redis. Если эти данные будут обновлены в моей базе данных, ключом будет DEL. Для меня это проще, чем пытаться обновить хэши redis.

Хеши в redis имеют свои преимущества. Они, как правило, занимают меньше памяти из-за использования «ziplist» кодирования redis. Вы также можете избежать сериализации, что может быть довольно значительным для некоторых приложений.

Вот пример использования для хэша для меня. Предположим, я хочу найти имя пользователя с учетом идентификатора пользователя. Я бы сделал HGET user.usernames 1234. Это дало бы мне имя пользователя для идентификатора пользователя 1234. Если будет пропущен, я запрошу базу данных и настрою ее, и поскольку эти данные никогда не изменятся, я никогда не истекаю хэш. Это позволяет быстро искать общую часть данных, а не тянуть весь пользователь, неэтериализовывать и возвращать необходимое поле.

Для предполагаемой массивной таблицы поиска я использую алгоритм, как здесь: http://redis.io/topics/memory-optimization Он использует несколько хэшей, как если бы они были, и использует ziplist-кодирование для сохранения памяти.

Какой бы метод вы ни выбрали, просто оставайтесь последовательными.

+0

Спасибо за ссылку на документ redis, он заставил меня понять, что я могу использовать команды 'SETRANGE' и' GETRANGE', чтобы делать то, что мне нужно. 2D-массив, который мне нужно хранить, содержит только числа от 0 до 9, поэтому я могу сохранить уникальную строку, объединяя строки моего массива. Это так быстро. –

1

Как насчет использования Redis lists? Существует не поддержка списков списков, но вы можете либо сохранить одну строку в записи списка, либо создать список ключей, ссылающихся на другие списки.

1

Вы можете хранить каждый элемент в своем собственном ключе. Просто назовите ключи, чтобы имена содержали индексы элемента и, возможно, размеры массива.

Смежные вопросы