如何在Mojo :: Redis2中保存哈希值?

时间:2018-05-01 09:03:43

标签: perl redis mojolicious

我正在尝试在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 :(得分:4)

你误解了HSET does in Redis。它不是用于保存整个Perl数据结构。它用于在Redis提供的 hash 数据结构中的特定键下保存单个值。这与普通的键/值存储操作不同,因为您可以在其上使用其他与Redis相关的操作。

你想要做的就是保存一个完整的Perl数据结构供以后使用,而无需在Redis中对其中的数据进行操作。

您可以使用常规SET操作,但您需要serialise Perl数据结构。本质上,这意味着将Perl程序用于将这些值存储的内存转换为其他程序可以理解的字符数据。

用于在Perl中序列化和反序列化数据的常用工具是StorableSereal。后者更强大,但可能只对大型数据结构有意义。

如果您的数据只包含文本,那么任何JSON实现都会起作用,这将为您提供其他语言中能够读取和写入此数据的程序的额外好处,从而增加互操作性,但代价是需要更多内存。 / p>

完全实现这一点将超出本答案的范围,但实际上您需要做的是:

# 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