如何在Mojo::Redis2中保存散列值?

How to save hash value in Mojo::Redis2?

我试图在 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');

但它不起作用。读取哈希值时为空。

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

看来您想做的是保存一个完整的 Perl 数据结构供以后使用,而不是从 Redis 中对其中的数据进行操作。

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

在 Perl 中序列化和反序列化数据的常用工具是 Storable or 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()freezingthawing 的同义词(转换为字符串或返回)机制。


您可能还想看一下缓存接口 CHI