Как сохранить хеш-значение в Mojo :: Redis2? - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь сохранить хеш-значение в Mojo :: Redis2 . Пример значения хэша приведен ниже.

'user' => {
          'manage-detail' => {
                               '46' => 'edit',
                               '45' => 'list',
                               '44' => 'create',
                               '48' => 'delete',
                               '47' => 'search'
                             },
          'manage-procedure' => {
                                    '27' => 'search',
                                    '25' => 'list',
                                    '24' => 'create',
                                    '26' => 'edit'
                                  }
            }

Я сохраняю и читаю из Redis, используя код ниже.

$self->app->redis->hset('test', %HoH);
my %res = $self->app->redis->hget("test",'user');

Но это не работает. При чтении значение хеша пустое.

1 Ответ

0 голосов
/ 01 мая 2018

Вы неправильно понимаете, что HSET делает в Redis . Это не для сохранения всей структуры данных Perl. Он предназначен для сохранения одного значения под определенным ключом в структуре данных hash , которую предлагает Redis. Это отличается от обычной операции хранения ключей / значений, поскольку в этом случае вы можете использовать другие операции с хэшем Redis.

Похоже, вы хотите сохранить полную структуру данных Perl для дальнейшего использования, не работая с данными внутри нее из Redis.

Для этого вы можете использовать обычную операцию SET, но для этого вам необходимо serialise ваша структура данных Perl. По сути, это означает превращение памяти, которую ваша Perl-программа использует для хранения этих значений, в символьные данные, которые могут понять другие программы.

Обычными инструментами для сериализации и десериализации данных в Perl являются Storable или Sereal . Последний более мощный, но, вероятно, имеет смысл только для больших структур данных.

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

Предоставление полной реализации этого было бы за рамками этого ответа, но фактически вам нужно сделать следующее:

# to store
$self->app->redis->set('namespace:key', serealise(\%HoH));

# to retrieve
my $hashref_of_hashes = deserialise($self->app->redis->get('namespace:key'));

Где serealise() и deserealise() являются синонимами механизма замораживания и оттаивания (превращение в строку или обратно).


Возможно, вы захотите взглянуть на интерфейс кеша CHI .

...