我正在尝试在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');
但它不起作用。读取哈希值时为空。
答案 0 :(得分:4)
你误解了HSET
does in Redis。它不是用于保存整个Perl数据结构。它用于在Redis提供的 hash 数据结构中的特定键下保存单个值。这与普通的键/值存储操作不同,因为您可以在其上使用其他与Redis相关的操作。
你想要做的就是保存一个完整的Perl数据结构供以后使用,而无需在Redis中对其中的数据进行操作。
您可以使用常规SET
操作,但您需要serialise Perl数据结构。本质上,这意味着将Perl程序用于将这些值存储的内存转换为其他程序可以理解的字符数据。
用于在Perl中序列化和反序列化数据的常用工具是Storable或Sereal。后者更强大,但可能只对大型数据结构有意义。
如果您的数据只包含文本,那么任何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。